forked from pool/glibc
Andreas Schwab
2d58c46aab
- dl-show-auxv.patch: Fix output of LD_SHOW_AUXV=1 - s390-vx-vxe-hwcap.patch: S390: Mark vx and vxe as important hwcap - taisho-era-string.patch: ja_JP: Change the offset for Taisho gan-nen from 2 to 1 (BZ #24162) - malloc-tracing-hooks.patch: malloc: Set and reset all hooks for tracing (BZ #16573) - pldd-inf-loop.patch: elf: Fix pldd (BZ#18035) - malloc-large-bin-corruption-check.patch: malloc: Check for large bin list corruption when inserting unsorted chunk (BZ #24216) - wfile-sync-crash.patch: Fix crash in _IO_wfile_sync (BZ #20568) OBS-URL: https://build.opensuse.org/request/show/703415 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=527
101 lines
3.8 KiB
Diff
101 lines
3.8 KiB
Diff
2019-05-15 Andreas Schwab <schwab@suse.de>
|
|
|
|
[BZ #20568]
|
|
* libio/wfileops.c (_IO_wfile_sync): Correct last argument to
|
|
__codecvt_do_length.
|
|
* libio/Makefile (tests): Add tst-wfile-sync.
|
|
($(objpfx)tst-wfile-sync.out): Depend on $(gen-locales).
|
|
* libio/tst-wfile-sync.c: New file.
|
|
* libio/tst-wfile-sync.input: New file.
|
|
|
|
Index: glibc-2.29/libio/Makefile
|
|
===================================================================
|
|
--- glibc-2.29.orig/libio/Makefile
|
|
+++ glibc-2.29/libio/Makefile
|
|
@@ -65,7 +65,7 @@ tests = tst_swprintf tst_wprintf tst_sws
|
|
tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek \
|
|
tst-fwrite-error tst-ftell-partial-wide tst-ftell-active-handler \
|
|
tst-ftell-append tst-fputws tst-bz22415 tst-fgetc-after-eof \
|
|
- tst-sprintf-ub tst-sprintf-chk-ub
|
|
+ tst-sprintf-ub tst-sprintf-chk-ub tst-wfile-sync
|
|
|
|
tests-internal = tst-vtables tst-vtables-interposed tst-readline
|
|
|
|
@@ -212,6 +212,7 @@ $(objpfx)tst-ungetwc1.out: $(gen-locales
|
|
$(objpfx)tst-ungetwc2.out: $(gen-locales)
|
|
$(objpfx)tst-widetext.out: $(gen-locales)
|
|
$(objpfx)tst_wprintf2.out: $(gen-locales)
|
|
+$(objpfx)tst-wfile-sync.out: $(gen-locales)
|
|
endif
|
|
|
|
$(objpfx)test-freopen.out: test-freopen.sh $(objpfx)test-freopen
|
|
Index: glibc-2.29/libio/tst-wfile-sync.c
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ glibc-2.29/libio/tst-wfile-sync.c
|
|
@@ -0,0 +1,39 @@
|
|
+/* Test that _IO_wfile_sync does not crash (bug 20568).
|
|
+ Copyright (C) 2019 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
|
|
+ modify it under the terms of the GNU Lesser General Public
|
|
+ License as published by the Free Software Foundation; either
|
|
+ version 2.1 of the License, or (at your option) any later version.
|
|
+
|
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ Lesser General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU Lesser General Public
|
|
+ License along with the GNU C Library; if not, see
|
|
+ <http://www.gnu.org/licenses/>. */
|
|
+
|
|
+#include <locale.h>
|
|
+#include <stdio.h>
|
|
+#include <wchar.h>
|
|
+#include <support/check.h>
|
|
+#include <support/xunistd.h>
|
|
+
|
|
+static int
|
|
+do_test (void)
|
|
+{
|
|
+ TEST_VERIFY_EXIT (setlocale (LC_ALL, "de_DE.UTF-8") != NULL);
|
|
+ /* Fill the stdio buffer and advance the read pointer. */
|
|
+ TEST_VERIFY_EXIT (fgetwc (stdin) != WEOF);
|
|
+ /* This calls _IO_wfile_sync, it should not crash. */
|
|
+ TEST_VERIFY_EXIT (setvbuf (stdin, NULL, _IONBF, 0) == 0);
|
|
+ /* Verify that the external file offset has been synchronized. */
|
|
+ TEST_COMPARE (xlseek (0, 0, SEEK_CUR), 1);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+#include <support/test-driver.c>
|
|
Index: glibc-2.29/libio/tst-wfile-sync.input
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ glibc-2.29/libio/tst-wfile-sync.input
|
|
@@ -0,0 +1 @@
|
|
+This is a test of _IO_wfile_sync.
|
|
Index: glibc-2.29/libio/wfileops.c
|
|
===================================================================
|
|
--- glibc-2.29.orig/libio/wfileops.c
|
|
+++ glibc-2.29/libio/wfileops.c
|
|
@@ -508,11 +508,12 @@ _IO_wfile_sync (FILE *fp)
|
|
generate the wide characters up to the current reading
|
|
position. */
|
|
int nread;
|
|
-
|
|
+ size_t wnread = (fp->_wide_data->_IO_read_ptr
|
|
+ - fp->_wide_data->_IO_read_base);
|
|
fp->_wide_data->_IO_state = fp->_wide_data->_IO_last_state;
|
|
nread = (*cv->__codecvt_do_length) (cv, &fp->_wide_data->_IO_state,
|
|
fp->_IO_read_base,
|
|
- fp->_IO_read_end, delta);
|
|
+ fp->_IO_read_end, wnread);
|
|
fp->_IO_read_ptr = fp->_IO_read_base + nread;
|
|
delta = -(fp->_IO_read_end - fp->_IO_read_base - nread);
|
|
}
|