ksmbd: Return STATUS_OBJECT_PATH_NOT_FOUND if smb2_creat() returns ENOENT
authorMarios Makassikis <mmakassikis@freebox.fr>
Tue, 27 Jul 2021 00:24:51 +0000 (09:24 +0900)
committerNamjae Jeon <namjae.jeon@samsung.com>
Tue, 27 Jul 2021 00:26:24 +0000 (09:26 +0900)
Both Windows 10's SMB server and samba return STATUS_OBJECT_PATH_NOT_FOUND
when trying to access a nonexistent path.

This fixes Windows 10 File History tool. The latter relies on the server
returning STATUS_OBJECT_PATH_NOT_FOUND to figure out what part of the
target path needs to be created. Returning STATUS_OBJECT_NAME_INVALID
will make it stop and display an error to the user.

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/ksmbd/smb2pdu.c

index 7e6e3d8c20e8d89b13c81548e07ea327a2838259..1b1f34d9d1a09f146799f119283797d4e2ff06d6 100644 (file)
@@ -2768,8 +2768,13 @@ int smb2_open(struct ksmbd_work *work)
        if (!file_present) {
                rc = smb2_creat(work, &path, name, open_flags, posix_mode,
                                req->CreateOptions & FILE_DIRECTORY_FILE_LE);
-               if (rc)
+               if (rc) {
+                       if (rc == -ENOENT) {
+                               rc = -EIO;
+                               rsp->hdr.Status = STATUS_OBJECT_PATH_NOT_FOUND;
+                       }
                        goto err_out;
+               }
 
                created = true;
                user_ns = mnt_user_ns(path.mnt);