From 787813b14425c9c2e699a90e27eee1cfdfe73ec2 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 15 Jul 2015 16:15:47 -0300 Subject: [PATCH] libio: Fix fmemopen 'w' mode with provided buffer If 'w' mode is used with a provided buffer the fmemopen will try to find the first null byte to set as maximum internal stream size. It should be done only for append mode ('a'). Kudos for Stefan Liebler for finding this error on s390-32. * libio/fmemopen.c (__fmemopen): Fix 'w' openmode with provided buffer. * stdio-common/tst-fmemopen2.c (do_test_with_buffer): Fix typo and fail output information. --- ChangeLog | 7 +++++++ libio/fmemopen.c | 6 +++--- stdio-common/tst-fmemopen2.c | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 809fe18..17f3377 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2015-07-16 Adhemerval Zanella + + * libio/fmemopen.c (__fmemopen): Fix 'w' openmode with provided + buffer. + * stdio-common/tst-fmemopen2.c (do_test_with_buffer): Fix typo and + fail output information. + 2015-07-16 Rajalakshmi Srinivasaraghavan * sysdeps/powerpc/powerpc64/multiarch/Makefile: Add strstr-power7 diff --git a/libio/fmemopen.c b/libio/fmemopen.c index e6e6a49..3ab3e8d 100644 --- a/libio/fmemopen.c +++ b/libio/fmemopen.c @@ -150,7 +150,7 @@ __fmemopen (void *buf, size_t len, const char *mode) cookie_io_functions_t iof; fmemopen_cookie_t *c; - c = (fmemopen_cookie_t *) malloc (sizeof (fmemopen_cookie_t)); + c = (fmemopen_cookie_t *) calloc (sizeof (fmemopen_cookie_t), 1); if (c == NULL) return NULL; @@ -165,7 +165,6 @@ __fmemopen (void *buf, size_t len, const char *mode) return NULL; } c->buffer[0] = '\0'; - c->maxpos = 0; } else { @@ -182,7 +181,8 @@ __fmemopen (void *buf, size_t len, const char *mode) if (mode[0] == 'w' && mode[1] == '+') c->buffer[0] = '\0'; - c->maxpos = strnlen (c->buffer, len); + if (mode[0] == 'a') + c->maxpos = strnlen (c->buffer, len); } diff --git a/stdio-common/tst-fmemopen2.c b/stdio-common/tst-fmemopen2.c index 16dd3ad..a2c05c1 100644 --- a/stdio-common/tst-fmemopen2.c +++ b/stdio-common/tst-fmemopen2.c @@ -34,7 +34,7 @@ do_test_with_buffer (void) FILE *fp = fmemopen (buf, nbuf, "w"); if (fp == NULL) { - printf ("FAIL: fmemopen failedi (%s)\n", __FUNCTION__); + printf ("FAIL: fmemopen failed (%s)\n", __FUNCTION__); return 1; } @@ -69,7 +69,7 @@ do_test_with_buffer (void) if (o != nstr) { printf ("FAIL: third ftello returned %jd, expected %zu\n", - (intmax_t)o, nbuf); + (intmax_t)o, nstr); result = 1; } -- 2.7.4