This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


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

PATCH: BPs for libio & stdio.


Uli,

You had a problem with this patch when you saw it in weeks past.  The
problem I need to solve is that the bounds of a stdio FILE handle need
to include the _IO_FILE_plus member vtable.  The way the code is
written now, the assorted stdio open functions return only the
_IO_FILE portion, with vtable excluded, so later uses of the FILE*
that want vtable get bounds violations.  We need to return a
_IO_FILE_plus* to the user on open, so that when the user passes it
back to us it has the proper bounds for accessing vtable.  This should
be safe since _IO_FILE_plus and _IO_FILE always start at the same
address.

The patch below is minimally invasive, but uses more casts than
I'd like.  Changing _IO_{new_,old_,}file_init to accept
_IO_FILE_plus* will help.

Please advise.

Index: libio/iofdopen.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iofdopen.c,v
retrieving revision 1.14
diff -u -p -r1.14 iofdopen.c
--- iofdopen.c	2000/03/21 23:06:40	1.14
+++ iofdopen.c	2000/06/27 17:47:36
@@ -123,8 +123,8 @@ _IO_new_fdopen (fd, mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &_IO_wfile_jumps);
-  _IO_JUMPS (&new_f->fp) = &_IO_file_jumps;
-  _IO_file_init (&new_f->fp.file);
+  _IO_JUMPS (new_f) = &_IO_file_jumps;
+  _IO_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fp.vtable = NULL;
 #endif
@@ -140,7 +140,7 @@ _IO_new_fdopen (fd, mode)
     _IO_mask_flags (&new_f->fp.file, read_write,
 		    _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
 
-  return &new_f->fp.file;
+  return (_IO_FILE *) new_f;
 }
 
 strong_alias (_IO_new_fdopen, __new_fdopen)
Index: libio/iofopen.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iofopen.c,v
retrieving revision 1.14
diff -u -p -r1.14 iofopen.c
--- iofopen.c	2000/03/21 23:06:40	1.14
+++ iofopen.c	2000/06/27 17:47:36
@@ -49,13 +49,13 @@ _IO_new_fopen (filename, mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &_IO_wfile_jumps);
-  _IO_JUMPS (&new_f->fp) = &_IO_file_jumps;
-  _IO_file_init (&new_f->fp.file);
+  _IO_JUMPS (new_f) = &_IO_file_jumps;
+  _IO_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fp.vtable = NULL;
 #endif
-  if (_IO_file_fopen (&new_f->fp.file, filename, mode, 1) != NULL)
-    return (_IO_FILE *) &new_f->fp;
+  if (_IO_file_fopen ((_IO_FILE *) new_f, filename, mode, 1) != NULL)
+    return (_IO_FILE *) new_f;
   _IO_un_link (&new_f->fp.file);
   free (new_f);
   return NULL;
Index: libio/iofopen64.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iofopen64.c,v
retrieving revision 1.7
diff -u -p -r1.7 iofopen64.c
--- iofopen64.c	1999/06/16 21:32:32	1.7
+++ iofopen64.c	2000/06/27 17:47:36
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -49,13 +49,13 @@ _IO_fopen64 (filename, mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &_IO_wfile_jumps);
-  _IO_JUMPS (&new_f->fp) = &_IO_file_jumps;
-  _IO_file_init (&new_f->fp.file);
+  _IO_JUMPS (new_f) = &_IO_file_jumps;
+  _IO_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fp.vtable = NULL;
 #endif
-  if (_IO_file_fopen (&new_f->fp.file, filename, mode, 0) != NULL)
-    return &new_f->fp.file;
+  if (_IO_file_fopen ((_IO_FILE *) new_f, filename, mode, 0) != NULL)
+    return (_IO_FILE *) new_f;
   _IO_un_link (&new_f->fp.file);
   free (new_f);
   return NULL;
Index: libio/iofopncook.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iofopncook.c,v
retrieving revision 1.14
diff -u -p -r1.14 iofopncook.c
--- iofopncook.c	2000/05/21 15:39:12	1.14
+++ iofopncook.c	2000/06/27 17:47:36
@@ -181,7 +181,7 @@ _IO_fopencookie (cookie, mode, io_functi
 
   _IO_cookie_init (&new_f->cfile, read_write, cookie, io_functions);
 
-  return &new_f->cfile.__file;
+  return (_IO_FILE *) new_f;
 }
 
 versioned_symbol (libc, _IO_fopencookie, fopencookie, GLIBC_2_2);
