This is the mail archive of the libc-alpha@sourceware.org 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]

[RFC][PATCH]BZ#2337 Fix for spurious free of user buffer on fclose with wide char orientation.


RFC regarding bugzilla 2337 -libio in wide mode deallocates user
supplied buffer:

http://sources.redhat.com/bugzilla/show_bug.cgi?id=2337#c4

Please comment on the attached patch, which is also included in the
bugzilla.

I have an orthogonal concern.  I'm not sure the _IO_wsetb() function
should be setting/unsetting the _IO_USER_BUF flag since wide-char
oriented IO operations don't make use of the user supplied buffer
(provided via setvbuf).

Ryan S. Arnold
IBM Linux Technology Center
2006-10-06  Ryan S. Arnold  <rsa@us.ibm.com>

	[BZ #2337]
	* libio/libioP.h: Provided _IO_wfile_finish() and
	_IO_wfile_finish_internal() function protoypes.
	* libio/wfileops.c (_IO_wfile_finish, _IO_wfile_finish_internal): New
	function definitions invoke _IO_wdefault_finish().
	(_IO_wfile_jumps): Updated vtable entry to use _IO_wfile_finish to fix
	spurious deallocation of user supplied buffer _IO_FILE->_IO_buf_base.
	* libio/Versions: added _IO_wfile_finish.

--- glibc/libio/libioP.h	2006-09-12 09:34:35.000000000 -0500
+++ glibc-new/libio/libioP.h	2006-10-05 23:45:18.445759153 -0500
@@ -612,6 +612,7 @@
 extern wint_t _IO_wfile_overflow (_IO_FILE *, wint_t) __THROW;
 extern _IO_off64_t _IO_wfile_seekoff (_IO_FILE *, _IO_off64_t, int, int)
      __THROW;
+extern void _IO_wfile_finish (_IO_FILE *, int) __THROW;
 
 /* Jumptable functions for proc_files. */
 extern _IO_FILE* _IO_proc_open (_IO_FILE *, const char *, const char *)
@@ -706,6 +707,7 @@
 					    _IO_size_t) __THROW;
 extern _IO_size_t _IO_file_xsgetn_internal (_IO_FILE *, void *, _IO_size_t)
      __THROW;
+extern void _IO_wfile_finish_internal (_IO_FILE *, int) __THROW;
 extern int _IO_file_stat_internal (_IO_FILE *, void *) __THROW;
 extern int _IO_file_close_internal (_IO_FILE *) __THROW;
 extern int _IO_file_close_it_internal (_IO_FILE *) __THROW;
--- glibc/libio/wfileops.c	2006-09-12 09:34:35.000000000 -0500
+++ glibc-new/libio/wfileops.c	2006-10-05 23:47:59.267370817 -0500
@@ -853,11 +853,25 @@
 }
 INTDEF(_IO_wfile_xsputn)
 
+void
+_IO_wfile_finish (fp, dummy)
+     _IO_FILE *fp;
+     int dummy;
+{
+  if (_IO_file_is_open (fp))
+    {
+      _IO_do_flush (fp);
+      if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
+	_IO_SYSCLOSE (fp);
+    }
+  INTUSE(_IO_wdefault_finish) (fp, 0);
+}
+INTDEF(_IO_wfile_finish)
 
 const struct _IO_jump_t _IO_wfile_jumps =
 {
   JUMP_INIT_DUMMY,
-  JUMP_INIT(finish, _IO_new_file_finish),
+  JUMP_INIT(finish, INTUSE(_IO_wfile_finish)),
   JUMP_INIT(overflow, (_IO_overflow_t) INTUSE(_IO_wfile_overflow)),
   JUMP_INIT(underflow, (_IO_underflow_t) INTUSE(_IO_wfile_underflow)),
   JUMP_INIT(uflow, (_IO_underflow_t) INTUSE(_IO_wdefault_uflow)),
@@ -883,7 +897,7 @@
 const struct _IO_jump_t _IO_wfile_jumps_mmap =
 {
   JUMP_INIT_DUMMY,
-  JUMP_INIT(finish, _IO_new_file_finish),
+  JUMP_INIT(finish, INTUSE(_IO_wfile_finish)),
   JUMP_INIT(overflow, (_IO_overflow_t) INTUSE(_IO_wfile_overflow)),
   JUMP_INIT(underflow, (_IO_underflow_t) _IO_wfile_underflow_mmap),
   JUMP_INIT(uflow, (_IO_underflow_t) INTUSE(_IO_wdefault_uflow)),
@@ -907,7 +921,7 @@
 const struct _IO_jump_t _IO_wfile_jumps_maybe_mmap =
 {
   JUMP_INIT_DUMMY,
-  JUMP_INIT(finish, _IO_new_file_finish),
+  JUMP_INIT(finish, INTUSE(_IO_wfile_finish)),
   JUMP_INIT(overflow, (_IO_overflow_t) INTUSE(_IO_wfile_overflow)),
   JUMP_INIT(underflow, (_IO_underflow_t) _IO_wfile_underflow_maybe_mmap),
   JUMP_INIT(uflow, (_IO_underflow_t) INTUSE(_IO_wdefault_uflow)),
--- glibc/libio/Versions	2006-09-12 09:34:35.000000000 -0500
+++ glibc-new/libio/Versions	2006-10-06 00:25:18.465309685 -0500
@@ -112,7 +112,7 @@
     _IO_wdefault_finish; _IO_wdefault_pbackfail; _IO_wdefault_setbuf;
     _IO_wdefault_uflow; _IO_wdefault_xsgetn; _IO_wdefault_xsputn;
     _IO_wdoallocbuf; _IO_wmarker_delta; _IO_wsetb; __woverflow; __wuflow;
-    __wunderflow;
+    __wunderflow; _IO_wfile_finish;
 
     # LinuxThreads uses this protected interface
     _IO_iter_begin; _IO_iter_end; _IO_iter_next; _IO_iter_file;

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