aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifssmb.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r--fs/cifs/cifssmb.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index f15848374cfa..dfb8e391d538 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -2382,8 +2382,7 @@ winCreateHardLinkRetry:
2382 2382
2383int 2383int
2384CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon, 2384CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
2385 const unsigned char *searchName, 2385 const unsigned char *searchName, char **symlinkinfo,
2386 char *symlinkinfo, const int buflen,
2387 const struct nls_table *nls_codepage) 2386 const struct nls_table *nls_codepage)
2388{ 2387{
2389/* SMB_QUERY_FILE_UNIX_LINK */ 2388/* SMB_QUERY_FILE_UNIX_LINK */
@@ -2393,6 +2392,7 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
2393 int bytes_returned; 2392 int bytes_returned;
2394 int name_len; 2393 int name_len;
2395 __u16 params, byte_count; 2394 __u16 params, byte_count;
2395 char *data_start;
2396 2396
2397 cFYI(1, ("In QPathSymLinkInfo (Unix) for path %s", searchName)); 2397 cFYI(1, ("In QPathSymLinkInfo (Unix) for path %s", searchName));
2398 2398
@@ -2447,30 +2447,22 @@ querySymLinkRetry:
2447 /* decode response */ 2447 /* decode response */
2448 2448
2449 rc = validate_t2((struct smb_t2_rsp *)pSMBr); 2449 rc = validate_t2((struct smb_t2_rsp *)pSMBr);
2450 if (rc || (pSMBr->ByteCount < 2))
2451 /* BB also check enough total bytes returned */ 2450 /* BB also check enough total bytes returned */
2452 rc = -EIO; /* bad smb */ 2451 if (rc || (pSMBr->ByteCount < 2))
2452 rc = -EIO;
2453 else { 2453 else {
2454 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); 2454 u16 count = le16_to_cpu(pSMBr->t2.DataCount);
2455 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); 2455
2456 data_start = ((char *) &pSMBr->hdr.Protocol) +
2457 le16_to_cpu(pSMBr->t2.DataOffset);
2456 2458
2457 if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
2458 name_len = UniStrnlen((wchar_t *) ((char *)
2459 &pSMBr->hdr.Protocol + data_offset),
2460 min_t(const int, buflen, count) / 2);
2461 /* BB FIXME investigate remapping reserved chars here */ 2459 /* BB FIXME investigate remapping reserved chars here */
2462 cifs_strfromUCS_le(symlinkinfo, 2460 *symlinkinfo = cifs_strndup(data_start, count,
2463 (__le16 *) ((char *)&pSMBr->hdr.Protocol 2461 pSMBr->hdr.Flags2 &
2464 + data_offset), 2462 SMBFLG2_UNICODE,
2465 name_len, nls_codepage); 2463 nls_codepage);
2466 } else { 2464 if (!symlinkinfo)
2467 strncpy(symlinkinfo, 2465 rc = -ENOMEM;
2468 (char *) &pSMBr->hdr.Protocol +
2469 data_offset,
2470 min_t(const int, buflen, count));
2471 }
2472 symlinkinfo[buflen] = 0;
2473 /* just in case so calling code does not go off the end of buffer */
2474 } 2466 }
2475 } 2467 }
2476 cifs_buf_release(pSMB); 2468 cifs_buf_release(pSMB);