Index: libio/iopopen.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iopopen.c,v
retrieving revision 1.21
diff -u -p -r1.21 iopopen.c
--- iopopen.c	2000/04/12 20:44:12	1.21
+++ iopopen.c	2000/06/27 17:47:36
@@ -203,13 +203,13 @@ _IO_new_popen (command, mode)
 #endif
   fp = &new_f->fpx.file.file;
   _IO_no_init (fp, 0, 0, &new_f->wd, &_IO_wproc_jumps);
-  _IO_JUMPS (fp) = &_IO_proc_jumps;
-  _IO_new_file_init (fp);
+  _IO_JUMPS (new_f) = &_IO_proc_jumps;
+  _IO_new_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fpx.file.vtable = NULL;
 #endif
   if (_IO_new_proc_open (fp, command, mode) != NULL)
-    return fp;
+    return (_IO_FILE *) new_f;
   _IO_un_link (fp);
   free (new_f);
   return NULL;
Index: libio/iovdprintf.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iovdprintf.c,v
retrieving revision 1.6
diff -u -p -r1.6 iovdprintf.c
--- iovdprintf.c	1999/06/16 21:49:49	1.6
+++ iovdprintf.c	2000/06/27 17:47:36
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -43,8 +43,8 @@ _IO_vdprintf (d, format, arg)
   tmpfil.file._lock = &lock;
 #endif
   _IO_no_init (&tmpfil.file, 0, 0, &wd, &_IO_wfile_jumps);
-  _IO_JUMPS (&tmpfil.file) = &_IO_file_jumps;
-  _IO_file_init (&tmpfil.file);
+  _IO_JUMPS (&tmpfil) = &_IO_file_jumps;
+  _IO_file_init ((_IO_FILE *) &tmpfil);
 #if  !_IO_UNIFIED_JUMPTABLES
   tmpfil.vtable = NULL;
 #endif
@@ -58,7 +58,7 @@ _IO_vdprintf (d, format, arg)
 		     _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING)
      | _IO_DELETE_DONT_CLOSE);
 
-  done = _IO_vfprintf (&tmpfil.file, format, arg);
+  done = _IO_vfprintf ((_IO_FILE *) &tmpfil, format, arg);
 
   _IO_FINISH (&tmpfil.file);
 
Index: libio/iovsprintf.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iovsprintf.c,v
retrieving revision 1.13
diff -u -p -r1.13 iovsprintf.c
--- iovsprintf.c	1999/06/16 21:49:51	1.13
+++ iovsprintf.c	2000/06/27 17:47:36
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -42,9 +42,9 @@ _IO_vsprintf (string, format, args)
   sf._sbf._f._lock = &lock;
 #endif
   _IO_no_init (&sf._sbf._f, 0, -1, NULL, NULL);
-  _IO_JUMPS (&sf._sbf._f) = &_IO_str_jumps;
-  _IO_str_init_static (&sf._sbf._f, string, -1, string);
-  ret = _IO_vfprintf (&sf._sbf._f, format, args);
+  _IO_JUMPS (&sf) = &_IO_str_jumps;
+  _IO_str_init_static ((_IO_FILE *) &sf, string, -1, string);
+  ret = _IO_vfprintf ((_IO_FILE *) &sf, format, args);
   _IO_putc_unlocked ('\0', &sf._sbf._f);
   return ret;
 }
Index: libio/iovsscanf.c
===================================================================
RCS file: /cvs/glibc/libc/libio/iovsscanf.c,v
retrieving revision 1.15
diff -u -p -r1.15 iovsscanf.c
--- iovsscanf.c	1999/06/16 21:49:52	1.15
+++ iovsscanf.c	2000/06/27 17:47:36
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -39,9 +39,9 @@ _IO_vsscanf (string, format, args)
   sf._sbf._f._lock = &lock;
 #endif
   _IO_no_init (&sf._sbf._f, 0, -1, NULL, NULL);
-  _IO_JUMPS (&sf._sbf._f) = &_IO_str_jumps;
+  _IO_JUMPS (&sf) = &_IO_str_jumps;
   _IO_str_init_static (&sf._sbf._f, (char*)string, 0, NULL);
-  ret = _IO_vfscanf (&sf._sbf._f, format, args, NULL);
+  ret = _IO_vfscanf ((_IO_FILE *) &sf, format, args, NULL);
   return ret;
 }
 
