libio: Fix fmemopen 'w' mode with provided buffer

Message ID mo8691$1se$1@ger.gmane.org
State Committed
Headers

Commit Message

Stefan Liebler July 16, 2015, 11:58 a.m. UTC
  As already mentioned in 
https://www.sourceware.org/ml/libc-alpha/2015-07/msg00455.html, the 
testcase is now passing on s390-32.

Can you change this printf in case of a failure, too:


On 07/16/2015 01:46 PM, 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.
>
> --
>
> 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;
>       }
>
  

Patch

diff --git a/stdio-common/tst-fmemopen2.c b/stdio-common/tst-fmemopen2.c
index 16dd3ad..7e30241 100644
--- a/stdio-common/tst-fmemopen2.c
+++ b/stdio-common/tst-fmemopen2.c
@@ -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;
      }