]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
util: Simplify input validation
authorMartin Schwenke <martin@meltin.net>
Tue, 9 Jun 2020 01:52:50 +0000 (11:52 +1000)
committerKarolin Seeger <kseeger@samba.org>
Mon, 6 Jul 2020 09:06:23 +0000 (09:06 +0000)
It appears that snprintf(3) is being used for input validation.
However, this seems like overkill because it causes szPath to be
copied an extra time.  The mostly likely protections being sought
here, according to https://cwe.mitre.org/data/definitions/20.html,
look to be DoS attacks involving CPU and memory usage.  A simpler
check that uses strnlen(3) can mitigate against both of these and is
simpler.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Bjoern Jacke <bjacke@samba.org>
(cherry picked from commit 922bce2668994dd2a5988c17060f977e9bb0c229)

lib/util/util_paths.c

index c0ee5c32c302f4c1a1c688d05c0592ac76414025..dec91772d9e6ac99eeb39e36abd28460a1b19959 100644 (file)
@@ -69,21 +69,20 @@ static char *get_user_home_dir(TALLOC_CTX *mem_ctx)
        struct passwd pwd = {0};
        struct passwd *pwdbuf = NULL;
        char buf[NSS_BUFLEN_PASSWD] = {0};
+       size_t len;
        int rc;
 
        rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);
        if (rc != 0 || pwdbuf == NULL ) {
-               int len_written;
                const char *szPath = getenv("HOME");
                if (szPath == NULL) {
                        return NULL;
                }
-               len_written = snprintf(buf, sizeof(buf), "%s", szPath);
-               if (len_written >= sizeof(buf) || len_written < 0) {
-                       /* Output was truncated or an error. */
+               len = strnlen(szPath, PATH_MAX);
+               if (len >= PATH_MAX) {
                        return NULL;
                }
-               return talloc_strdup(mem_ctx, buf);
+               return talloc_strdup(mem_ctx, szPath);
        }
 
        return talloc_strdup(mem_ctx, pwd.pw_dir);