Index: libio/memstream.c
===================================================================
RCS file: /cvs/glibc/libc/libio/memstream.c,v
retrieving revision 1.11
diff -u -p -r1.11 memstream.c
--- memstream.c	1999/06/16 21:55:02	1.11
+++ memstream.c	2000/06/27 17:47:36
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -113,7 +113,7 @@ open_memstream (bufloc, sizeloc)
   if (buf == NULL)
     return NULL;
   _IO_no_init (&new_f->fp._sf._sbf._f, 0, 0, &new_f->wd, &_IO_wmem_jumps);
-  _IO_JUMPS (&new_f->fp._sf._sbf._f) = &_IO_mem_jumps;
+  _IO_JUMPS (new_f) = &_IO_mem_jumps;
   _IO_str_init_static (&new_f->fp._sf._sbf._f, buf, _IO_BUFSIZ, buf);
   new_f->fp._sf._sbf._f._flags &= ~_IO_USER_BUF;
   new_f->fp._sf._s._allocate_buffer = (_IO_alloc_type) malloc;
@@ -122,7 +122,7 @@ open_memstream (bufloc, sizeloc)
   new_f->fp.bufloc = bufloc;
   new_f->fp.sizeloc = sizeloc;
 
-  return &new_f->fp._sf._sbf._f;
+  return (_IO_FILE *) new_f;
 }
 
 
