s3: Make SMB_QUERY_FILE_UNIX_BASIC's devno work for files
authorVolker Lendecke <vl@samba.org>
Fri, 11 May 2012 11:31:36 +0000 (13:31 +0200)
committerVolker Lendecke <vl@samba.org>
Mon, 14 May 2012 11:16:32 +0000 (13:16 +0200)
According to susv3, st_rdev is valid exactly for char and block devices. Normal
files have st_dev set.

source3/smbd/trans2.c

index 5cfbc3128bd39d4097a8a37dbb2f8175509a3e73..590ee5bf7cea296165150ba742d37a320f10ac12 100644 (file)
@@ -3959,6 +3959,7 @@ static char *store_file_unix_basic(connection_struct *conn,
                                const SMB_STRUCT_STAT *psbuf)
 {
        uint64_t file_index = get_FileIndex(conn, psbuf);
+       dev_t devno;
 
        DEBUG(10,("store_file_unix_basic: SMB_QUERY_FILE_UNIX_BASIC\n"));
        DEBUG(4,("store_file_unix_basic: st_mode=%o\n",(int)psbuf->st_ex_mode));
@@ -3985,11 +3986,17 @@ static char *store_file_unix_basic(connection_struct *conn,
        SIVAL(pdata,0,unix_filetype(psbuf->st_ex_mode));
        pdata += 4;
 
-       SIVAL(pdata,0,unix_dev_major(psbuf->st_ex_rdev));   /* Major device number if type is device */
+       if (S_ISBLK(psbuf->st_ex_mode) || S_ISCHR(psbuf->st_ex_mode)) {
+               devno = psbuf->st_ex_rdev;
+       } else {
+               devno = psbuf->st_ex_dev;
+       }
+
+       SIVAL(pdata,0,unix_dev_major(devno));   /* Major device number if type is device */
        SIVAL(pdata,4,0);
        pdata += 8;
 
-       SIVAL(pdata,0,unix_dev_minor(psbuf->st_ex_rdev));   /* Minor device number if type is device */
+       SIVAL(pdata,0,unix_dev_minor(devno));   /* Minor device number if type is device */
        SIVAL(pdata,4,0);
        pdata += 8;