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] Replace strncpy with memccpy to fix -Wstringop-truncation.


On 04/05/2018 06:14 PM, Andreas Schwab wrote:
On Apr 05 2018, Stefan Liebler <stli@linux.vnet.ibm.com> wrote:

Why do we need the strncpy at all?
if (len == 0 && ...)

That's obviously a typo.

Andreas.

Yes. You are right. Please have a look at the applied patch.
If the zero-termination is needed, numstr is copied to the buffer with strncpy and the zero-termination is applied. If numstr is either 0 bytes long or the length of the numstr string is 0, then _nss_nisplus_parse_pwent returns with 0.


This solves the mentioned warning with if build with gcc-head and --enable-obsolete-nsl.
But I can not test it as I don't have a nisplus setup.

Bye.
Stefan
diff --git a/nis/nss_nisplus/nisplus-parser.c b/nis/nss_nisplus/nisplus-parser.c
index 8dc021e73d..4714a3085a 100644
--- a/nis/nss_nisplus/nisplus-parser.c
+++ b/nis/nss_nisplus/nisplus-parser.c
@@ -82,7 +82,7 @@ _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw,
 
   char *numstr = NISOBJVAL (2, obj);
   len = NISOBJLEN (2, obj);
-  if (len == 0 && numstr[len - 1] != '\0')
+  if (len != 0 && numstr[len - 1] != '\0')
     {
       if (len >= room_left)
 	goto no_more_room;
@@ -91,14 +91,14 @@ _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw,
       first_unused[len] = '\0';
       numstr = first_unused;
     }
-  if (numstr[0] == '\0')
+  if (len == 0 || numstr[0] == '\0')
     /* If we don't have a uid, it's an invalid shadow entry.  */
     return 0;
   pw->pw_uid = strtoul (numstr, NULL, 10);
 
   numstr = NISOBJVAL (3, obj);
   len = NISOBJLEN (3, obj);
-  if (len == 0 && numstr[len - 1] != '\0')
+  if (len != 0 && numstr[len - 1] != '\0')
     {
       if (len >= room_left)
 	goto no_more_room;
@@ -107,7 +107,7 @@ _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw,
       first_unused[len] = '\0';
       numstr = first_unused;
     }
-  if (numstr[0] == '\0')
+  if (len == 0 || numstr[0] == '\0')
     /* If we don't have a gid, it's an invalid shadow entry.  */
     return 0;
   pw->pw_gid = strtoul (numstr, NULL, 10);

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