This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
libio compat fixes
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: libc-alpha at sources dot redhat dot com
- Date: Mon, 27 Oct 2003 16:32:47 -0500
- Subject: libio compat fixes
There's a comment in _IO_old_file_init that says that all _IO_FILE_plus's
(other than the three standard streams) are dynamically allocated and have
enough room for _mode. Unfortunately, they are dynamically allocated but do
_not_ have enough room for mode. They're allocated as:
struct LOCKED_file {
struct _IO_FILE_plus fp;
lock;
};
and _IO_FILE_plus changes based on whether we're compiling compatibility
code or not.
This patch adds an _IO_FILE_complete_plus which is big enough. This
prevents some out-of-bounds scribbling that was causing an old compiled
binary to crash for me.
It also calls _IO_old_init from _IO_old_popen instead of _IO_init. When
fopen and fdopen were changed in May this one slipped through.
Look OK?
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
2003-10-27 Daniel Jacobowitz <drow@mvista.com>
* libio/libioP.h [_IO_USE_OLD_IO_FILE]
(struct _IO_FILE_complete_plus): New type.
* libio/oldiofopen.c (_IO_old_fopen): Use _IO_FILE_complete_plus.
* libio/oldiofdopen.c (_IO_old_fdopen): Likewise.
* libio/oldiopopen.c (struct _IO_proc_file, _IO_old_popen): Likewise.
Call _IO_old_init instead of _IO_init.
--- glibc-2.3.2/libio/libioP.h.orig 2003-10-27 15:48:39.000000000 -0500
+++ glibc-2.3.2/libio/libioP.h 2003-10-27 16:04:03.000000000 -0500
@@ -348,6 +348,17 @@ struct _IO_FILE_plus
const struct _IO_jump_t *vtable;
};
+#ifdef _IO_USE_OLD_IO_FILE
+/* This structure is used by the compatibility code as if it were an
+ _IO_FILE_plus, but has enough space to initialize the _mode argument
+ of an _IO_FILE_complete. */
+struct _IO_FILE_complete_plus
+{
+ struct _IO_FILE_complete file;
+ const struct _IO_jump_t *vtable;
+};
+#endif
+
/* Special file type for fopencookie function. */
struct _IO_cookie_file
{
--- glibc-2.3.2/libio/oldiofdopen.c.orig 2003-10-27 15:57:58.000000000 -0500
+++ glibc-2.3.2/libio/oldiofdopen.c 2003-10-27 16:11:28.000000000 -0500
@@ -48,7 +48,7 @@ _IO_old_fdopen (fd, mode)
int posix_mode = 0;
struct locked_FILE
{
- struct _IO_FILE_plus fp;
+ struct _IO_FILE_complete_plus fp;
#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
#endif
@@ -89,7 +89,7 @@ _IO_old_fdopen (fd, mode)
Open a Stream on a File Descriptor says:
Although not explicitly required by POSIX.1, a good
- implementation of append ("a") mode would cause the
+ implementation of append ("a") model would cause the
O_APPEND flag to be set.
(Historical implementations [such as Solaris2] do a one-time
@@ -112,24 +112,24 @@ _IO_old_fdopen (fd, mode)
if (new_f == NULL)
return NULL;
#ifdef _IO_MTSAFE_IO
- new_f->fp.file._lock = &new_f->lock;
+ new_f->fp.file._file._lock = &new_f->lock;
#endif
- _IO_old_init (&new_f->fp.file, 0);
- _IO_JUMPS (&new_f->fp) = &_IO_old_file_jumps;
- _IO_old_file_init (&new_f->fp);
+ _IO_old_init (&new_f->fp.file._file, 0);
+ _IO_JUMPS ((struct _IO_FILE_plus *) &new_f->fp) = &_IO_old_file_jumps;
+ _IO_old_file_init ((struct _IO_FILE_plus *) &new_f->fp);
#if !_IO_UNIFIED_JUMPTABLES
new_f->fp.vtable = NULL;
#endif
- if (_IO_old_file_attach (&new_f->fp.file, fd) == NULL)
+ if (_IO_old_file_attach (&new_f->fp.file._file, fd) == NULL)
{
- INTUSE(_IO_un_link) (&new_f->fp);
+ INTUSE(_IO_un_link) ((struct _IO_FILE_plus *) &new_f->fp);
free (new_f);
return NULL;
}
- new_f->fp.file._flags &= ~_IO_DELETE_DONT_CLOSE;
+ new_f->fp.file._file._flags &= ~_IO_DELETE_DONT_CLOSE;
- new_f->fp.file._IO_file_flags =
- _IO_mask_flags (&new_f->fp.file, read_write,
+ new_f->fp.file._file._IO_file_flags =
+ _IO_mask_flags (&new_f->fp.file._file, read_write,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
return (_IO_FILE *) &new_f->fp;
--- glibc-2.3.2/libio/oldiofopen.c.orig 2003-10-27 15:57:55.000000000 -0500
+++ glibc-2.3.2/libio/oldiofopen.c 2003-10-27 16:11:26.000000000 -0500
@@ -42,7 +42,7 @@ _IO_old_fopen (filename, mode)
{
struct locked_FILE
{
- struct _IO_FILE_plus fp;
+ struct _IO_FILE_complete_plus fp;
#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
#endif
@@ -51,17 +51,17 @@ _IO_old_fopen (filename, mode)
if (new_f == NULL)
return NULL;
#ifdef _IO_MTSAFE_IO
- new_f->fp.file._lock = &new_f->lock;
+ new_f->fp.file._file._lock = &new_f->lock;
#endif
- _IO_old_init (&new_f->fp.file, 0);
- _IO_JUMPS (&new_f->fp) = &_IO_old_file_jumps;
- _IO_old_file_init (&new_f->fp);
+ _IO_old_init (&new_f->fp.file._file, 0);
+ _IO_JUMPS ((struct _IO_FILE_plus *) &new_f->fp) = &_IO_old_file_jumps;
+ _IO_old_file_init ((struct _IO_FILE_plus *) &new_f->fp);
#if !_IO_UNIFIED_JUMPTABLES
new_f->fp.vtable = NULL;
#endif
if (_IO_old_file_fopen ((_IO_FILE *) &new_f->fp, filename, mode) != NULL)
return (_IO_FILE *) &new_f->fp;
- INTUSE(_IO_un_link) (&new_f->fp);
+ INTUSE(_IO_un_link) ((struct _IO_FILE_plus *) &new_f->fp);
free (new_f);
return NULL;
}
--- glibc-2.3.2/libio/oldiopopen.c.orig 2003-10-27 14:11:13.000000000 -0500
+++ glibc-2.3.2/libio/oldiopopen.c 2003-10-27 16:24:10.000000000 -0500
@@ -100,7 +100,7 @@ extern int _IO_dup2 __P ((int fd, int fd
struct _IO_proc_file
{
- struct _IO_FILE_plus file;
+ struct _IO_FILE_complete_plus file;
/* Following fields must match those in class procbuf (procbuf.h) */
_IO_pid_t pid;
struct _IO_proc_file *next;
@@ -219,18 +219,18 @@ _IO_old_popen (command, mode)
if (new_f == NULL)
return NULL;
#ifdef _IO_MTSAFE_IO
- new_f->fpx.file.file._lock = &new_f->lock;
+ new_f->fpx.file.file._file._lock = &new_f->lock;
#endif
- fp = &new_f->fpx.file.file;
- INTUSE(_IO_init) (fp, 0);
- _IO_JUMPS (&new_f->fpx.file) = &_IO_old_proc_jumps;
- _IO_old_file_init (&new_f->fpx.file);
+ fp = &new_f->fpx.file.file._file;
+ _IO_old_init (fp, 0);
+ _IO_JUMPS ((struct _IO_FILE_plus *) &new_f->fpx.file) = &_IO_old_proc_jumps;
+ _IO_old_file_init ((struct _IO_FILE_plus *) &new_f->fpx.file);
#if !_IO_UNIFIED_JUMPTABLES
new_f->fpx.file.vtable = NULL;
#endif
if (_IO_old_proc_open (fp, command, mode) != NULL)
return fp;
- INTUSE(_IO_un_link) (&new_f->fpx.file);
+ INTUSE(_IO_un_link) ((struct _IO_FILE_plus *) &new_f->fpx.file);
free (new_f);
return NULL;
}