mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
ksmbd: fix CreateOptions sanitization clobbering the whole field
smb2_open() attempts to clear conflicting CreateOptions bits (FILE_SEQUENTIAL_ONLY_LE together with FILE_RANDOM_ACCESS_LE, and FILE_NO_COMPRESSION_LE on a directory open), but uses a plain assignment of the bitwise negation of the target flag: req->CreateOptions = ~(FILE_SEQUENTIAL_ONLY_LE); req->CreateOptions = ~(FILE_NO_COMPRESSION_LE); This replaces the entire field with 0xFFFFFFFB / 0xFFFFFFEF rather than clearing a single bit. With the SEQUENTIAL/RANDOM case, the next check for FILE_OPEN_BY_FILE_ID_LE | CREATE_TREE_CONNECTION | FILE_RESERVE_OPFILTER_LE then trivially matches and a legitimate request is rejected with -EOPNOTSUPP. With the NO_COMPRESSION case, every downstream test (FILE_DELETE_ON_CLOSE, etc.) operates on a corrupted CreateOptions value. Use &= ~FLAG to clear only the intended bit in both places. Signed-off-by: DaeMyung Kang <charsyam@gmail.com> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
804054d198
commit
5d115fa840
|
|
@ -3057,7 +3057,7 @@ int smb2_open(struct ksmbd_work *work)
|
|||
} else {
|
||||
if (req->CreateOptions & FILE_SEQUENTIAL_ONLY_LE &&
|
||||
req->CreateOptions & FILE_RANDOM_ACCESS_LE)
|
||||
req->CreateOptions = ~(FILE_SEQUENTIAL_ONLY_LE);
|
||||
req->CreateOptions &= ~FILE_SEQUENTIAL_ONLY_LE;
|
||||
|
||||
if (req->CreateOptions &
|
||||
(FILE_OPEN_BY_FILE_ID_LE | CREATE_TREE_CONNECTION |
|
||||
|
|
@ -3071,7 +3071,7 @@ int smb2_open(struct ksmbd_work *work)
|
|||
rc = -EINVAL;
|
||||
goto err_out2;
|
||||
} else if (req->CreateOptions & FILE_NO_COMPRESSION_LE) {
|
||||
req->CreateOptions = ~(FILE_NO_COMPRESSION_LE);
|
||||
req->CreateOptions &= ~FILE_NO_COMPRESSION_LE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user