v4_root_add_parents: remove a possible buffer overflow.
authorNeilBrown <neilb@suse.de>
Tue, 1 May 2012 19:26:54 +0000 (15:26 -0400)
committerSteve Dickson <steved@redhat.com>
Tue, 1 May 2012 19:30:00 +0000 (15:30 -0400)
The loop in v4root_add_parents() is a little odd.
The first time through, 'ptr' points immediately "beyond"
a '/' character (the first).  For every other iterration it points
directly "at" a '/' character.
Such inconsistency is error prone and infact there is an error.
If "path" is precisely "/", then the first call to
   ptr = strchr(ptr, '/')

will be given a 'ptr' which is beyond the '\0' at the end of
"path".  This could potentially contain anything and the strchr()
could search well beyond a buffer (though this depends on exactly how
the string is set up which depends on separate code).

So change the loop to have 'ptr' always point at a '/', and
handle the special case of "/" explicitly.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
utils/mountd/v4root.c

index 57ee0b2..708eb61 100644 (file)
@@ -150,13 +150,13 @@ static int v4root_add_parents(nfs_export *exp)
                                "pseudo export for '%s'", exp->m_export.e_path);
                return -ENOMEM;
        }
-       for (ptr = path + 1; ptr; ptr = strchr(ptr, '/')) {
+       for (ptr = path; ptr; ptr = strchr(ptr, '/')) {
                int ret;
                char saved;
 
                saved = *ptr;
                *ptr = '\0';
-               ret = pseudofs_update(hostname, path, exp);
+               ret = pseudofs_update(hostname, *path ? path : "/", exp);
                if (ret)
                        return ret;
                *ptr = saved;