This is the mail archive of the glibc-cvs@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]

GNU C Library master sources branch master updated. glibc-2.28.9000-168-g0b727ed


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  0b727ed4d605d9318cb0d323c88abb0d5a441a9b (commit)
      from  d0e91e8c4ef77997c940538eaa752799c9dda2d3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=0b727ed4d605d9318cb0d323c88abb0d5a441a9b

commit 0b727ed4d605d9318cb0d323c88abb0d5a441a9b
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Thu Jul 13 16:43:24 2017 -0300

    libio: Flush stream at freopen (BZ#21037)
    
    As POSIX states [1] a freopen call should first flush the stream as if by a
    call fflush.  C99 (n1256) and C11 (n1570) only states the function should
    first close any file associated with the specific stream.  Although current
    implementation only follow C specification, current BSD and other libc
    implementation (musl) are in sync with POSIX and fflush the stream.
    
    This patch change freopen{64} to fflush the stream before actually reopening
    it (or returning if the stream does not support reopen).  It also changes the
    Linux implementation to avoid a dynamic allocation on 'fd_to_filename'.
    
    Checked on x86_64-linux-gnu.
    
    	[BZ #21037]
    	* libio/Makefile (tests): Add tst-memstream4 and tst-wmemstream4.
    	* libio/freopen.c (freopen): Sync stream before reopen and adjust to
    	new fd_to_filename interface.
    	* libio/freopen64.c (freopen64): Likewise.
    	* libio/tst-memstream.h: New file.
    	* libio/tst-memstream4.c: Likewise.
    	* libio/tst-wmemstream4.c: Likewise.
    	* sysdeps/generic/fd_to_filename.h (fd_to_filename): Change signature.
    	* sysdeps/unix/sysv/linux/fd_to_filename.h (fd_to_filename): Likewise
    	and remove internal dynamic allocation.
    
    [1] http://pubs.opengroup.org/onlinepubs/9699919799/

diff --git a/ChangeLog b/ChangeLog
index 1fdd50a..d0f7f51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2018-10-02  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+	[BZ #21037]
+	* libio/Makefile (tests): Add tst-memstream4 and tst-wmemstream4.
+	* libio/freopen.c (freopen): Sync stream before reopen and adjust to
+	new fd_to_filename interface.
+	* libio/freopen64.c (freopen64): Likewise.
+	* libio/tst-memstream.h: New file.
+	* libio/tst-memstream4.c: Likewise.
+	* libio/tst-wmemstream4.c: Likewise.
+	* sysdeps/generic/fd_to_filename.h (fd_to_filename): Change signature.
+	* sysdeps/unix/sysv/linux/fd_to_filename.h (fd_to_filename): Likewise
+	and remove internal dynamic allocation.
+
 2018-10-01  Joseph Myers  <joseph@codesourcery.com>
 
 	* sysdeps/unix/sysv/linux/bits/mman-linux.h [__USE_GNU]
diff --git a/libio/Makefile b/libio/Makefile
index cab0eae..8239fba 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -59,8 +59,8 @@ tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc   \
 	tst-mmap-eofsync tst-mmap-fflushsync bug-mmap-fflush \
 	tst-mmap2-eofsync tst-mmap-offend bug-fopena+ bug-wfflush \
 	bug-ungetc2 bug-ftell bug-ungetc3 bug-ungetc4 tst-fopenloc2 \
-	tst-memstream1 tst-memstream2 tst-memstream3 \
-	tst-wmemstream1 tst-wmemstream2 tst-wmemstream3 \
+	tst-memstream1 tst-memstream2 tst-memstream3 tst-memstream4 \
+	tst-wmemstream1 tst-wmemstream2 tst-wmemstream3 tst-wmemstream4 \
 	bug-memstream1 bug-wmemstream1 \
 	tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek \
 	tst-fwrite-error tst-ftell-partial-wide tst-ftell-active-handler \
diff --git a/libio/freopen.c b/libio/freopen.c
index abf19e9..6ce74ae 100644
--- a/libio/freopen.c
+++ b/libio/freopen.c
@@ -24,28 +24,34 @@
    This exception applies to code released by its copyright holders
    in files containing the exception.  */
 
-#include "libioP.h"
-#include "stdio.h"
+#include <stdio.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <unistd.h>
 
-#include <shlib-compat.h>
+#include <libioP.h>
 #include <fd_to_filename.h>
-
-#include <kernel-features.h>
+#include <shlib-compat.h>
 
 FILE *
 freopen (const char *filename, const char *mode, FILE *fp)
 {
-  FILE *result;
+  FILE *result = NULL;
+  char fdfilename[FD_TO_FILENAME_SIZE];
+
   CHECK_FILE (fp, NULL);
-  if (!(fp->_flags & _IO_IS_FILEBUF))
-    return NULL;
+
   _IO_acquire_lock (fp);
+  /* First flush the stream (failure should be ignored).  */
+  _IO_SYNC (fp);
+
+  if (!(fp->_flags & _IO_IS_FILEBUF))
+    goto end;
+
   int fd = _IO_fileno (fp);
-  const char *gfilename = (filename == NULL && fd >= 0
-			   ? fd_to_filename (fd) : filename);
+  const char *gfilename
+    = filename != NULL ? filename : fd_to_filename (fd, fdfilename);
+
   fp->_flags2 |= _IO_FLAGS2_NOCLOSE;
 #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
   if (&_IO_stdin_used == NULL)
@@ -101,9 +107,6 @@ freopen (const char *filename, const char *mode, FILE *fp)
     __close (fd);
 
 end:
-  if (filename == NULL)
-    free ((char *) gfilename);
-
   _IO_release_lock (fp);
   return result;
 }
diff --git a/libio/freopen64.c b/libio/freopen64.c
index ea7ebd3..055b999 100644
--- a/libio/freopen64.c
+++ b/libio/freopen64.c
@@ -24,27 +24,33 @@
    This exception applies to code released by its copyright holders
    in files containing the exception.  */
 
-#include "libioP.h"
-#include "stdio.h"
+#include <stdio.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <libioP.h>
 #include <fd_to_filename.h>
 
-#include <kernel-features.h>
-
 FILE *
 freopen64 (const char *filename, const char *mode, FILE *fp)
 {
-  FILE *result;
+  FILE *result = NULL;
+  char fdfilename[FD_TO_FILENAME_SIZE];
+
   CHECK_FILE (fp, NULL);
-  if (!(fp->_flags & _IO_IS_FILEBUF))
-    return NULL;
+
   _IO_acquire_lock (fp);
+  /* First flush the stream (failure should be ignored).  */
+  _IO_SYNC (fp);
+
+  if (!(fp->_flags & _IO_IS_FILEBUF))
+    goto end;
+
   int fd = _IO_fileno (fp);
-  const char *gfilename = (filename == NULL && fd >= 0
-			   ? fd_to_filename (fd) : filename);
+  const char *gfilename
+    = filename != NULL ? filename : fd_to_filename (fd, fdfilename);
+
   fp->_flags2 |= _IO_FLAGS2_NOCLOSE;
   _IO_file_close_it (fp);
   _IO_JUMPS_FILE_plus (fp) = &_IO_file_jumps;
@@ -84,8 +90,6 @@ freopen64 (const char *filename, const char *mode, FILE *fp)
     __close (fd);
 
 end:
-  if (filename == NULL)
-    free ((char *) gfilename);
   _IO_release_lock (fp);
   return result;
 }
diff --git a/libio/tst-memstream.h b/libio/tst-memstream.h
new file mode 100644
index 0000000..b9b02bd
--- /dev/null
+++ b/libio/tst-memstream.h
@@ -0,0 +1,68 @@
+/* Common definitions for open_memstream tests.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <mcheck.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#include <support/check.h>
+
+#ifdef TEST_WCHAR
+# include <wchar.h>
+
+/* Straighforward implementation so tst-memstream3 could use check
+   fwrite on open_memstream.  */
+static size_t __attribute__ ((used))
+fwwrite (const void *ptr, size_t size, size_t nmemb, FILE *arq)
+{
+  const wchar_t *wcs = (const wchar_t*) (ptr);
+  for (size_t s = 0; s < size; s++)
+    {
+      for (size_t n = 0; n < nmemb; n++)
+        if (fputwc (wcs[n], arq) == WEOF)
+          return n;
+    }
+  return size * nmemb;
+}
+
+# define CHAR_T wchar_t
+# define W(o) L##o
+# define OPEN_MEMSTREAM open_wmemstream
+# define PRINTF wprintf
+# define FWRITE fwwrite
+# define FPUTC  fputwc
+# define FPUTS  fputws
+# define STRCMP wcscmp
+# define STRLEN wcslen
+#else
+# define CHAR_T char
+# define W(o) o
+# define OPEN_MEMSTREAM open_memstream
+# define PRINTF printf
+# define FWRITE fwrite
+# define FPUTC fputc
+# define FPUTS  fputs
+# define STRCMP strcmp
+# define STRLEN strlen
+#endif
+
+#define S(s) S1 (s)
+#define S1(s) #s
diff --git a/libio/tst-memstream4.c b/libio/tst-memstream4.c
new file mode 100644
index 0000000..a83a8bf
--- /dev/null
+++ b/libio/tst-memstream4.c
@@ -0,0 +1,64 @@
+/* Test for open_memstream BZ #21037.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "tst-memstream.h"
+
+static void
+mcheck_abort (enum mcheck_status ev)
+{
+  printf ("mecheck failed with status %d\n", (int) ev);
+  exit (1);
+}
+
+static int
+do_test (void)
+{
+  mcheck_pedantic (mcheck_abort);
+
+  /* Check if freopen proper fflush the stream.  */
+  {
+    CHAR_T old[] = W("old");
+    CHAR_T *buf = old;
+    size_t size;
+
+    FILE *fp = OPEN_MEMSTREAM (&buf, &size);
+    TEST_VERIFY_EXIT (fp != NULL);
+
+    FPUTS (W("new"), fp);
+    /* The stream buffer pointer should be updated with only a fflush or
+       fclose.  */
+    TEST_COMPARE (STRCMP (buf, old), 0);
+
+    /* The old stream should be fflush the stream, even for an invalid
+       streams.  */
+    FILE *nfp = freopen ("invalid-file", "r", fp);
+    TEST_VERIFY_EXIT (nfp == NULL);
+
+    TEST_VERIFY (STRCMP (buf, W("new")) == 0);
+    TEST_COMPARE_BLOB (buf, STRLEN (buf) * sizeof (CHAR_T),
+		       W("new"), STRLEN (W("new")) * sizeof (CHAR_T));
+
+    TEST_COMPARE (fclose (fp), 0);
+
+    free (buf);
+  }
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/generic/fd_to_filename.h b/libio/tst-wmemstream4.c
similarity index 71%
copy from sysdeps/generic/fd_to_filename.h
copy to libio/tst-wmemstream4.c
index bacfe5b..8ff146e 100644
--- a/sysdeps/generic/fd_to_filename.h
+++ b/libio/tst-wmemstream4.c
@@ -1,5 +1,5 @@
-/* Query filename corresponding to an open FD.  Generic version.
-   Copyright (C) 2001-2018 Free Software Foundation, Inc.
+/* Test for open_wmemstream BZ #21037.
+   Copyright (C) 2018 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,10 +16,5 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* In general there is no generic way to query filename for an open
-   file descriptor.  */
-static inline const char *
-fd_to_filename (int fd)
-{
-  return NULL;
-}
+#define TEST_WCHAR
+#include <libio/tst-memstream4.c>
diff --git a/sysdeps/generic/fd_to_filename.h b/sysdeps/generic/fd_to_filename.h
index bacfe5b..d41b345 100644
--- a/sysdeps/generic/fd_to_filename.h
+++ b/sysdeps/generic/fd_to_filename.h
@@ -16,10 +16,12 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FD_TO_FILENAME_SIZE 0
+
 /* In general there is no generic way to query filename for an open
    file descriptor.  */
 static inline const char *
-fd_to_filename (int fd)
+fd_to_filename (int fd, char *buf)
 {
   return NULL;
 }
diff --git a/sysdeps/unix/sysv/linux/fd_to_filename.h b/sysdeps/unix/sysv/linux/fd_to_filename.h
index 297716b..62bc991 100644
--- a/sysdeps/unix/sysv/linux/fd_to_filename.h
+++ b/sysdeps/unix/sysv/linux/fd_to_filename.h
@@ -16,30 +16,20 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <stdlib.h>
-#include <string.h>
 #include <sys/stat.h>
-#include <_itoa.h>
+
+#define FD_TO_FILENAME_SIZE ((sizeof ("/proc/self/fd/") - 1) \
+			     + (sizeof ("4294967295") - 1) + 1)
 
 static inline const char *
-fd_to_filename (int fd)
+fd_to_filename (unsigned int fd, char *buf)
 {
-  char *ret = malloc (30);
-
-  if (ret != NULL)
-    {
-      struct stat64 st;
-
-      *_fitoa_word (fd, __stpcpy (ret, "/proc/self/fd/"), 10, 0) = '\0';
-
-      /* We must make sure the file exists.  */
-      if (__lxstat64 (_STAT_VER, ret, &st) < 0)
-	{
-	  /* /proc is not mounted or something else happened.  Don't
-	     return the file name.  */
-	  free (ret);
-	  ret = NULL;
-	}
-    }
-  return ret;
+  *_fitoa_word (fd, __stpcpy (buf, "/proc/self/fd/"), 10, 0) = '\0';
+
+  /* We must make sure the file exists.  */
+  struct stat64 st;
+  if (__lxstat64 (_STAT_VER, buf, &st) < 0)
+    /* /proc is not mounted or something else happened.  */
+    return NULL;
+  return buf;
 }

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                |   14 ++++++
 libio/Makefile                           |    4 +-
 libio/freopen.c                          |   29 +++++++------
 libio/freopen64.c                        |   26 +++++++-----
 libio/tst-memstream.h                    |   68 ++++++++++++++++++++++++++++++
 libio/tst-memstream4.c                   |   64 ++++++++++++++++++++++++++++
 libio/tst-wmemstream4.c                  |   20 +++++++++
 sysdeps/generic/fd_to_filename.h         |    4 +-
 sysdeps/unix/sysv/linux/fd_to_filename.h |   34 +++++----------
 9 files changed, 214 insertions(+), 49 deletions(-)
 create mode 100644 libio/tst-memstream.h
 create mode 100644 libio/tst-memstream4.c
 create mode 100644 libio/tst-wmemstream4.c


hooks/post-receive
-- 
GNU C Library master sources


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