mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
two ksmbd server fixes
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmaJwEYACgkQiiy9cAdy T1EPaQwAufRbLgmhf0mXUhRukYFIWwAyPOvMEov9vr6uWAmIaqxb2ggmgxwolulS oEheMyoE+nDRzUFnPv+QY/ihV66Eqq2A83oSW/JVc+WAhiyLG7hWKWdHr2IxEG87 IJA9oJVWoYBQVpINozibwN0qONr8AU6B0jIGZ7+MzU3e09ARLf6OltfXWjLZT68K xK5fqcZErF+wawnk26u/FRmd81vD3zhRAIqGFIt7E62ngedTsWvqqn7Dx5MDI28a KkgO8hudyhULGZk8qI/pN/8+vBFJlMdTWaWN9410ucpoQ+5G4M0quOsqzn5DxbWw 0lnBAgDvR1jwyU4cUj4Dgb0TnG/ABiuVQebz82LeIoisItSPenNyKc5FRfry/OFN PJFvWoUvYGFXUtSkdmLwLeWppTVvpL8vxyk+OPx3URwheqCiaQHN/l3xSBqLIldw 4uPL+grt9zeKOvMvsBFfN+2eiUeC3foZkg4RKucs5aSPJtHra4w6zhvfsuJosNsW XgIRM19F =eUKV -----END PGP SIGNATURE----- Merge tag '6.10-rc6-smb3-server-fixes' of git://git.samba.org/ksmbd Pull smb server fixes from Steve French: - fix access flags to address fuse incompatibility - fix device type returned by get filesystem info * tag '6.10-rc6-smb3-server-fixes' of git://git.samba.org/ksmbd: ksmbd: discard write access to the directory open ksmbd: return FILE_DEVICE_DISK instead of super magic
This commit is contained in:
commit
34afb82a3c
@ -917,6 +917,40 @@ struct smb2_query_directory_rsp {
|
||||
__u8 Buffer[];
|
||||
} __packed;
|
||||
|
||||
/* DeviceType Flags */
|
||||
#define FILE_DEVICE_CD_ROM 0x00000002
|
||||
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
|
||||
#define FILE_DEVICE_DFS 0x00000006
|
||||
#define FILE_DEVICE_DISK 0x00000007
|
||||
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
|
||||
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
|
||||
#define FILE_DEVICE_NAMED_PIPE 0x00000011
|
||||
#define FILE_DEVICE_NETWORK 0x00000012
|
||||
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
|
||||
#define FILE_DEVICE_NULL 0x00000015
|
||||
#define FILE_DEVICE_PARALLEL_PORT 0x00000016
|
||||
#define FILE_DEVICE_PRINTER 0x00000018
|
||||
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
|
||||
#define FILE_DEVICE_STREAMS 0x0000001e
|
||||
#define FILE_DEVICE_TAPE 0x0000001f
|
||||
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
|
||||
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
|
||||
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
|
||||
|
||||
/* Device Characteristics */
|
||||
#define FILE_REMOVABLE_MEDIA 0x00000001
|
||||
#define FILE_READ_ONLY_DEVICE 0x00000002
|
||||
#define FILE_FLOPPY_DISKETTE 0x00000004
|
||||
#define FILE_WRITE_ONCE_MEDIA 0x00000008
|
||||
#define FILE_REMOTE_DEVICE 0x00000010
|
||||
#define FILE_DEVICE_IS_MOUNTED 0x00000020
|
||||
#define FILE_VIRTUAL_VOLUME 0x00000040
|
||||
#define FILE_DEVICE_SECURE_OPEN 0x00000100
|
||||
#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
|
||||
#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
|
||||
#define FILE_PORTABLE_DEVICE 0x00004000
|
||||
#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
|
||||
|
||||
/*
|
||||
* Maximum number of iovs we need for a set-info request.
|
||||
* The largest one is rename/hardlink
|
||||
|
@ -2051,15 +2051,22 @@ out_err1:
|
||||
* @access: file access flags
|
||||
* @disposition: file disposition flags
|
||||
* @may_flags: set with MAY_ flags
|
||||
* @is_dir: is creating open flags for directory
|
||||
*
|
||||
* Return: file open flags
|
||||
*/
|
||||
static int smb2_create_open_flags(bool file_present, __le32 access,
|
||||
__le32 disposition,
|
||||
int *may_flags)
|
||||
int *may_flags,
|
||||
bool is_dir)
|
||||
{
|
||||
int oflags = O_NONBLOCK | O_LARGEFILE;
|
||||
|
||||
if (is_dir) {
|
||||
access &= ~FILE_WRITE_DESIRE_ACCESS_LE;
|
||||
ksmbd_debug(SMB, "Discard write access to a directory\n");
|
||||
}
|
||||
|
||||
if (access & FILE_READ_DESIRED_ACCESS_LE &&
|
||||
access & FILE_WRITE_DESIRE_ACCESS_LE) {
|
||||
oflags |= O_RDWR;
|
||||
@ -3167,7 +3174,9 @@ int smb2_open(struct ksmbd_work *work)
|
||||
|
||||
open_flags = smb2_create_open_flags(file_present, daccess,
|
||||
req->CreateDisposition,
|
||||
&may_flags);
|
||||
&may_flags,
|
||||
req->CreateOptions & FILE_DIRECTORY_FILE_LE ||
|
||||
(file_present && S_ISDIR(d_inode(path.dentry)->i_mode)));
|
||||
|
||||
if (!test_tree_conn_flag(tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) {
|
||||
if (open_flags & (O_CREAT | O_TRUNC)) {
|
||||
@ -5314,8 +5323,13 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
|
||||
|
||||
info = (struct filesystem_device_info *)rsp->Buffer;
|
||||
|
||||
info->DeviceType = cpu_to_le32(stfs.f_type);
|
||||
info->DeviceCharacteristics = cpu_to_le32(0x00000020);
|
||||
info->DeviceType = cpu_to_le32(FILE_DEVICE_DISK);
|
||||
info->DeviceCharacteristics =
|
||||
cpu_to_le32(FILE_DEVICE_IS_MOUNTED);
|
||||
if (!test_tree_conn_flag(work->tcon,
|
||||
KSMBD_TREE_CONN_FLAG_WRITABLE))
|
||||
info->DeviceCharacteristics |=
|
||||
cpu_to_le32(FILE_READ_ONLY_DEVICE);
|
||||
rsp->OutputBufferLength = cpu_to_le32(8);
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user