This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

fwrite not 64-bit clean


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

Attachment: pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]