libio: Fix fmemopen 'w' mode with provided buffer

Message ID 55A799A3.6040202@linaro.org
State Committed
Delegated to: Adhemerval Zanella Netto
Headers

Commit Message

Adhemerval Zanella July 16, 2015, 11:46 a.m. UTC
  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): Typo.

--
  

Comments

Carlos O'Donell July 16, 2015, 5:30 p.m. UTC | #1
On 07/16/2015 07:46 AM, Adhemerval Zanella wrote:
> 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): Typo.

OK for 2.22

c.
  

Patch

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..ecd7824 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;
     }