cifsd: Handle ksmbd_session_rpc_open() failure in create_smb2_pipe()
authorMarios Makassikis <mmakassikis@freebox.fr>
Thu, 6 May 2021 02:38:35 +0000 (11:38 +0900)
committerSteve French <stfrench@microsoft.com>
Tue, 11 May 2021 00:15:47 +0000 (19:15 -0500)
Currently, a SMB2 client does not receive an error message if
ksmbd_session_rpc_open() fails when opening a pipe.
Fix this by responding with STATUS_NO_MEMORY or STATUS_INVALID_PARAMETER
depending on the error that occurred.

Signed-off-by: Marios Makassikis <mmakassikis@freebox.fr>
Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifsd/smb2pdu.c

index e5aff1ca11e1d43f0f972a77d4722be8cc876233..fec385318ff34d7976b4b0a0ad0e879f42ae75a7 100644 (file)
@@ -1917,9 +1917,13 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
        }
 
        id = ksmbd_session_rpc_open(work->sess, name);
-       if (id < 0)
+       if (id < 0) {
                ksmbd_err("Unable to open RPC pipe: %d\n", id);
+               err = id;
+               goto out;
+       }
 
+       rsp->hdr.Status = STATUS_SUCCESS;
        rsp->StructureSize = cpu_to_le16(89);
        rsp->OplockLevel = SMB2_OPLOCK_LEVEL_NONE;
        rsp->Reserved = 0;
@@ -1942,6 +1946,19 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
        return 0;
 
 out:
+       switch (err) {
+       case -EINVAL:
+               rsp->hdr.Status = STATUS_INVALID_PARAMETER;
+               break;
+       case -ENOSPC:
+       case -ENOMEM:
+               rsp->hdr.Status = STATUS_NO_MEMORY;
+               break;
+       }
+
+       if (!IS_ERR(name))
+               kfree(name);
+
        smb2_set_err_rsp(work);
        return err;
 }