This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Replace strncpy with memccpy to fix -Wstringop-truncation.
- From: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Cc: schwab at suse dot de
- Date: Thu, 12 Apr 2018 17:31:26 +0200
- Subject: Re: [PATCH] Replace strncpy with memccpy to fix -Wstringop-truncation.
- References: <20180323010729.41457-1-raj.khem@gmail.com> <alpine.DEB.2.20.1803230115280.6153@digraph.polyomino.org.uk> <CAMKF1sqVBx3_8sK=BuH_HRFDLTQqtT9M8t=eSDpOVRyJRAnOkw@mail.gmail.com> <796d9b52-7270-69d4-cfc2-1ce05b6ebbf1@linux.vnet.ibm.com> <mvmpo3d1vh9.fsf@suse.de>
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);