libio: Free backup area when it not required (BZ#22415)
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 22 Nov 2017 20:33:15 +0000 (18:33 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 12 Dec 2017 19:29:54 +0000 (17:29 -0200)
commitcc683f7ed4a5bd8ce2c9b715581de727b04eb599
treecfd96d62028f35e6477284320fcdb16ce5e061b9
parentc80acdc3254cd4801c7605cf468ec137d9ee2d83
libio: Free backup area when it not required (BZ#22415)

Some libio operations fail to correctly free the backup area (created
by _IO_{w}default_pbackfail on unget{w}c) resulting in either invalid
buffer free operations or memory leaks.

For instance, on the example provided by BZ#22415 a following
fputc after a fseek to rewind the stream issues an invalid free on
the buffer.  It is because although _IO_file_overflow correctly
(from fputc) correctly calls _IO_free_backup_area, the
_IO_new_file_seekoff (called by fseek) updates the FILE internal
pointers without first free the backup area (resulting in invalid
values in the internal pointers).

The wide version also shows an issue, but instead of accessing invalid
pointers it leaks the backup memory on fseek/fputwc operation.

Checked on x86_64-linux-gnu and i686-linux-gnu.

* libio/Makefile (tests): Add tst-bz22415.
(tst-bz22415-ENV): New rule.
(generated): Add tst-bz22415.mtrace and tst-bz22415.check.
(tests-special): Add tst-bz22415-mem.out.
($(objpfx)tst-bz22415-mem.out): New rule.
* libio/fileops.c (_IO_new_file_seekoff): Call _IO_free_backup_area
in case of a successful seek operation.
* libio/wfileops.c (_IO_wfile_seekoff): Likewise.
(_IO_wfile_overflow): Call _IO_free_wbackup_area in case a write
buffer is required.
* libio/tst-bz22415.c: New test.
ChangeLog
libio/Makefile
libio/fileops.c
libio/tst-bz22415.c [new file with mode: 0644]
libio/wfileops.c