s3: client: Add new utility function client_clean_name().
authorJeremy Allison <jra@samba.org>
Sat, 21 Oct 2017 00:08:08 +0000 (00:08 +0000)
committerJeremy Allison <jra@samba.org>
Tue, 24 Oct 2017 17:35:08 +0000 (19:35 +0200)
Correctly canonicalizes a remote pathname removing '..'
elements before sending to a remote server. '..' elements
work in SMB1 pathnames, but not in SMB2.

Not yet used.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13093

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/client/client.c
source3/client/client_proto.h

index df16496ff86a862d0a223a2fcc51112007c4d5dc..8cc511983cb385e000ae364d0e7b20a4e4714159 100644 (file)
@@ -345,6 +345,37 @@ static void normalize_name(char *newdir)
        }
 }
 
+/****************************************************************************
+ Local name cleanup before sending to server. SMB1 allows relative pathnames,
+ but SMB2 does not, so we need to resolve them locally.
+****************************************************************************/
+
+char *client_clean_name(TALLOC_CTX *ctx, const char *name)
+{
+       char *newname = NULL;
+       if (name == NULL) {
+               return NULL;
+       }
+
+       /* First ensure any path separators are correct. */
+       newname = talloc_strdup(ctx, name);
+       if (newname == NULL) {
+               return NULL;
+       }
+       normalize_name(newname);
+
+       /* Now remove any relative (..) path components. */
+       if (cli->requested_posix_capabilities & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
+               newname = unix_clean_name(ctx, newname);
+       } else {
+               newname = clean_name(ctx, newname);
+       }
+       if (newname == NULL) {
+               return NULL;
+       }
+       return newname;
+}
+
 /****************************************************************************
  Change directory - inner section.
 ****************************************************************************/
index d3d40363f20cd524e98dfdd8664c9a71a23d43f4..38f13aa0adc85bb26dffe79fea5ef5c97144f9a9 100644 (file)
@@ -35,6 +35,7 @@ enum {
 
 const char *client_get_cur_dir(void);
 const char *client_set_cur_dir(const char *newdir);
+char *client_clean_name(TALLOC_CTX *ctx, const char *name);
 NTSTATUS do_list(const char *mask,
                        uint16_t attribute,
                        NTSTATUS (*fn)(struct cli_state *cli_state, struct file_info *,