This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] libio: Fix fmemopen 'w' mode with provided buffer


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:
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;
     }



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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]