Replace strncpy with memccpy to fix -Wstringop-truncation.
Commit Message
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
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
@@ -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);