mirror of
https://github.com/samba-team/samba.git
synced 2025-02-26 21:57:41 +03:00
smbd: qfsinfo has fixed/variable buffers
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>
This commit is contained in:
parent
5312399603
commit
ac41df91a5
@ -156,6 +156,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);
|
||||
|
@ -410,6 +410,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;
|
||||
@ -418,6 +419,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);
|
||||
|
@ -3068,6 +3068,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)
|
||||
@ -3124,6 +3125,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:
|
||||
{
|
||||
@ -3222,6 +3225,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:
|
||||
@ -3258,6 +3262,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 = 24;
|
||||
break;
|
||||
|
||||
case SMB_QUERY_FS_SIZE_INFO:
|
||||
@ -3290,6 +3295,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;
|
||||
}
|
||||
|
||||
@ -3323,6 +3329,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;
|
||||
}
|
||||
|
||||
@ -3337,6 +3344,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;
|
||||
}
|
||||
|
||||
@ -3645,6 +3653,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) {
|
||||
@ -3670,6 +3679,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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user