]> Git Repo - linux.git/commitdiff
9p: p9dirent_read: check network-provided name length
authorDominique Martinet <[email protected]>
Fri, 7 Sep 2018 15:36:08 +0000 (00:36 +0900)
committerDominique Martinet <[email protected]>
Fri, 7 Sep 2018 16:52:29 +0000 (01:52 +0900)
strcpy to dirent->d_name could overflow the buffer, use strscpy to check
the provided string length and error out if the size was too big.

While we are here, make the function return an error when the pdu
parsing failed, instead of returning the pdu offset as if it had been a
success...

Link: http://lkml.kernel.org/r/[email protected]
Addresses-Coverity-ID: 139133 ("Copy into fixed size buffer")
Signed-off-by: Dominique Martinet <[email protected]>
net/9p/protocol.c

index b4d80c533f897915fbb980fc13638f859f75acf3..462ba144cb3934d6761a66c84f7d332f0559c804 100644 (file)
@@ -623,13 +623,19 @@ int p9dirent_read(struct p9_client *clnt, char *buf, int len,
        if (ret) {
                p9_debug(P9_DEBUG_9P, "<<< p9dirent_read failed: %d\n", ret);
                trace_9p_protocol_dump(clnt, &fake_pdu);
-               goto out;
+               return ret;
        }
 
-       strcpy(dirent->d_name, nameptr);
+       ret = strscpy(dirent->d_name, nameptr, sizeof(dirent->d_name));
+       if (ret < 0) {
+               p9_debug(P9_DEBUG_ERROR,
+                        "On the wire dirent name too long: %s\n",
+                        nameptr);
+               kfree(nameptr);
+               return ret;
+       }
        kfree(nameptr);
 
-out:
        return fake_pdu.offset;
 }
 EXPORT_SYMBOL(p9dirent_read);
This page took 0.061398 seconds and 4 git commands to generate.