summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@poochiereds.net>2014-05-01 11:15:16 -0400
committerSteve Dickson <steved@redhat.com>2014-05-01 11:15:16 -0400
commit25e83c2270b2d2966c992885faed0b79be09f474 (patch)
tree35f11413ae2f2853b35839eecec240b62fcdc5a5
parent9a36e0227c4dd8c3ebd1fbb313737c9b95fbd7e1 (diff)
downloadnfs-utils-25e83c2270b2d2966c992885faed0b79be09f474.tar.gz
nfs-utils-25e83c2270b2d2966c992885faed0b79be09f474.tar.xz
nfs-utils-25e83c2270b2d2966c992885faed0b79be09f474.zip
mountd: fix segfault in add_name with newer gcc compilers
I hit a segfault in add_name with a mountd built with gcc-4.9.0. Some NULL pointer checks got reordered such that a pointer was dereferenced before checking to see whether it was NULL. The problem was due to nfs-utils relying on undefined behavior, which tricked gcc into assuming that the pointer would never be NULL. At first I assumed that this was a compiler bug, but Jakub Jelinek and Jeff Law pointed out: "If old is NULL, then: strncpy(new, old, cp-old); is undefined behavior (even when cp == old == NULL in that case), therefore gcc assumes that old is never NULL, as otherwise it would be invalid. Just guard strncpy(new, old, cp-old); new[cp-old] = 0; with if (old) { ... }." This patch does that. If old is NULL though, then we still need to ensure that new is NULL terminated, lest the subsequent strcats walk off the end of it. Cc: Jeff Law <law@redhat.com> Cc: Jakub Jelinek <jakub@redhat.com> Signed-off-by: Jeff Layton <jlayton@poochiereds.net> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--support/export/client.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/support/export/client.c b/support/export/client.c
index dbf47b9..f85e11c 100644
--- a/support/export/client.c
+++ b/support/export/client.c
@@ -482,8 +482,12 @@ add_name(char *old, const char *add)
else
cp = cp + strlen(cp);
}
- strncpy(new, old, cp-old);
- new[cp-old] = 0;
+ if (old) {
+ strncpy(new, old, cp-old);
+ new[cp-old] = 0;
+ } else {
+ new[0] = 0;
+ }
if (cp != old && !*cp)
strcat(new, ",");
strcat(new, add);