Replace strncpy with memccpy to fix -Wstringop-truncation.

Message ID 980fefe5-31ac-e5be-afb5-102b873dc567@linux.vnet.ibm.com
State Not applicable
Headers

Commit Message

Stefan Liebler April 12, 2018, 3:31 p.m. UTC
  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
  

Comments

Stefan Liebler April 19, 2018, 2:30 p.m. UTC | #1
On 04/12/2018 05:31 PM, Stefan Liebler wrote:
> 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

PING
  

Patch

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