Skip to content

Commit 9a3dad6

Browse files
committed
Merge tag '6.6-rc5-ksmbd-server-fixes' of git://git.samba.org/ksmbd
Pull smb server fixes from Steve French: - Fix for possible double free in RPC read - Add additional check to clarify smb2_open path and quiet Coverity - Fix incorrect error rsp in a compounding path - Fix to properly fail open of file with pending delete on close * tag '6.6-rc5-ksmbd-server-fixes' of git://git.samba.org/ksmbd: ksmbd: fix potential double free on smb2_read_pipe() error path ksmbd: fix Null pointer dereferences in ksmbd_update_fstate() ksmbd: fix wrong error response status by using set_smb2_rsp_status() ksmbd: not allow to open file if delelete on close bit is set
2 parents bf2069d + 1903e6d commit 9a3dad6

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

fs/smb/server/smb2pdu.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,11 +231,12 @@ void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err)
231231
{
232232
struct smb2_hdr *rsp_hdr;
233233

234-
if (work->next_smb2_rcv_hdr_off)
235-
rsp_hdr = ksmbd_resp_buf_next(work);
236-
else
237-
rsp_hdr = smb2_get_msg(work->response_buf);
234+
rsp_hdr = smb2_get_msg(work->response_buf);
238235
rsp_hdr->Status = err;
236+
237+
work->iov_idx = 0;
238+
work->iov_cnt = 0;
239+
work->next_smb2_rcv_hdr_off = 0;
239240
smb2_set_err_rsp(work);
240241
}
241242

@@ -6151,12 +6152,12 @@ static noinline int smb2_read_pipe(struct ksmbd_work *work)
61516152
memcpy(aux_payload_buf, rpc_resp->payload, rpc_resp->payload_sz);
61526153

61536154
nbytes = rpc_resp->payload_sz;
6154-
kvfree(rpc_resp);
61556155
err = ksmbd_iov_pin_rsp_read(work, (void *)rsp,
61566156
offsetof(struct smb2_read_rsp, Buffer),
61576157
aux_payload_buf, nbytes);
61586158
if (err)
61596159
goto out;
6160+
kvfree(rpc_resp);
61606161
} else {
61616162
err = ksmbd_iov_pin_rsp(work, (void *)rsp,
61626163
offsetof(struct smb2_read_rsp, Buffer));

fs/smb/server/vfs_cache.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ int ksmbd_query_inode_status(struct inode *inode)
106106
ci = __ksmbd_inode_lookup(inode);
107107
if (ci) {
108108
ret = KSMBD_INODE_STATUS_OK;
109-
if (ci->m_flags & S_DEL_PENDING)
109+
if (ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS))
110110
ret = KSMBD_INODE_STATUS_PENDING_DELETE;
111111
atomic_dec(&ci->m_count);
112112
}
@@ -116,7 +116,7 @@ int ksmbd_query_inode_status(struct inode *inode)
116116

117117
bool ksmbd_inode_pending_delete(struct ksmbd_file *fp)
118118
{
119-
return (fp->f_ci->m_flags & S_DEL_PENDING);
119+
return (fp->f_ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS));
120120
}
121121

122122
void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp)
@@ -603,6 +603,9 @@ struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp)
603603
void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp,
604604
unsigned int state)
605605
{
606+
if (!fp)
607+
return;
608+
606609
write_lock(&ft->lock);
607610
fp->f_state = state;
608611
write_unlock(&ft->lock);

0 commit comments

Comments
 (0)