cifs: change CIFSSMBUnixQuerySymLink to use new helpers
authorJeff Layton <jlayton@redhat.com>
Thu, 30 Apr 2009 11:17:56 +0000 (07:17 -0400)
committerSteve French <sfrench@us.ibm.com>
Thu, 30 Apr 2009 15:45:00 +0000 (15:45 +0000)
Change CIFSSMBUnixQuerySymLink to use the new unicode helper functions.
Also change the calling conventions so that the allocation of the target
name buffer is done in CIFSSMBUnixQuerySymLink rather than by the caller.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Acked-by: Suresh Jayaraman <sjayaraman@suse.de>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifsproto.h
fs/cifs/cifssmb.c
fs/cifs/link.c

index 4167716d32f26d7ee1c9e0d040ac93e5f28546dc..7d54a5a4dd555e76f62dfd3d2f741231ac0b84c7 100644 (file)
@@ -260,8 +260,7 @@ extern int CIFSUnixCreateSymLink(const int xid,
                        const struct nls_table *nls_codepage);
 extern int CIFSSMBUnixQuerySymLink(const int xid,
                        struct cifsTconInfo *tcon,
-                       const unsigned char *searchName,
-                       char *syminfo, const int buflen,
+                       const unsigned char *searchName, char **syminfo,
                        const struct nls_table *nls_codepage);
 extern int CIFSSMBQueryReparseLinkInfo(const int xid,
                        struct cifsTconInfo *tcon,
index f15848374cfa1a8897db63c81ea6cf7e2bdacce5..dfb8e391d538418f0da7a77c5f7005e3c2237689 100644 (file)
@@ -2382,8 +2382,7 @@ winCreateHardLinkRetry:
 
 int
 CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
-                       const unsigned char *searchName,
-                       char *symlinkinfo, const int buflen,
+                       const unsigned char *searchName, char **symlinkinfo,
                        const struct nls_table *nls_codepage)
 {
 /* SMB_QUERY_FILE_UNIX_LINK */
@@ -2393,6 +2392,7 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
        int bytes_returned;
        int name_len;
        __u16 params, byte_count;
+       char *data_start;
 
        cFYI(1, ("In QPathSymLinkInfo (Unix) for path %s", searchName));
 
@@ -2447,30 +2447,22 @@ querySymLinkRetry:
                /* decode response */
 
                rc = validate_t2((struct smb_t2_rsp *)pSMBr);
-               if (rc || (pSMBr->ByteCount < 2))
                /* BB also check enough total bytes returned */
-                       rc = -EIO;      /* bad smb */
+               if (rc || (pSMBr->ByteCount < 2))
+                       rc = -EIO;
                else {
-                       __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
-                       __u16 count = le16_to_cpu(pSMBr->t2.DataCount);
+                       u16 count = le16_to_cpu(pSMBr->t2.DataCount);
+
+                       data_start = ((char *) &pSMBr->hdr.Protocol) +
+                                          le16_to_cpu(pSMBr->t2.DataOffset);
 
-                       if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
-                               name_len = UniStrnlen((wchar_t *) ((char *)
-                                       &pSMBr->hdr.Protocol + data_offset),
-                                       min_t(const int, buflen, count) / 2);
                        /* BB FIXME investigate remapping reserved chars here */
-                               cifs_strfromUCS_le(symlinkinfo,
-                                       (__le16 *) ((char *)&pSMBr->hdr.Protocol
-                                                       + data_offset),
-                                       name_len, nls_codepage);
-                       } else {
-                               strncpy(symlinkinfo,
-                                       (char *) &pSMBr->hdr.Protocol +
-                                               data_offset,
-                                       min_t(const int, buflen, count));
-                       }
-                       symlinkinfo[buflen] = 0;
-       /* just in case so calling code does not go off the end of buffer */
+                       *symlinkinfo = cifs_strndup(data_start, count,
+                                                   pSMBr->hdr.Flags2 &
+                                                       SMBFLG2_UNICODE,
+                                                   nls_codepage);
+                       if (!symlinkinfo)
+                               rc = -ENOMEM;
                }
        }
        cifs_buf_release(pSMB);
index 63f644000ce5982320cf1d5de19a88b6e0130173..e17a092f43ec9ec3772d3229583e3687ea866bc7 100644 (file)
@@ -119,16 +119,11 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
        full_path = build_path_from_dentry(direntry);
 
        if (!full_path)
-               goto out_no_free;
+               goto out;
 
        cFYI(1, ("Full path: %s inode = 0x%p", full_path, inode));
        cifs_sb = CIFS_SB(inode->i_sb);
        pTcon = cifs_sb->tcon;
-       target_path = kmalloc(PATH_MAX, GFP_KERNEL);
-       if (!target_path) {
-               target_path = ERR_PTR(-ENOMEM);
-               goto out;
-       }
 
        /* We could change this to:
                if (pTcon->unix_ext)
@@ -138,8 +133,7 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
 
        if (pTcon->ses->capabilities & CAP_UNIX)
                rc = CIFSSMBUnixQuerySymLink(xid, pTcon, full_path,
-                                            target_path,
-                                            PATH_MAX-1,
+                                            &target_path,
                                             cifs_sb->local_nls);
        else {
                /* BB add read reparse point symlink code here */
@@ -148,22 +142,16 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
                /* BB Add MAC style xsymlink check here if enabled */
        }
 
-       if (rc == 0) {
-
-/* BB Add special case check for Samba DFS symlinks */
-
-               target_path[PATH_MAX-1] = 0;
-       } else {
+       if (rc != 0) {
                kfree(target_path);
                target_path = ERR_PTR(rc);
        }
 
-out:
        kfree(full_path);
-out_no_free:
+out:
        FreeXid(xid);
        nd_set_link(nd, target_path);
-       return NULL;    /* No cookie */
+       return NULL;
 }
 
 int