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