History

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.

Namjae Jeon committed 4 years ago

Commit b5e5f9d1 parent 18e39fb1 file · +17 −10Browse files

Unified · Split

fs/ksmbd/smb2pdu.c+17−10
@@ -7700,7 +7700,7 @@ int smb2_ioctl(struct ksmbd_work *work) · 7699 unmodified lines
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) · 10 unmodified lines
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:

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t