fwrite not 64-bit clean
Andreas Jaeger
aj@suse.de
Wed Mar 31 08:17:00 GMT 2004
We're currently hunting down a bug where fwrite does not work with
files larger than 2 GB.
The problem seems to be that fwrite calls _IO_new_file_xsputn which
calls new_do_write - and that one returns an int instead of
_IO_size_t. note that new_do_write returns already a variable of type
_IO_size_t - but the function is declared returning int.
I've just build and tested (make check) the appended patch on AMD64.
Ok to commit?
Andreas
2004-03-31 Andreas Jaeger <aj@suse.de>
* libio/fileops.c (_IO_new_do_write): Return _IO_size_t to make
64-bit clean.
(new_do_write): Likewise.
* libio/libioP.h: Change prototypes.
============================================================
Index: libio/fileops.c
--- libio/fileops.c 14 Jan 2004 18:40:03 -0000 1.102
+++ libio/fileops.c 31 Mar 2004 07:31:28 -0000
@@ -472,24 +472,24 @@ _IO_file_setbuf_mmap (fp, p, len)
return result;
}
-static int new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
+static _IO_size_t new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
/* Write TO_DO bytes from DATA to FP.
Then mark FP as having empty buffers. */
-int
+_IO_size_t
_IO_new_do_write (fp, data, to_do)
_IO_FILE *fp;
const char *data;
_IO_size_t to_do;
{
return (to_do == 0
- || (_IO_size_t) new_do_write (fp, data, to_do) == to_do) ? 0 : EOF;
+ || new_do_write (fp, data, to_do) == to_do) ? 0 : EOF;
}
INTDEF2(_IO_new_do_write, _IO_do_write)
static
-int
+_IO_size_t
new_do_write (fp, data, to_do)
_IO_FILE *fp;
const char *data;
============================================================
Index: libio/libioP.h
--- libio/libioP.h 14 Jan 2004 18:34:43 -0000 1.71
+++ libio/libioP.h 31 Mar 2004 07:31:28 -0000
@@ -476,8 +476,8 @@ extern const struct _IO_jump_t _IO_old_p
extern const struct _IO_jump_t _IO_str_jumps attribute_hidden;
extern const struct _IO_jump_t _IO_wstr_jumps attribute_hidden;
extern struct _IO_codecvt __libio_codecvt attribute_hidden;
-extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
-extern int _IO_new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
+extern _IO_size_t _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
+extern _IO_size_t _IO_new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
extern int _IO_old_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
extern int _IO_wdo_write __P ((_IO_FILE *, const wchar_t *, _IO_size_t));
extern int _IO_flush_all_lockp __P ((int));
@@ -740,7 +740,7 @@ extern void _IO_unsave_markers_internal
extern void _IO_switch_to_main_wget_area_internal __P ((_IO_FILE *));
extern int _IO_wdo_write_internal __P ((_IO_FILE *, const wchar_t *,
_IO_size_t));
-extern int _IO_do_write_internal __P ((_IO_FILE *, const char *, _IO_size_t));
+extern _IO_size_t _IO_do_write_internal __P ((_IO_FILE *, const char *, _IO_size_t));
extern _IO_ssize_t _IO_padn_internal (_IO_FILE *, int, _IO_ssize_t);
extern _IO_size_t _IO_getline_info_internal __P ((_IO_FILE *,char *,
_IO_size_t, int, int,
--
Andreas Jaeger, aj@suse.de, http://www.suse.de/~aj
SUSE Linux AG, Maxfeldstr. 5, 90409 Nürnberg, Germany
GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 188 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20040331/b6835a4e/attachment.sig>
More information about the Libc-alpha
mailing list