This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[RFC][PATCH]BZ#2337 Fix for spurious free of user buffer on fclose with wide char orientation.
- From: "Ryan S. Arnold" <rsa at us dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Fri, 06 Oct 2006 10:26:42 -0500
- Subject: [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;