smbd: qfsinfo has fixed/variable buffers
authorVolker Lendecke <vl@samba.org>
Tue, 27 Aug 2013 09:06:27 +0000 (09:06 +0000)
committerKarolin Seeger <kseeger@samba.org>
Wed, 18 Sep 2013 08:41:22 +0000 (10:41 +0200)
The error message will have to change depending whether the buffer is
too small for the fixed or variable buffers

Bug: https://bugzilla.samba.org/show_bug.cgi?id=10106
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit ac41df91a5a425633fc716ca02187e753879d795)
(cherry picked from commit a3d041438f2f0fde9644ec27b89f19ded3146f50)

source3/smbd/globals.h
source3/smbd/smb2_getinfo.c
source3/smbd/trans2.c

index 7fbe608744076e6f87aed6e9eed59baa3935117d..8cec74c854dc5ecfd9a84351db22eb7101bc1d41 100644 (file)
@@ -180,6 +180,7 @@ NTSTATUS smbd_do_qfsinfo(connection_struct *conn,
                         uint16_t info_level,
                         uint16_t flags2,
                         unsigned int max_data_bytes,
+                        size_t *fixed_portion,
                         struct smb_filename *smb_fname,
                         char **ppdata,
                         int *ret_data_len);
index b9911524ff68f8def14e90bfb6adbdcfe1091567..91595d53cb8a0d0ec9ef1a3fad0dcaeff0b182d8 100644 (file)
@@ -401,6 +401,7 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
                uint16_t file_info_level;
                char *data = NULL;
                int data_size = 0;
+               size_t fixed_portion;
 
                /* the levels directly map to the passthru levels */
                file_info_level = in_file_info_class + 1000;
@@ -409,6 +410,7 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
                                         file_info_level,
                                         STR_UNICODE,
                                         in_output_buffer_length,
+                                        &fixed_portion,
                                         fsp->fsp_name,
                                         &data,
                                         &data_size);
index f1da13eb3de18ffc2e8de51f2733096b5d4e9fd4..2f840b73e122a97809de64eeda7ede534cc48207 100644 (file)
@@ -2971,6 +2971,7 @@ NTSTATUS smbd_do_qfsinfo(connection_struct *conn,
                         uint16_t info_level,
                         uint16_t flags2,
                         unsigned int max_data_bytes,
+                        size_t *fixed_portion,
                         struct smb_filename *fname,
                         char **ppdata,
                         int *ret_data_len)
@@ -3023,6 +3024,8 @@ NTSTATUS smbd_do_qfsinfo(connection_struct *conn,
        memset((char *)pdata,'\0',max_data_bytes + DIR_ENTRY_SAFETY_MARGIN);
        end_data = pdata + max_data_bytes + DIR_ENTRY_SAFETY_MARGIN - 1;
 
+       *fixed_portion = 0;
+
        switch (info_level) {
                case SMB_INFO_ALLOCATION:
                {
@@ -3121,6 +3124,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
                                data_len = max_data_bytes;
                                status = STATUS_BUFFER_OVERFLOW;
                        }
+                       *fixed_portion = 16;
                        break;
 
                case SMB_QUERY_FS_LABEL_INFO:
@@ -3189,6 +3193,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                        SBIG_UINT(pdata,8,dfree);
                        SIVAL(pdata,16,sectors_per_unit);
                        SIVAL(pdata,20,bytes_per_sector);
+                       *fixed_portion = 24;
                        break;
                }
 
@@ -3222,6 +3227,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                        SBIG_UINT(pdata,16,dfree); /* Actual available allocation units. */
                        SIVAL(pdata,24,sectors_per_unit); /* Sectors per allocation unit. */
                        SIVAL(pdata,28,bytes_per_sector); /* Bytes per sector. */
+                       *fixed_portion = 32;
                        break;
                }
 
@@ -3236,6 +3242,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                        data_len = 8;
                        SIVAL(pdata,0,FILE_DEVICE_DISK); /* dev type */
                        SIVAL(pdata,4,characteristics);
+                       *fixed_portion = 8;
                        break;
                }
 
@@ -3410,6 +3417,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
                                DEBUG(0,("vfs_statvfs() failed for service [%s]\n",lp_servicename(SNUM(conn))));
                                return NT_STATUS_DOS(ERRSRV, ERRerror);
                        }
+                       *fixed_portion = 24;
                        break;
                }
 
@@ -3556,6 +3564,7 @@ static void call_trans2qfsinfo(connection_struct *conn,
        char *params = *pparams;
        uint16_t info_level;
        int data_len = 0;
+       size_t fixed_portion;
        NTSTATUS status;
 
        if (total_params < 2) {
@@ -3582,6 +3591,7 @@ static void call_trans2qfsinfo(connection_struct *conn,
                                 info_level,
                                 req->flags2,
                                 max_data_bytes,
+                                &fixed_portion,
                                 NULL,
                                 ppdata, &data_len);
        if (!NT_STATUS_IS_OK(status)) {