summaryrefslogtreecommitdiffstats
path: root/meta/recipes-connectivity/nfs-utils/nfs-utils/fix-segfault-in-add_name.patch
blob: 4ebf2dcee42e6508746372e8477e999ff1d6c5e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
commit 25e83c2270b2d2966c992885faed0b79be09f474
Author: Jeff Layton <jlayton@poochiereds.net>
Date:   Thu May 1 11:15:16 2014 -0400

    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>

    Upstream-Status:Backport
    Signed-off-by: Tudor Florea <tudor.florea@enea.com>

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