This is the mail archive of the
libc-hacker@cygnus.com
mailing list for the glibc project.
Re: libio backward compat bug? involving setmntent()
- To: hjl@lucon.org (H.J. Lu)
- Subject: Re: libio backward compat bug? involving setmntent()
- From: Zack Weinberg <zack@rabi.columbia.edu>
- Date: Tue, 13 Apr 1999 10:59:15 -0400
- cc: libc-hacker@cygnus.com
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)