Harden put*ent functions against data injection [BZ #18724]

Message ID alpine.DEB.2.10.1510021114380.31564@digraph.polyomino.org.uk
State Committed
Headers

Commit Message

Joseph Myers Oct. 2, 2015, 11:15 a.m. UTC
  i386 build fixed thus.  Committed.

Fix i386 build after put*ent hardening changes.

The recent put*ent hardening changes broke the build for i386.  i386
defines internal_function to __attribute__ ((regparm (3), stdcall)),
which affects type compatibility, so requiring internal_function to be
used consistently on declarations and definitions.  This patch adds
internal_function to the definitions of the new functions using it on
their declarations.

Tested for i386 that this fixes the build.

2015-10-02  Joseph Myers  <joseph@codesourcery.com>

	* nss/rewrite_field.c (__nss_rewrite_field): Use
	internal_function.
	* nss/valid_field.c (__nss_valid_field): Likewise.
	* nss/valid_list_field.c (__nss_valid_list_field): Likewise.
  

Comments

Florian Weimer Oct. 2, 2015, 11:26 a.m. UTC | #1
On 10/02/2015 01:15 PM, Joseph Myers wrote:
> i386 build fixed thus.  Committed.
> 
> Fix i386 build after put*ent hardening changes.
> 
> The recent put*ent hardening changes broke the build for i386.  i386
> defines internal_function to __attribute__ ((regparm (3), stdcall)),
> which affects type compatibility, so requiring internal_function to be
> used consistently on declarations and definitions.  This patch adds
> internal_function to the definitions of the new functions using it on
> their declarations.

Ugh, thanks.  I've asked on gcc-help if there is some attribute we can
use to catch this on other architectures as well.

I guess I need to set up things to build everything on i386, too, if GCC
continues to behave this way.

Florian
  

Patch

diff --git a/nss/rewrite_field.c b/nss/rewrite_field.c
index fb9d274..2535457 100644
--- a/nss/rewrite_field.c
+++ b/nss/rewrite_field.c
@@ -24,6 +24,7 @@ 
    overwritten with a pointer the caller has to free if the function
    returns successfully.  On failure, return NULL.  */
 const char *
+internal_function
 __nss_rewrite_field (const char *value, char **to_be_freed)
 {
   *to_be_freed = NULL;
diff --git a/nss/valid_field.c b/nss/valid_field.c
index 5fcddc5..061c121 100644
--- a/nss/valid_field.c
+++ b/nss/valid_field.c
@@ -24,6 +24,7 @@  const char __nss_invalid_field_characters[] = NSS_INVALID_FIELD_CHARACTERS;
    does not contain characters not permitted in NSS database
    fields.  */
 _Bool
+internal_function
 __nss_valid_field (const char *value)
 {
   return value == NULL
diff --git a/nss/valid_list_field.c b/nss/valid_list_field.c
index 98ab93b..80ab12b 100644
--- a/nss/valid_list_field.c
+++ b/nss/valid_list_field.c
@@ -24,6 +24,7 @@  static const char invalid_characters[] = NSS_INVALID_FIELD_CHARACTERS ",";
 /* Check that all list members match the field syntax requirements and
    do not contain the character ','.  */
 _Bool
+internal_function
 __nss_valid_list_field (char **list)
 {
   if (list == NULL)