Skip to content

Commit f5f111c

Browse files
Ronnie Sahlbergsmfrench
authored andcommitted
cifs: refactor and clean up arguments in the reparse point parsing
Will be helpful as we improve handling of special file types. Signed-off-by: Ronnie Sahlberg <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent ff2a09e commit f5f111c

File tree

1 file changed

+31
-35
lines changed

1 file changed

+31
-35
lines changed

fs/cifs/smb2ops.c

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2383,11 +2383,6 @@ parse_reparse_posix(struct reparse_posix_data *symlink_buf,
23832383
/* See MS-FSCC 2.1.2.6 for the 'NFS' style reparse tags */
23842384
len = le16_to_cpu(symlink_buf->ReparseDataLength);
23852385

2386-
if (len + sizeof(struct reparse_data_buffer) > plen) {
2387-
cifs_dbg(VFS, "srv returned malformed symlink buffer\n");
2388-
return -EINVAL;
2389-
}
2390-
23912386
if (le64_to_cpu(symlink_buf->InodeType) != NFS_SPECFILE_LNK) {
23922387
cifs_dbg(VFS, "%lld not a supported symlink type\n",
23932388
le64_to_cpu(symlink_buf->InodeType));
@@ -2437,22 +2432,38 @@ parse_reparse_symlink(struct reparse_symlink_data_buffer *symlink_buf,
24372432
}
24382433

24392434
static int
2440-
parse_reparse_point(struct reparse_symlink_data_buffer *buf,
2441-
u32 plen, char **target_path,
2442-
struct cifs_sb_info *cifs_sb)
2435+
parse_reparse_point(struct reparse_data_buffer *buf,
2436+
u32 plen, char **target_path,
2437+
struct cifs_sb_info *cifs_sb)
24432438
{
2444-
/* See MS-FSCC 2.1.2 */
2445-
if (le32_to_cpu(buf->ReparseTag) == IO_REPARSE_TAG_NFS)
2446-
return parse_reparse_posix((struct reparse_posix_data *)buf,
2447-
plen, target_path, cifs_sb);
2448-
else if (le32_to_cpu(buf->ReparseTag) == IO_REPARSE_TAG_SYMLINK)
2449-
return parse_reparse_symlink(buf, plen, target_path,
2450-
cifs_sb);
2439+
if (plen < sizeof(struct reparse_data_buffer)) {
2440+
cifs_dbg(VFS, "reparse buffer is too small. Must be "
2441+
"at least 8 bytes but was %d\n", plen);
2442+
return -EIO;
2443+
}
24512444

2452-
cifs_dbg(VFS, "srv returned invalid symlink buffer tag:%d\n",
2453-
le32_to_cpu(buf->ReparseTag));
2445+
if (plen < le16_to_cpu(buf->ReparseDataLength) +
2446+
sizeof(struct reparse_data_buffer)) {
2447+
cifs_dbg(VFS, "srv returned invalid reparse buf "
2448+
"length: %d\n", plen);
2449+
return -EIO;
2450+
}
24542451

2455-
return -EIO;
2452+
/* See MS-FSCC 2.1.2 */
2453+
switch (le32_to_cpu(buf->ReparseTag)) {
2454+
case IO_REPARSE_TAG_NFS:
2455+
return parse_reparse_posix(
2456+
(struct reparse_posix_data *)buf,
2457+
plen, target_path, cifs_sb);
2458+
case IO_REPARSE_TAG_SYMLINK:
2459+
return parse_reparse_symlink(
2460+
(struct reparse_symlink_data_buffer *)buf,
2461+
plen, target_path, cifs_sb);
2462+
default:
2463+
cifs_dbg(VFS, "srv returned unknown symlink buffer "
2464+
"tag:0x%08x\n", le32_to_cpu(buf->ReparseTag));
2465+
return -EOPNOTSUPP;
2466+
}
24562467
}
24572468

24582469
#define SMB2_SYMLINK_STRUCT_SIZE \
@@ -2581,23 +2592,8 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
25812592
goto querty_exit;
25822593
}
25832594

2584-
if (plen < 8) {
2585-
cifs_dbg(VFS, "reparse buffer is too small. Must be "
2586-
"at least 8 bytes but was %d\n", plen);
2587-
rc = -EIO;
2588-
goto querty_exit;
2589-
}
2590-
2591-
if (plen < le16_to_cpu(reparse_buf->ReparseDataLength) + 8) {
2592-
cifs_dbg(VFS, "srv returned invalid reparse buf "
2593-
"length: %d\n", plen);
2594-
rc = -EIO;
2595-
goto querty_exit;
2596-
}
2597-
2598-
rc = parse_reparse_point(
2599-
(struct reparse_symlink_data_buffer *)reparse_buf,
2600-
plen, target_path, cifs_sb);
2595+
rc = parse_reparse_point(reparse_buf, plen, target_path,
2596+
cifs_sb);
26012597
goto querty_exit;
26022598
}
26032599

0 commit comments

Comments
 (0)