This is the mail archive of the libc-hacker@cygnus.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]

Re: libio backward compat bug? involving setmntent()


On Tue, 13 Apr 1999 07:48:56 -0700 (PDT), H.J. Lu wrote:
>> 
>> 
>> The appended slightly-out-of-spec code segfaults when compiled on a
>> libc 2.0 system and run on a libc 2.1 system.  The problem is that
>> setmntent() returns a new FILE*, but fclose is bound to the old
>> fclose.
>> 
>> Do we want to support this, and if so, how?  (Have old fclose
>> recognize when it's handed a new FILE* and call _IO_new_fclose?)
>> 
>
>Thanks for the bug report. I will fix it.

Try this patch for size.

zw

1999-04-13 10:52 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* libio/libio.h: Define _IO_NEW_MAGIC.
	* libio/libioP.h: Define IS_NEW_FILE.  In debugging
	CHECK_FILE, permit either _IO_MAGIC or _IO_NEW_MAGIC.  If not
	_IO_USE_OLD_IO_FILE, use _IO_NEW_MAGIC in FILEBUF_LITERAL.
	* libio/oldiofclose.c (_IO_old_fclose): If IS_NEW_FILE(fp),
	hand off to _IO_new_fclose.

	* libio/fileops.c (_IO_file_close_it): Use _IO_NEW_MAGIC.
	* libio/genops.c (_IO_init): Likewise.
	* libio/oldiofdopen.c (_IO_old_fdopen): After calling
	_IO_init, reset magic to _IO_MAGIC.
	* libio/oldiofopen.c (_IO_old_fopen): Likewise.
	* libio/oldiopopen.c (_IO_old_popen): Likewise.

===================================================================
Index: libio/fileops.c
--- libio/fileops.c	1998/11/04 22:58:44	1.41
+++ libio/fileops.c	1999/04/13 14:51:42
@@ -141,7 +141,7 @@
   _IO_setp (fp, NULL, NULL);
 
   _IO_un_link (fp);
-  fp->_flags = _IO_MAGIC|CLOSED_FILEBUF_FLAGS;
+  fp->_flags = _IO_NEW_MAGIC|CLOSED_FILEBUF_FLAGS;
   fp->_fileno = EOF;
   fp->_offset = _IO_pos_BAD;
 
===================================================================
Index: libio/genops.c
--- libio/genops.c	1999/01/28 13:53:05	1.31
+++ libio/genops.c	1999/04/13 14:51:42
@@ -533,7 +533,7 @@
      _IO_FILE *fp;
      int flags;
 {
-  fp->_flags = _IO_MAGIC|flags;
+  fp->_flags = _IO_NEW_MAGIC|flags;
   fp->_IO_buf_base = NULL;
   fp->_IO_buf_end = NULL;
   fp->_IO_read_base = NULL;
===================================================================
Index: libio/oldiofclose.c
--- libio/oldiofclose.c	1999/03/26 18:23:20	1.4
+++ libio/oldiofclose.c	1999/04/13 14:51:42
@@ -35,6 +35,8 @@
 {
   int status;
 
+  if (IS_NEW_FILE (fp))
+    return _IO_new_fclose (fp);
   CHECK_FILE(fp, EOF);
 
   _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
===================================================================
Index: libio/oldiofdopen.c
--- libio/oldiofdopen.c	1999/03/26 18:23:21	1.3
+++ libio/oldiofdopen.c	1999/04/13 14:51:42
@@ -110,6 +110,7 @@
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_init (&new_f->fp.file, 0);
+  new_f->fp.file._flags = _IO_MAGIC;  /* Reset magic to old version. */
   _IO_JUMPS (&new_f->fp) = &_IO_old_file_jumps;
   _IO_old_file_init (&new_f->fp.file);
 #if  !_IO_UNIFIED_JUMPTABLES
===================================================================
Index: libio/oldiofopen.c
--- libio/oldiofopen.c	1999/03/26 18:23:22	1.4
+++ libio/oldiofopen.c	1999/04/13 14:51:42
@@ -49,6 +49,7 @@
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_init (&new_f->fp.file, 0);
+  new_f->fp.file._flags = _IO_MAGIC;  /* Reset magic to old version. */
   _IO_JUMPS (&new_f->fp.file) = &_IO_old_file_jumps;
   _IO_old_file_init (&new_f->fp.file);
 #if  !_IO_UNIFIED_JUMPTABLES
===================================================================
Index: libio/oldiopopen.c
--- libio/oldiopopen.c	1998/11/23 09:32:20	1.1
+++ libio/oldiopopen.c	1999/04/13 14:51:42
@@ -199,6 +199,7 @@
 #endif
   fp = &new_f->fpx.file.file;
   _IO_init (fp, 0);
+  fp->_flags = _IO_MAGIC;  /* Reset magic to old version. */
   _IO_JUMPS (fp) = &_IO_old_proc_jumps;
   _IO_old_file_init (fp);
 #if  !_IO_UNIFIED_JUMPTABLES
===================================================================
Index: libio/libio.h
--- libio/libio.h	1998/12/04 20:54:10	1.33
+++ libio/libio.h	1999/04/13 14:51:43
@@ -112,7 +112,8 @@
    Note: The magic numbers must all be negative if stdio
    emulation is desired. */
 
-#define _IO_MAGIC 0xFBAD0000 /* Magic number */
+#define _IO_NEW_MAGIC 0xFBAE0000 /* Magic number for libc 2.1 libio */
+#define _IO_MAGIC 0xFBAD0000 /* Magic number for libc 2.0 libio */
 #define _OLD_STDIO_MAGIC 0xFABC0000 /* Emulate old stdio. */
 #define _IO_MAGIC_MASK 0xFFFF0000
 #define _IO_USER_BUF 1 /* User owns buffer; don't delete it on close. */
===================================================================
Index: libio/libioP.h
--- libio/libioP.h	1998/11/23 09:31:48	1.33
+++ libio/libioP.h	1999/04/13 14:59:00
@@ -579,7 +579,7 @@
 	   0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock }
 # else
 #  define FILEBUF_LITERAL(CHAIN, FLAGS, FD) \
-       { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
+       { _IO_NEW_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \
 	   0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD }
 # endif
@@ -590,7 +590,7 @@
 	   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, 0, _IO_pos_BAD }
 # else
 #  define FILEBUF_LITERAL(CHAIN, FLAGS, FD) \
-       { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
+       { _IO_NEW_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \
 	   0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD }
 # endif
@@ -646,9 +646,13 @@
 #ifdef IO_DEBUG
 # define CHECK_FILE(FILE, RET) \
 	if ((FILE) == NULL) { MAYBE_SET_EINVAL; return RET; } \
-	else { COERCE_FILE(FILE); \
-	       if (((FILE)->_IO_file_flags & _IO_MAGIC_MASK) != _IO_MAGIC) \
+	else { int __magic; \
+	       COERCE_FILE(FILE); \
+	       __magic = (FILE)->_IO_file_flags & _IO_MAGIC_MASK; \
+	       if (__magic != _IO_MAGIC && __magic != _IO_NEW_MAGIC) \
 	  { MAYBE_SET_EINVAL; return RET; }}
 #else
 # define CHECK_FILE(FILE, RET) COERCE_FILE (FILE)
 #endif
+
+#define IS_NEW_FILE(FILE) (((FILE)->_IO_file_flags & _IO_MAGIC_MASK) == _IO_NEW_MAGIC)


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