Patchwork Fix -Os feof_unlocked linknamespace, localplt issues (bug 15105, bug 19463)

login
register
mail settings
Submitter Joseph Myers
Date Feb. 7, 2018, 5:34 p.m.
Message ID <alpine.DEB.2.20.1802071733530.32393@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/25859/
State New
Headers show

Comments

Joseph Myers - Feb. 7, 2018, 5:34 p.m.
Continuing the fixes for linknamespace and localplt test failures with
-Os that arise from functions not being inlined in that case, this
patch fixes such failures for feof_unlocked.

The usual approach is followed of adding __feof_unlocked (inlined when
feof_unlocked is), making calls use it when required for namespace
reasons, and using libc_hidden_proto / libc_hidden_weak for the
feof_unlocked weak alias when only localplt but not namespace issues
are involved.  In the case of getaddrinfo.c, use of __feof_unlocked
needs to be conditional since that code is also used in nscd (where
__feof_unlocked is not available).

Tested for x86_64 (both without -Os to make sure that case continues
to work, and with -Os to make sure all the relevant linknamespace and
localplt test failures are resolved).  Because of other such failures
that remain after this patch, neither of the bugs can yet be closed.

2018-02-07  Joseph Myers  <joseph@codesourcery.com>

	[BZ #15105]
	[BZ #19463]
	* libio/feof_u.c (feof_unlocked): Rename to __feof_unlocked and
	define as weak alias of __feof_unlocked.  Use libc_hidden_weak.
	* include/stdio.h (feof_unlocked): Use libc_hidden_proto.
	(__feof_unlocked): New declaration, and inline function if
	[__USE_EXTERN_INLINES].
	* iconv/gconv_conf.c (read_conf_file): Call __feof_unlocked
	instead of feof_unlocked.
	* intl/localealias.c [_LIBC] (FEOF): Likewise.
	* nss/nsswitch.c (nss_parse_file): Likewise.
	* sysdeps/unix/sysv/linux/readonly-area.c (__readonly_area):
	Likewise.
	* time/getdate.c (__getdate_r): Likewise.
	* sysdeps/posix/getaddrinfo.c [IS_IN (libc)] (feof_unlocked):
	Define as macro to call __feof_unlocked.
Joseph Myers - Feb. 12, 2018, 4:32 p.m.
Ping.  This patch 
<https://sourceware.org/ml/libc-alpha/2018-02/msg00264.html> is pending 
review.
Adhemerval Zanella Netto - Feb. 15, 2018, 6:07 p.m.
On 07/02/2018 15:34, Joseph Myers wrote:
> Continuing the fixes for linknamespace and localplt test failures with
> -Os that arise from functions not being inlined in that case, this
> patch fixes such failures for feof_unlocked.
> 
> The usual approach is followed of adding __feof_unlocked (inlined when
> feof_unlocked is), making calls use it when required for namespace
> reasons, and using libc_hidden_proto / libc_hidden_weak for the
> feof_unlocked weak alias when only localplt but not namespace issues
> are involved.  In the case of getaddrinfo.c, use of __feof_unlocked
> needs to be conditional since that code is also used in nscd (where
> __feof_unlocked is not available).
> 
> Tested for x86_64 (both without -Os to make sure that case continues
> to work, and with -Os to make sure all the relevant linknamespace and
> localplt test failures are resolved).  Because of other such failures
> that remain after this patch, neither of the bugs can yet be closed.
> 
> 2018-02-07  Joseph Myers  <joseph@codesourcery.com>
> 
> 	[BZ #15105]
> 	[BZ #19463]
> 	* libio/feof_u.c (feof_unlocked): Rename to __feof_unlocked and
> 	define as weak alias of __feof_unlocked.  Use libc_hidden_weak.
> 	* include/stdio.h (feof_unlocked): Use libc_hidden_proto.
> 	(__feof_unlocked): New declaration, and inline function if
> 	[__USE_EXTERN_INLINES].
> 	* iconv/gconv_conf.c (read_conf_file): Call __feof_unlocked
> 	instead of feof_unlocked.
> 	* intl/localealias.c [_LIBC] (FEOF): Likewise.
> 	* nss/nsswitch.c (nss_parse_file): Likewise.
> 	* sysdeps/unix/sysv/linux/readonly-area.c (__readonly_area):
> 	Likewise.
> 	* time/getdate.c (__getdate_r): Likewise.
> 	* sysdeps/posix/getaddrinfo.c [IS_IN (libc)] (feof_unlocked):
> 	Define as macro to call __feof_unlocked.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>

> 
> diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
> index d6cf9d2..f173cde 100644
> --- a/iconv/gconv_conf.c
> +++ b/iconv/gconv_conf.c
> @@ -374,7 +374,7 @@ read_conf_file (const char *filename, const char *directory, size_t dir_len,
>  
>    /* Process the known entries of the file.  Comments start with `#' and
>       end with the end of the line.  Empty lines are ignored.  */
> -  while (!feof_unlocked (fp))
> +  while (!__feof_unlocked (fp))
>      {
>        char *rp, *endp, *word;
>        ssize_t n = __getdelim (&line, &line_len, '\n', fp);
> diff --git a/include/stdio.h b/include/stdio.h
> index 94bc2fd..7ab3ddd 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -179,6 +179,8 @@ libc_hidden_proto (__fgets_unlocked)
>  libc_hidden_proto (fputs_unlocked)
>  extern __typeof (fputs_unlocked) __fputs_unlocked;
>  libc_hidden_proto (__fputs_unlocked)
> +libc_hidden_proto (feof_unlocked)
> +extern __typeof (feof_unlocked) __feof_unlocked attribute_hidden;
>  libc_hidden_proto (fmemopen)
>  /* The prototype needs repeating instead of using __typeof to use
>     __THROW in C++ tests.  */
> @@ -199,5 +201,13 @@ libc_hidden_proto (__fmemopen)
>  extern int __gen_tempfd (int flags);
>  libc_hidden_proto (__gen_tempfd)
>  
> +#  ifdef __USE_EXTERN_INLINES
> +__extern_inline int
> +__NTH (__feof_unlocked (FILE *__stream))
> +{
> +  return __feof_unlocked_body (__stream);
> +}
> +#  endif
> +
>  # endif /* not _ISOMAC */
>  #endif /* stdio.h */
> diff --git a/intl/localealias.c b/intl/localealias.c
> index f0fefe4..09e7894 100644
> --- a/intl/localealias.c
> +++ b/intl/localealias.c
> @@ -90,7 +90,7 @@ char *alloca ();
>  
>  /* Some optimizations for glibc.  */
>  #ifdef _LIBC
> -# define FEOF(fp)		feof_unlocked (fp)
> +# define FEOF(fp)		__feof_unlocked (fp)
>  # define FGETS(buf, n, fp)	__fgets_unlocked (buf, n, fp)
>  #else
>  # define FEOF(fp)		feof (fp)
> diff --git a/libio/feof_u.c b/libio/feof_u.c
> index 581808e..9239144 100644
> --- a/libio/feof_u.c
> +++ b/libio/feof_u.c
> @@ -30,8 +30,10 @@
>  #undef feof_unlocked
>  
>  int
> -feof_unlocked (_IO_FILE *fp)
> +__feof_unlocked (_IO_FILE *fp)
>  {
>    CHECK_FILE (fp, EOF);
>    return _IO_feof_unlocked (fp);
>  }
> +weak_alias (__feof_unlocked, feof_unlocked)
> +libc_hidden_weak (feof_unlocked)
> diff --git a/nss/nsswitch.c b/nss/nsswitch.c
> index d5e6559..4b8deed 100644
> --- a/nss/nsswitch.c
> +++ b/nss/nsswitch.c
> @@ -599,7 +599,7 @@ nss_parse_file (const char *fname)
>  	  last = this;
>  	}
>      }
> -  while (!feof_unlocked (fp));
> +  while (!__feof_unlocked (fp));
>  
>    /* Free the buffer.  */
>    free (line);
> diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
> index c15f76e..740bdd1 100644
> --- a/sysdeps/posix/getaddrinfo.c
> +++ b/sysdeps/posix/getaddrinfo.c
> @@ -89,6 +89,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>  # include <idna.h>
>  #endif
>  
> +#if IS_IN (libc)
> +# define feof_unlocked(fp) __feof_unlocked (fp)
> +#endif
> +
>  struct gaih_service
>    {
>      const char *name;
> diff --git a/sysdeps/unix/sysv/linux/readonly-area.c b/sysdeps/unix/sysv/linux/readonly-area.c
> index 9cbb6e9..5546bf7 100644
> --- a/sysdeps/unix/sysv/linux/readonly-area.c
> +++ b/sysdeps/unix/sysv/linux/readonly-area.c
> @@ -53,7 +53,7 @@ __readonly_area (const char *ptr, size_t size)
>    char *line = NULL;
>    size_t linelen = 0;
>  
> -  while (! feof_unlocked (fp))
> +  while (! __feof_unlocked (fp))
>      {
>        if (_IO_getdelim (&line, &linelen, '\n', fp) <= 0)
>  	break;
> diff --git a/time/getdate.c b/time/getdate.c
> index cde93f7..29ad760 100644
> --- a/time/getdate.c
> +++ b/time/getdate.c
> @@ -198,7 +198,7 @@ __getdate_r (const char *string, struct tm *tp)
>        if (result && *result == '\0')
>  	break;
>      }
> -  while (!feof_unlocked (fp));
> +  while (!__feof_unlocked (fp));
>  
>    free (instr);
>  
>

Patch

diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
index d6cf9d2..f173cde 100644
--- a/iconv/gconv_conf.c
+++ b/iconv/gconv_conf.c
@@ -374,7 +374,7 @@  read_conf_file (const char *filename, const char *directory, size_t dir_len,
 
   /* Process the known entries of the file.  Comments start with `#' and
      end with the end of the line.  Empty lines are ignored.  */
-  while (!feof_unlocked (fp))
+  while (!__feof_unlocked (fp))
     {
       char *rp, *endp, *word;
       ssize_t n = __getdelim (&line, &line_len, '\n', fp);
diff --git a/include/stdio.h b/include/stdio.h
index 94bc2fd..7ab3ddd 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -179,6 +179,8 @@  libc_hidden_proto (__fgets_unlocked)
 libc_hidden_proto (fputs_unlocked)
 extern __typeof (fputs_unlocked) __fputs_unlocked;
 libc_hidden_proto (__fputs_unlocked)
+libc_hidden_proto (feof_unlocked)
+extern __typeof (feof_unlocked) __feof_unlocked attribute_hidden;
 libc_hidden_proto (fmemopen)
 /* The prototype needs repeating instead of using __typeof to use
    __THROW in C++ tests.  */
@@ -199,5 +201,13 @@  libc_hidden_proto (__fmemopen)
 extern int __gen_tempfd (int flags);
 libc_hidden_proto (__gen_tempfd)
 
+#  ifdef __USE_EXTERN_INLINES
+__extern_inline int
+__NTH (__feof_unlocked (FILE *__stream))
+{
+  return __feof_unlocked_body (__stream);
+}
+#  endif
+
 # endif /* not _ISOMAC */
 #endif /* stdio.h */
diff --git a/intl/localealias.c b/intl/localealias.c
index f0fefe4..09e7894 100644
--- a/intl/localealias.c
+++ b/intl/localealias.c
@@ -90,7 +90,7 @@  char *alloca ();
 
 /* Some optimizations for glibc.  */
 #ifdef _LIBC
-# define FEOF(fp)		feof_unlocked (fp)
+# define FEOF(fp)		__feof_unlocked (fp)
 # define FGETS(buf, n, fp)	__fgets_unlocked (buf, n, fp)
 #else
 # define FEOF(fp)		feof (fp)
diff --git a/libio/feof_u.c b/libio/feof_u.c
index 581808e..9239144 100644
--- a/libio/feof_u.c
+++ b/libio/feof_u.c
@@ -30,8 +30,10 @@ 
 #undef feof_unlocked
 
 int
-feof_unlocked (_IO_FILE *fp)
+__feof_unlocked (_IO_FILE *fp)
 {
   CHECK_FILE (fp, EOF);
   return _IO_feof_unlocked (fp);
 }
+weak_alias (__feof_unlocked, feof_unlocked)
+libc_hidden_weak (feof_unlocked)
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index d5e6559..4b8deed 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -599,7 +599,7 @@  nss_parse_file (const char *fname)
 	  last = this;
 	}
     }
-  while (!feof_unlocked (fp));
+  while (!__feof_unlocked (fp));
 
   /* Free the buffer.  */
   free (line);
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index c15f76e..740bdd1 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -89,6 +89,10 @@  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 # include <idna.h>
 #endif
 
+#if IS_IN (libc)
+# define feof_unlocked(fp) __feof_unlocked (fp)
+#endif
+
 struct gaih_service
   {
     const char *name;
diff --git a/sysdeps/unix/sysv/linux/readonly-area.c b/sysdeps/unix/sysv/linux/readonly-area.c
index 9cbb6e9..5546bf7 100644
--- a/sysdeps/unix/sysv/linux/readonly-area.c
+++ b/sysdeps/unix/sysv/linux/readonly-area.c
@@ -53,7 +53,7 @@  __readonly_area (const char *ptr, size_t size)
   char *line = NULL;
   size_t linelen = 0;
 
-  while (! feof_unlocked (fp))
+  while (! __feof_unlocked (fp))
     {
       if (_IO_getdelim (&line, &linelen, '\n', fp) <= 0)
 	break;
diff --git a/time/getdate.c b/time/getdate.c
index cde93f7..29ad760 100644
--- a/time/getdate.c
+++ b/time/getdate.c
@@ -198,7 +198,7 @@  __getdate_r (const char *string, struct tm *tp)
       if (result && *result == '\0')
 	break;
     }
-  while (!feof_unlocked (fp));
+  while (!__feof_unlocked (fp));
 
   free (instr);