Skip to content

Commit b5e5f9d

Browse files
namjaejeonsmfrench
authored andcommitted
ksmbd: check invalid FileOffset and BeyondFinalZero in FSCTL_ZERO_DATA
FileOffset should not be greater than BeyondFinalZero in FSCTL_ZERO_DATA. And don't call ksmbd_vfs_zero_data() if length is zero. Cc: [email protected] Reviewed-by: Hyunchul Lee <[email protected]> Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 18e39fb commit b5e5f9d

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

fs/ksmbd/smb2pdu.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7700,7 +7700,7 @@ int smb2_ioctl(struct ksmbd_work *work)
77007700
{
77017701
struct file_zero_data_information *zero_data;
77027702
struct ksmbd_file *fp;
7703-
loff_t off, len;
7703+
loff_t off, len, bfz;
77047704

77057705
if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) {
77067706
ksmbd_debug(SMB,
@@ -7717,19 +7717,26 @@ int smb2_ioctl(struct ksmbd_work *work)
77177717
zero_data =
77187718
(struct file_zero_data_information *)&req->Buffer[0];
77197719

7720-
fp = ksmbd_lookup_fd_fast(work, id);
7721-
if (!fp) {
7722-
ret = -ENOENT;
7720+
off = le64_to_cpu(zero_data->FileOffset);
7721+
bfz = le64_to_cpu(zero_data->BeyondFinalZero);
7722+
if (off > bfz) {
7723+
ret = -EINVAL;
77237724
goto out;
77247725
}
77257726

7726-
off = le64_to_cpu(zero_data->FileOffset);
7727-
len = le64_to_cpu(zero_data->BeyondFinalZero) - off;
7727+
len = bfz - off;
7728+
if (len) {
7729+
fp = ksmbd_lookup_fd_fast(work, id);
7730+
if (!fp) {
7731+
ret = -ENOENT;
7732+
goto out;
7733+
}
77287734

7729-
ret = ksmbd_vfs_zero_data(work, fp, off, len);
7730-
ksmbd_fd_put(work, fp);
7731-
if (ret < 0)
7732-
goto out;
7735+
ret = ksmbd_vfs_zero_data(work, fp, off, len);
7736+
ksmbd_fd_put(work, fp);
7737+
if (ret < 0)
7738+
goto out;
7739+
}
77337740
break;
77347741
}
77357742
case FSCTL_QUERY_ALLOCATED_RANGES:

0 commit comments

Comments
 (0)