mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 21:35:07 +00:00
5 smb3 server fixes
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmb2y3gACgkQiiy9cAdy T1EATQwAwQTCQSd916VK4HPzphM/lJLaxNCNNV0AY8QNXsUxhBxQny2FJ+jilFZU y4G5/zSi8+PX0YtyrPJqtofbFX+eeD6eKRCFT/1YEEkwEYp53mjsCIHWidSPGh6X S2du6tAebSCQSqlHv5zlTpL24UVhi6amse7aJyXs8v7JZO9ZjtEE0D+a1xqSV4kt 0+6/W3RM49HTEAql7TavduNR3UcesYg2KS48qNVvGhHhY3wcGe92mZ0Sr4NUStfg IjtpfsxxBJWKiXDJhGBN8M/O6jqBtE++O/CyDknYGOs6M7QtPJ1xtXpESlq+OgWV JEqNorZI4qvl/5PbY/1+6wJDY3ogv2DhwyRaOdhtVc5CgF1JGLKW4lVBGBIrQz2B dyHbiGAXEA+Rm7/8UkyFZRmvbmLXDqRM7AEyLrXoeS5Vw51RxS6CT0oDesVGVsdX +koQ1OQ55AiR1TXhasDj6XvmFAyYKuEPh/qhBz1jEBX8unyhIUUVrG3CnMULl3rY FWbdmtDB =4ons -----END PGP SIGNATURE----- Merge tag 'v6.12-rc-ksmbd-server-fixes' of git://git.samba.org/ksmbd Pull smb server fixes from Steve French: - fix querying dentry for char/block special files - small cleanup patches * tag 'v6.12-rc-ksmbd-server-fixes' of git://git.samba.org/ksmbd: ksmbd: Correct typos in multiple comments across various files ksmbd: fix open failure from block and char device file ksmbd: remove unsafe_memcpy use in session setup ksmbd: Replace one-element arrays with flexible-array members ksmbd: fix warning: comparison of distinct pointer types lacks a cast
This commit is contained in:
commit
9717d53438
@ -6,7 +6,7 @@
|
||||
* Note that, due to trying to use names similar to the protocol specifications,
|
||||
* there are many mixed case field names in the structures below. Although
|
||||
* this does not match typical Linux kernel style, it is necessary to be
|
||||
* able to match against the protocol specfication.
|
||||
* able to match against the protocol specification.
|
||||
*
|
||||
* SMB2 commands
|
||||
* Some commands have minimal (wct=0,bcc=0), or uninteresting, responses
|
||||
@ -491,7 +491,7 @@ struct smb2_encryption_neg_context {
|
||||
__le16 ContextType; /* 2 */
|
||||
__le16 DataLength;
|
||||
__le32 Reserved;
|
||||
/* CipherCount usally 2, but can be 3 when AES256-GCM enabled */
|
||||
/* CipherCount usually 2, but can be 3 when AES256-GCM enabled */
|
||||
__le16 CipherCount; /* AES128-GCM and AES128-CCM by default */
|
||||
__le16 Ciphers[];
|
||||
} __packed;
|
||||
@ -1061,7 +1061,7 @@ struct smb2_server_client_notification {
|
||||
#define IL_IMPERSONATION cpu_to_le32(0x00000002)
|
||||
#define IL_DELEGATE cpu_to_le32(0x00000003)
|
||||
|
||||
/* File Attrubutes */
|
||||
/* File Attributes */
|
||||
#define FILE_ATTRIBUTE_READONLY 0x00000001
|
||||
#define FILE_ATTRIBUTE_HIDDEN 0x00000002
|
||||
#define FILE_ATTRIBUTE_SYSTEM 0x00000004
|
||||
|
@ -25,7 +25,7 @@ DECLARE_RWSEM(conn_list_lock);
|
||||
/**
|
||||
* ksmbd_conn_free() - free resources of the connection instance
|
||||
*
|
||||
* @conn: connection instance to be cleand up
|
||||
* @conn: connection instance to be cleaned up
|
||||
*
|
||||
* During the thread termination, the corresponding conn instance
|
||||
* resources(sock/memory) are released and finally the conn object is freed.
|
||||
|
@ -213,7 +213,7 @@ struct ksmbd_tree_connect_response {
|
||||
};
|
||||
|
||||
/*
|
||||
* IPC Request struture to disconnect tree connection.
|
||||
* IPC Request structure to disconnect tree connection.
|
||||
*/
|
||||
struct ksmbd_tree_disconnect_request {
|
||||
__u64 session_id; /* session id */
|
||||
|
@ -796,7 +796,7 @@ out:
|
||||
/**
|
||||
* smb2_lease_break_noti() - break lease when a new client request
|
||||
* write lease
|
||||
* @opinfo: conains lease state information
|
||||
* @opinfo: contains lease state information
|
||||
*
|
||||
* Return: 0 on success, otherwise error
|
||||
*/
|
||||
@ -1484,7 +1484,7 @@ void create_lease_buf(u8 *rbuf, struct lease *lease)
|
||||
}
|
||||
|
||||
/**
|
||||
* parse_lease_state() - parse lease context containted in file open request
|
||||
* parse_lease_state() - parse lease context contained in file open request
|
||||
* @open_req: buffer containing smb2 file open(create) request
|
||||
*
|
||||
* Return: allocated lease context object on success, otherwise NULL
|
||||
|
@ -279,7 +279,7 @@ static void handle_ksmbd_work(struct work_struct *wk)
|
||||
|
||||
/**
|
||||
* queue_ksmbd_work() - queue a smb request to worker thread queue
|
||||
* for proccessing smb command and sending response
|
||||
* for processing smb command and sending response
|
||||
* @conn: connection instance
|
||||
*
|
||||
* read remaining data from socket create and submit work.
|
||||
|
@ -1335,8 +1335,7 @@ static int ntlm_negotiate(struct ksmbd_work *work,
|
||||
return rc;
|
||||
|
||||
sz = le16_to_cpu(rsp->SecurityBufferOffset);
|
||||
chgblob =
|
||||
(struct challenge_message *)((char *)&rsp->hdr.ProtocolId + sz);
|
||||
chgblob = (struct challenge_message *)rsp->Buffer;
|
||||
memset(chgblob, 0, sizeof(struct challenge_message));
|
||||
|
||||
if (!work->conn->use_spnego) {
|
||||
@ -1369,9 +1368,7 @@ static int ntlm_negotiate(struct ksmbd_work *work,
|
||||
goto out;
|
||||
}
|
||||
|
||||
sz = le16_to_cpu(rsp->SecurityBufferOffset);
|
||||
unsafe_memcpy((char *)&rsp->hdr.ProtocolId + sz, spnego_blob, spnego_blob_len,
|
||||
/* alloc is larger than blob, see smb2_allocate_rsp_buf() */);
|
||||
memcpy(rsp->Buffer, spnego_blob, spnego_blob_len);
|
||||
rsp->SecurityBufferLength = cpu_to_le16(spnego_blob_len);
|
||||
|
||||
out:
|
||||
@ -1453,10 +1450,7 @@ static int ntlm_authenticate(struct ksmbd_work *work,
|
||||
if (rc)
|
||||
return -ENOMEM;
|
||||
|
||||
sz = le16_to_cpu(rsp->SecurityBufferOffset);
|
||||
unsafe_memcpy((char *)&rsp->hdr.ProtocolId + sz, spnego_blob,
|
||||
spnego_blob_len,
|
||||
/* alloc is larger than blob, see smb2_allocate_rsp_buf() */);
|
||||
memcpy(rsp->Buffer, spnego_blob, spnego_blob_len);
|
||||
rsp->SecurityBufferLength = cpu_to_le16(spnego_blob_len);
|
||||
kfree(spnego_blob);
|
||||
}
|
||||
@ -2058,18 +2052,20 @@ out_err1:
|
||||
* @access: file access flags
|
||||
* @disposition: file disposition flags
|
||||
* @may_flags: set with MAY_ flags
|
||||
* @is_dir: is creating open flags for directory
|
||||
* @coptions: file creation options
|
||||
* @mode: file mode
|
||||
*
|
||||
* Return: file open flags
|
||||
*/
|
||||
static int smb2_create_open_flags(bool file_present, __le32 access,
|
||||
__le32 disposition,
|
||||
int *may_flags,
|
||||
bool is_dir)
|
||||
__le32 coptions,
|
||||
umode_t mode)
|
||||
{
|
||||
int oflags = O_NONBLOCK | O_LARGEFILE;
|
||||
|
||||
if (is_dir) {
|
||||
if (coptions & FILE_DIRECTORY_FILE_LE || S_ISDIR(mode)) {
|
||||
access &= ~FILE_WRITE_DESIRE_ACCESS_LE;
|
||||
ksmbd_debug(SMB, "Discard write access to a directory\n");
|
||||
}
|
||||
@ -2086,7 +2082,7 @@ static int smb2_create_open_flags(bool file_present, __le32 access,
|
||||
*may_flags = MAY_OPEN | MAY_READ;
|
||||
}
|
||||
|
||||
if (access == FILE_READ_ATTRIBUTES_LE)
|
||||
if (access == FILE_READ_ATTRIBUTES_LE || S_ISBLK(mode) || S_ISCHR(mode))
|
||||
oflags |= O_PATH;
|
||||
|
||||
if (file_present) {
|
||||
@ -3181,8 +3177,8 @@ int smb2_open(struct ksmbd_work *work)
|
||||
open_flags = smb2_create_open_flags(file_present, daccess,
|
||||
req->CreateDisposition,
|
||||
&may_flags,
|
||||
req->CreateOptions & FILE_DIRECTORY_FILE_LE ||
|
||||
(file_present && S_ISDIR(d_inode(path.dentry)->i_mode)));
|
||||
req->CreateOptions,
|
||||
file_present ? d_inode(path.dentry)->i_mode : 0);
|
||||
|
||||
if (!test_tree_conn_flag(tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) {
|
||||
if (open_flags & (O_CREAT | O_TRUNC)) {
|
||||
@ -3531,8 +3527,9 @@ int smb2_open(struct ksmbd_work *work)
|
||||
memcpy(fp->create_guid, dh_info.CreateGuid,
|
||||
SMB2_CREATE_GUID_SIZE);
|
||||
if (dh_info.timeout)
|
||||
fp->durable_timeout = min(dh_info.timeout,
|
||||
DURABLE_HANDLE_MAX_TIMEOUT);
|
||||
fp->durable_timeout =
|
||||
min_t(unsigned int, dh_info.timeout,
|
||||
DURABLE_HANDLE_MAX_TIMEOUT);
|
||||
else
|
||||
fp->durable_timeout = 60;
|
||||
}
|
||||
@ -4586,7 +4583,7 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
|
||||
path = &fp->filp->f_path;
|
||||
/* single EA entry is requested with given user.* name */
|
||||
if (req->InputBufferLength) {
|
||||
if (le32_to_cpu(req->InputBufferLength) <
|
||||
if (le32_to_cpu(req->InputBufferLength) <=
|
||||
sizeof(struct smb2_ea_info_req))
|
||||
return -EINVAL;
|
||||
|
||||
@ -8090,7 +8087,7 @@ int smb2_ioctl(struct ksmbd_work *work)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (in_buf_len < sizeof(struct copychunk_ioctl_req)) {
|
||||
if (in_buf_len <= sizeof(struct copychunk_ioctl_req)) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ struct copychunk_ioctl_req {
|
||||
__le64 ResumeKey[3];
|
||||
__le32 ChunkCount;
|
||||
__le32 Reserved;
|
||||
__u8 Chunks[1]; /* array of srv_copychunk */
|
||||
__u8 Chunks[]; /* array of srv_copychunk */
|
||||
} __packed;
|
||||
|
||||
struct srv_copychunk {
|
||||
@ -370,7 +370,7 @@ struct smb2_file_attr_tag_info {
|
||||
struct smb2_ea_info_req {
|
||||
__le32 NextEntryOffset;
|
||||
__u8 EaNameLength;
|
||||
char name[1];
|
||||
char name[];
|
||||
} __packed; /* level 15 Query */
|
||||
|
||||
struct smb2_ea_info {
|
||||
|
@ -488,7 +488,7 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
|
||||
* @shortname: destination short filename
|
||||
*
|
||||
* Return: shortname length or 0 when source long name is '.' or '..'
|
||||
* TODO: Though this function comforms the restriction of 8.3 Filename spec,
|
||||
* TODO: Though this function conforms the restriction of 8.3 Filename spec,
|
||||
* but the result is different with Windows 7's one. need to check.
|
||||
*/
|
||||
int ksmbd_extract_shortname(struct ksmbd_conn *conn, const char *longname,
|
||||
|
@ -100,8 +100,8 @@ struct ksmbd_file {
|
||||
struct list_head blocked_works;
|
||||
struct list_head lock_list;
|
||||
|
||||
int durable_timeout;
|
||||
int durable_scavenger_timeout;
|
||||
unsigned int durable_timeout;
|
||||
unsigned int durable_scavenger_timeout;
|
||||
|
||||
/* if ls is happening on directory, below is valid*/
|
||||
struct ksmbd_readdir_data readdir_data;
|
||||
|
@ -99,7 +99,7 @@ struct xattr_ntacl {
|
||||
__u8 posix_acl_hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for posix acl */
|
||||
};
|
||||
|
||||
/* DOS ATTRIBUITE XATTR PREFIX */
|
||||
/* DOS ATTRIBUTE XATTR PREFIX */
|
||||
#define DOS_ATTRIBUTE_PREFIX "DOSATTRIB"
|
||||
#define DOS_ATTRIBUTE_PREFIX_LEN (sizeof(DOS_ATTRIBUTE_PREFIX) - 1)
|
||||
#define XATTR_NAME_DOS_ATTRIBUTE (XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX)
|
||||
|
Loading…
x
Reference in New Issue
Block a user