diff options
author | Florian Weimer <fweimer@redhat.com> | 2018-06-01 10:41:03 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2018-06-01 10:41:03 +0200 |
commit | 4e8a6346cd3da2d88bbad745a1769260d36f2783 (patch) | |
tree | dcf9deeedd5263469fa425574c0ac671a8b43c2a /libio/strfile.h | |
parent | 50d004c91c942221b862a4a13a4b5f78cfb0d595 (diff) | |
download | glibc-4e8a6346cd3da2d88bbad745a1769260d36f2783.zip glibc-4e8a6346cd3da2d88bbad745a1769260d36f2783.tar.gz glibc-4e8a6346cd3da2d88bbad745a1769260d36f2783.tar.bz2 |
libio: Avoid _allocate_buffer, _free_buffer function pointers [BZ #23236]
These unmangled function pointers reside on the heap and could
be targeted by exploit writers, effectively bypassing libio vtable
validation. Instead, we ignore these pointers and always call
malloc or free.
In theory, this is a backwards-incompatible change, but using the
global heap instead of the user-supplied callback functions should
have little application impact. (The old libstdc++ implementation
exposed this functionality via a public, undocumented constructor
in its strstreambuf class.)
Diffstat (limited to 'libio/strfile.h')
-rw-r--r-- | libio/strfile.h | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/libio/strfile.h b/libio/strfile.h index 46ac818..75caac2 100644 --- a/libio/strfile.h +++ b/libio/strfile.h @@ -32,8 +32,11 @@ typedef void (*_IO_free_type) (void*); struct _IO_str_fields { - _IO_alloc_type _allocate_buffer; - _IO_free_type _free_buffer; + /* These members are preserved for ABI compatibility. The glibc + implementation always calls malloc/free for user buffers if + _IO_USER_BUF or _IO_FLAGS2_USER_WBUF are not set. */ + _IO_alloc_type _allocate_buffer_unused; + _IO_free_type _free_buffer_unused; }; /* This is needed for the Irix6 N32 ABI, which has a 64 bit off_t type, @@ -53,10 +56,6 @@ typedef struct _IO_strfile_ struct _IO_str_fields _s; } _IO_strfile; -/* dynamic: set when the array object is allocated (or reallocated) as - necessary to hold a character sequence that can change in length. */ -#define _IO_STR_DYNAMIC(FP) ((FP)->_s._allocate_buffer != (_IO_alloc_type)0) - /* frozen: set when the program has requested that the array object not be altered, reallocated, or freed. */ #define _IO_STR_FROZEN(FP) ((FP)->_f._flags & _IO_USER_BUF) |