s4:libcli/raw: add RAW_FILEINFO_NORMALIZED_NAME_INFORMATION support
authorStefan Metzmacher <metze@samba.org>
Thu, 25 Apr 2019 10:12:34 +0000 (12:12 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 1 May 2019 17:22:26 +0000 (17:22 +0000)
This is supported over the wire in SMB 3.1.1 on starting with
Windows 10 1803.

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

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source4/libcli/raw/interfaces.h
source4/libcli/raw/rawfileinfo.c
source4/libcli/raw/trans2.h
source4/ntvfs/ntvfs_generic.c
source4/ntvfs/posix/pvfs_qfileinfo.c
source4/torture/gentest.c

index 19b29197e16444c313631620fffe46b97f288931..2a344f7114849993b89859ba0b17beb0818fb7b1 100644 (file)
@@ -461,6 +461,7 @@ enum smb_fileinfo_level {
                     RAW_FILEINFO_COMPRESSION_INFORMATION    = SMB_QFILEINFO_COMPRESSION_INFORMATION,
                     RAW_FILEINFO_NETWORK_OPEN_INFORMATION   = SMB_QFILEINFO_NETWORK_OPEN_INFORMATION,
                     RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION  = SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION,
+                    RAW_FILEINFO_NORMALIZED_NAME_INFORMATION= SMB_QFILEINFO_NORMALIZED_NAME_INFORMATION,
                     /* SMB2 specific levels */
                     RAW_FILEINFO_SMB2_ALL_EAS               = 0x0f01,
                     RAW_FILEINFO_SMB2_ALL_INFORMATION       = 0x1201
@@ -643,6 +644,8 @@ union smb_fileinfo {
        } ea_info;
 
        /* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */
+       /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */
+       /* RAW_FILEINFO_NORMALIZED_NAME_INFORMATION interface */
        struct {
                enum smb_fileinfo_level level;
                struct {
@@ -651,7 +654,7 @@ union smb_fileinfo {
                struct {
                        struct smb_wire_string fname;
                } out;
-       } name_info;
+       } name_info, alt_name_info, normalized_name_info;
 
        /* RAW_FILEINFO_ALL_INFO and RAW_FILEINFO_ALL_INFORMATION interfaces */
        struct {
@@ -704,17 +707,6 @@ union smb_fileinfo {
                } out;
        } all_info2;
 
-       /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */
-       struct {
-               enum smb_fileinfo_level level;
-               struct {
-                       union smb_handle_or_path file;
-               } in;
-               struct {
-                       struct smb_wire_string fname;
-               } out;
-       } alt_name_info;
-
        /* RAW_FILEINFO_STREAM_INFO and RAW_FILEINFO_STREAM_INFORMATION interfaces */
        struct {
                enum smb_fileinfo_level level;
index 50a6731ba4158d883e40256dac8247885ff08084..a2599085ab7767041a13422d8af1546eca52fb09 100644 (file)
@@ -219,6 +219,13 @@ NTSTATUS smb_raw_fileinfo_passthru_parse(const DATA_BLOB *blob, TALLOC_CTX *mem_
                parms->attribute_tag_information.out.reparse_tag = IVAL(blob->data, 4);
                return NT_STATUS_OK;
 
+       case RAW_FILEINFO_NORMALIZED_NAME_INFORMATION:
+               FINFO_CHECK_MIN_SIZE(4);
+               smbcli_blob_pull_string(NULL, mem_ctx, blob,
+                                       &parms->normalized_name_info.out.fname,
+                                       0, 4, STR_UNICODE);
+               return NT_STATUS_OK;
+
        case RAW_FILEINFO_SMB2_ALL_EAS:
                FINFO_CHECK_MIN_SIZE(4);
                return ea_pull_list_chained(blob, mem_ctx, 
@@ -443,6 +450,10 @@ static NTSTATUS smb_raw_info_backend(struct smbcli_session *session,
                return smb_raw_fileinfo_passthru_parse(blob, mem_ctx, 
                                                       RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION, parms);
 
+       case RAW_FILEINFO_NORMALIZED_NAME_INFORMATION:
+               return smb_raw_fileinfo_passthru_parse(blob, mem_ctx,
+                                                      RAW_FILEINFO_NORMALIZED_NAME_INFORMATION, parms);
+
        case RAW_FILEINFO_SMB2_ALL_INFORMATION:
                return smb_raw_fileinfo_passthru_parse(blob, mem_ctx, 
                                                       RAW_FILEINFO_SMB2_ALL_INFORMATION, parms);
index b7cfc6d0e8b39edd03275a2a04e1016f5cc670dd..f93b1f1d35b7ba6c90e889858e899a262fc8b232 100644 (file)
@@ -139,6 +139,7 @@ Found 8 aliased levels
 #define SMB_QFILEINFO_COMPRESSION_INFORMATION          1028
 #define SMB_QFILEINFO_NETWORK_OPEN_INFORMATION         1034
 #define SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION                1035
+#define SMB_QFILEINFO_NORMALIZED_NAME_INFORMATION      1048
 
 
 
index fe68b4132bca50a3e28abe3df24a0d0e83e5030d..69e046c9143d681298a2191dad18d67411dd17d5 100644 (file)
@@ -960,6 +960,8 @@ NTSTATUS ntvfs_map_fileinfo(TALLOC_CTX *mem_ctx,
        case RAW_FILEINFO_SMB2_ALL_EAS:
        case RAW_FILEINFO_SMB2_ALL_INFORMATION:
                return NT_STATUS_INVALID_LEVEL;
+       case RAW_FILEINFO_NORMALIZED_NAME_INFORMATION:
+               return NT_STATUS_NOT_SUPPORTED;
        }
 
        return NT_STATUS_INVALID_LEVEL;
index 33ff9ce3cba1c07a7745ee18d30a106f8268f08a..53cde69b1b79838ae46e9bd09b5e93f73375daea 100644 (file)
@@ -342,6 +342,8 @@ static NTSTATUS pvfs_map_fileinfo(struct pvfs_state *pvfs,
        case RAW_FILEINFO_UNIX_INFO2:
        case RAW_FILEINFO_UNIX_LINK:
                return NT_STATUS_INVALID_LEVEL;
+       case RAW_FILEINFO_NORMALIZED_NAME_INFORMATION:
+               return NT_STATUS_NOT_SUPPORTED;
        }
 
        return NT_STATUS_INVALID_LEVEL;
index 868e13bdc0fe57c3508aad729c8eb52444593a32..490db6402ac214f9daa563d2ebedc7535466cfe7 100644 (file)
@@ -1697,6 +1697,10 @@ static bool cmp_fileinfo(int instance,
                CHECK_EQUAL(attribute_tag_information.out.reparse_tag);
                break;
 
+       case RAW_FILEINFO_NORMALIZED_NAME_INFORMATION:
+               CHECK_WSTR_EQUAL(normalized_name_info.out.fname);
+               break;
+
        case RAW_FILEINFO_SMB2_ALL_INFORMATION:
                CHECK_NTTIMES_EQUAL(all_info2.out.create_time);
                CHECK_NTTIMES_EQUAL(all_info2.out.access_time);