Skip to content

Commit

Permalink
libio: Fix fmemopen 'w' mode with provided buffer
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Adhemerval Zanella committed Jul 16, 2015
1 parent b42f8ca commit 787813b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 5 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2015-07-16 Adhemerval Zanella <adhemerval.zanella@linaro.org>

* 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 <raji@linux.vnet.ibm.com>

* sysdeps/powerpc/powerpc64/multiarch/Makefile: Add strstr-power7
Expand Down
6 changes: 3 additions & 3 deletions libio/fmemopen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -165,7 +165,6 @@ __fmemopen (void *buf, size_t len, const char *mode)
return NULL;
}
c->buffer[0] = '\0';
c->maxpos = 0;
}
else
{
Expand All @@ -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);
}


Expand Down
4 changes: 2 additions & 2 deletions stdio-common/tst-fmemopen2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 787813b

Please sign in to comment.