Index: libio/obprintf.c
===================================================================
RCS file: /cvs/glibc/libc/libio/obprintf.c,v
retrieving revision 1.8
diff -u -p -r1.8 obprintf.c
--- obprintf.c	2000/06/27 16:08:27	1.8
+++ obprintf.c	2000/06/27 17:47:36
@@ -136,7 +136,7 @@ _IO_obstack_vprintf (struct obstack *obs
 #endif
 
   _IO_no_init (&new_f.ofile.file.file, 0, -1, NULL, NULL);
-  _IO_JUMPS (&new_f.ofile.file) = &_IO_obstack_jumps;
+  _IO_JUMPS (&new_f) = &_IO_obstack_jumps;
   room = obstack_room (obstack);
   size = obstack_object_size (obstack) + room;
   if (size == 0)
@@ -167,7 +167,7 @@ _IO_obstack_vprintf (struct obstack *obs
 
   new_f.ofile.obstack = obstack;
 
-  result = _IO_vfprintf (&new_f.ofile.file.file, format, args);
+  result = _IO_vfprintf ((_IO_FILE *) &new_f, format, args);
 
   /* Shrink the buffer to the space we really currently need.  */
   obstack_blank_fast (obstack, (new_f.ofile.file.file._IO_write_ptr
Index: libio/oldiofdopen.c
===================================================================
RCS file: /cvs/glibc/libc/libio/oldiofdopen.c,v
retrieving revision 1.4
diff -u -p -r1.4 oldiofdopen.c
--- oldiofdopen.c	2000/03/27 05:18:31	1.4
+++ oldiofdopen.c	2000/06/27 17:47:36
@@ -113,8 +113,8 @@ _IO_old_fdopen (fd, mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_init (&new_f->fp.file, 0);
-  _IO_JUMPS (&new_f->fp) = &_IO_old_file_jumps;
-  _IO_old_file_init (&new_f->fp.file);
+  _IO_JUMPS (new_f) = &_IO_old_file_jumps;
+  _IO_old_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fp.vtable = NULL;
 #endif
@@ -130,7 +130,7 @@ _IO_old_fdopen (fd, mode)
     _IO_mask_flags (&new_f->fp.file, read_write,
 		    _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
 
-  return &new_f->fp.file;
+  return (_IO_FILE *) new_f;
 }
 
 strong_alias (_IO_old_fdopen, __old_fdopen)
Index: libio/oldiofopen.c
===================================================================
RCS file: /cvs/glibc/libc/libio/oldiofopen.c,v
retrieving revision 1.7
diff -u -p -r1.7 oldiofopen.c
--- oldiofopen.c	2000/03/27 05:18:31	1.7
+++ oldiofopen.c	2000/06/27 17:47:36
@@ -52,13 +52,13 @@ _IO_old_fopen (filename, mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_init (&new_f->fp.file, 0);
-  _IO_JUMPS (&new_f->fp.file) = &_IO_old_file_jumps;
-  _IO_old_file_init (&new_f->fp.file);
+  _IO_JUMPS (new_f) = &_IO_old_file_jumps;
+  _IO_old_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fp.vtable = NULL;
 #endif
-  if (_IO_old_file_fopen (&new_f->fp.file, filename, mode) != NULL)
-        return &new_f->fp.file;
+  if (_IO_old_file_fopen ((_IO_FILE *) new_f, filename, mode) != NULL)
+    return (_IO_FILE *) new_f;
   _IO_un_link (&new_f->fp.file);
   free (new_f);
   return NULL;
Index: libio/oldiopopen.c
===================================================================
RCS file: /cvs/glibc/libc/libio/oldiopopen.c,v
retrieving revision 1.5
diff -u -p -r1.5 oldiopopen.c
--- oldiopopen.c	2000/04/12 20:44:43	1.5
+++ oldiopopen.c	2000/06/27 17:47:36
@@ -203,8 +203,8 @@ _IO_old_popen (command, mode)
 #endif
   fp = &new_f->fpx.file.file;
   _IO_init (fp, 0);
-  _IO_JUMPS (fp) = &_IO_old_proc_jumps;
-  _IO_old_file_init (fp);
+  _IO_JUMPS (new_f) = &_IO_old_proc_jumps;
+  _IO_old_file_init ((_IO_FILE *) new_f);
 #if  !_IO_UNIFIED_JUMPTABLES
   new_f->fpx.file.vtable = NULL;
 #endif
Index: libio/oldstdfiles.c
===================================================================
RCS file: /cvs/glibc/libc/libio/oldstdfiles.c,v
retrieving revision 1.7
diff -u -p -r1.7 oldstdfiles.c
--- oldstdfiles.c	2000/03/27 05:18:31	1.7
+++ oldstdfiles.c	2000/06/27 17:47:37
@@ -48,8 +48,8 @@
 #endif
 
 DEF_STDFILE(_IO_stdin_, 0, 0, _IO_NO_WRITES);
-DEF_STDFILE(_IO_stdout_, 1, &_IO_stdin_.file, _IO_NO_READS);
-DEF_STDFILE(_IO_stderr_, 2, &_IO_stdout_.file,
+DEF_STDFILE(_IO_stdout_, 1, (_IO_FILE *) &_IO_stdin_, _IO_NO_READS);
+DEF_STDFILE(_IO_stderr_, 2, (_IO_FILE *) &_IO_stdout_,
 	    _IO_NO_READS+_IO_UNBUFFERED);
 
 #if defined __GNUC__ && __GNUC__ >= 2
@@ -81,9 +81,10 @@ _IO_check_libio ()
   if (&_IO_stdin_used == NULL)
     {
       /* We are using the old one. */
-      _IO_stdin = stdin = &_IO_stdin_.file;
-      _IO_stdout = stdout = &_IO_stdout_.file;
-      _IO_stderr = stderr = _IO_list_all = &_IO_stderr_.file;
+      _IO_stdin = stdin = (_IO_FILE *) &_IO_stdin_;
+      _IO_stdout = stdout = (_IO_FILE *) &_IO_stdout_;
+      _IO_stderr = stderr = (_IO_FILE *) &_IO_stderr_;
+      _IO_list_all = (_IO_FILE *) &_IO_stderr_;
       _IO_stdin->_vtable_offset = _IO_stdout->_vtable_offset =
 	_IO_stderr->_vtable_offset = stdin->_vtable_offset =
 	stdout->_vtable_offset = stderr->_vtable_offset =
Index: libio/stdfiles.c
===================================================================
RCS file: /cvs/glibc/libc/libio/stdfiles.c,v
retrieving revision 1.12
diff -u -p -r1.12 stdfiles.c
--- stdfiles.c	1999/06/16 21:57:43	1.12
+++ stdfiles.c	2000/06/27 17:47:37
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1994, 1996, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1994, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -50,8 +50,8 @@
 #endif
 
 DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES);
-DEF_STDFILE(_IO_2_1_stdout_, 1, &_IO_2_1_stdin_.file, _IO_NO_READS);
-DEF_STDFILE(_IO_2_1_stderr_, 2, &_IO_2_1_stdout_.file,
+DEF_STDFILE(_IO_2_1_stdout_, 1, (_IO_FILE *) &_IO_2_1_stdin_, _IO_NO_READS);
+DEF_STDFILE(_IO_2_1_stderr_, 2, (_IO_FILE *) &_IO_2_1_stdout_,
             _IO_NO_READS+_IO_UNBUFFERED);
 
-_IO_FILE *_IO_list_all = &_IO_2_1_stderr_.file;
+_IO_FILE *_IO_list_all = (_IO_FILE *) &_IO_2_1_stderr_;
Index: libio/stdio.c
===================================================================
RCS file: /cvs/glibc/libc/libio/stdio.c,v
retrieving revision 1.6
diff -u -p -r1.6 stdio.c
--- stdio.c	1997/12/14 21:38:42	1.6
+++ stdio.c	2000/06/27 17:47:37
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1994, 1996, 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -29,9 +29,9 @@
 #undef stdin
 #undef stdout
 #undef stderr
-FILE *stdin = &_IO_2_1_stdin_.file;
-FILE *stdout = &_IO_2_1_stdout_.file;
-FILE *stderr = &_IO_2_1_stderr_.file;
+FILE *stdin = (FILE *) &_IO_2_1_stdin_;
+FILE *stdout = (FILE *) &_IO_2_1_stdout_;
+FILE *stderr = (FILE *) &_IO_2_1_stderr_;
 
 #undef _IO_stdin
 #undef _IO_stdout
Index: libio/vsnprintf.c
===================================================================
RCS file: /cvs/glibc/libc/libio/vsnprintf.c,v
retrieving revision 1.12
diff -u -p -r1.12 vsnprintf.c
--- vsnprintf.c	1999/08/19 16:39:05	1.12
+++ vsnprintf.c	2000/06/27 17:47:37
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU IO Library.
 
    This library is free software; you can redistribute it and/or
@@ -123,7 +123,7 @@ _IO_vsnprintf (string, maxlen, format, a
     }
 
   _IO_no_init (&sf.f._sbf._f, 0, -1, NULL, NULL);
-  _IO_JUMPS (&sf.f._sbf._f) = &_IO_strn_jumps;
+  _IO_JUMPS (&sf) = &_IO_strn_jumps;
   string[0] = '\0';
   _IO_str_init_static (&sf.f._sbf._f, string, maxlen - 1, string);
   ret = _IO_vfprintf (&sf.f._sbf._f, format, args);
Index: stdio-common/vfprintf.c
===================================================================
RCS file: /cvs/glibc/libc/stdio-common/vfprintf.c,v
retrieving revision 1.82
diff -u -p -r1.82 vfprintf.c
--- vfprintf.c	2000/06/17 19:02:41	1.82
+++ vfprintf.c	2000/06/27 17:47:38
@@ -30,6 +30,8 @@
 #include "_i18n_itoa.h"
 #include <locale/localeinfo.h>
 
+#include <bp-checks.h>
+
 /* This code is shared between the standard stdio implementation found
    in GNU C library and the libio implementation originally found in
    GNU libg++.
@@ -310,7 +312,7 @@ vfprintf (FILE *s, const CHAR_T *format,
       do								      \
 	{								      \
 	  int offset;							      \
-	  void *ptr;							      \
+	  void *__unbounded ptr;					      \
 	  spec = (ChExpr);						      \
 	  offset = NOT_IN_JUMP_RANGE (spec) ? REF (form_unknown)	      \
 	    : table[CHAR_CLASS (spec)];					      \
@@ -323,7 +325,7 @@ vfprintf (FILE *s, const CHAR_T *format,
 # define JUMP(ChExpr, table)						      \
       do								      \
 	{								      \
-	  const void *ptr;						      \
+	  const void *__unbounded ptr;					      \
 	  spec = (ChExpr);						      \
 	  ptr = NOT_IN_JUMP_RANGE (spec) ? REF (form_unknown)		      \
 	    : table[CHAR_CLASS (spec)];					      \
@@ -1971,7 +1973,7 @@ buffered_vfprintf (register _IO_FILE *s,
 {
   CHAR_T buf[_IO_BUFSIZ];
   struct helper_file helper;
-  register _IO_FILE *hp = &helper._f.file;
+  register _IO_FILE *hp = (_IO_FILE *) &helper._f;
   int result, to_flush;
 
   /* Initialize helper.  */
@@ -1991,7 +1993,7 @@ buffered_vfprintf (register _IO_FILE *s,
   hp->_lock = &helper.lock;
   __libc_lock_init (*hp->_lock);
 #endif
-  _IO_JUMPS (hp) = (struct _IO_jump_t *) &_IO_helper_jumps;
+  _IO_JUMPS (&helper) = (struct _IO_jump_t *) &_IO_helper_jumps;
 
   /* Now print to helper instead.  */
   result = vfprintf (hp, format, args);

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