From: Volker Lendecke Date: Thu, 9 May 2024 08:12:14 +0000 (+0200) Subject: libsmb: Convert cli_qfileinfo to use FSCC levels X-Git-Tag: tdb-1.4.11~706 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bec5920ec9115a35b49828338ddb6fbbf9608ca4;p=thirdparty%2Fsamba.git libsmb: Convert cli_qfileinfo to use FSCC levels This will enable this routine to be used for SMB2 as well. The translation table is from [MS-CIFS] 2.2.8. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 1ff3973bb39..431b8a769bd 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -6965,20 +6965,55 @@ static void cli_qfileinfo_done(struct tevent_req *subreq); struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct cli_state *cli, uint16_t fnum, - uint16_t level, uint32_t min_rdata, + struct cli_state *cli, + uint16_t fnum, + uint16_t fscc_level, + uint32_t min_rdata, uint32_t max_rdata) { struct tevent_req *req, *subreq; struct cli_qfileinfo_state *state; + uint16_t smb_level; req = tevent_req_create(mem_ctx, &state, struct cli_qfileinfo_state); if (req == NULL) { return NULL; } + + switch (fscc_level) { + case FSCC_FILE_BASIC_INFORMATION: + smb_level = SMB_QUERY_FILE_BASIC_INFO; + break; + case FSCC_FILE_STANDARD_INFORMATION: + smb_level = SMB_QUERY_FILE_STANDARD_INFO; + break; + case FSCC_FILE_EA_INFORMATION: + smb_level = SMB_QUERY_FILE_EA_INFO; + break; + case FSCC_FILE_NAME_INFORMATION: + smb_level = SMB_QUERY_FILE_NAME_INFO; + break; + case FSCC_FILE_ALL_INFORMATION: + smb_level = SMB_QUERY_FILE_ALL_INFO; + break; + case FSCC_FILE_ALTERNATE_NAME_INFORMATION: + smb_level = SMB_QUERY_FILE_ALT_NAME_INFO; + break; + case FSCC_FILE_STREAM_INFORMATION: + smb_level = SMB_QUERY_FILE_STREAM_INFO; + break; + case FSCC_FILE_COMPRESSION_INFORMATION: + smb_level = SMB_QUERY_COMPRESSION_INFO; + break; + default: + /* Probably wrong, but the server will tell us */ + smb_level = fscc_level; + break; + } + state->min_rdata = min_rdata; SSVAL(state->param, 0, fnum); - SSVAL(state->param, 2, level); + SSVAL(state->param, 2, smb_level); SSVAL(state->setup, 0, TRANSACT2_QFILEINFO); subreq = cli_trans_send( @@ -7054,10 +7089,15 @@ NTSTATUS cli_qfileinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, return NT_STATUS_OK; } -NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli, - uint16_t fnum, uint16_t level, uint32_t min_rdata, - uint32_t max_rdata, uint16_t *recv_flags2, - uint8_t **rdata, uint32_t *num_rdata) +NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, + struct cli_state *cli, + uint16_t fnum, + uint16_t fscc_level, + uint32_t min_rdata, + uint32_t max_rdata, + uint16_t *recv_flags2, + uint8_t **rdata, + uint32_t *num_rdata) { TALLOC_CTX *frame = talloc_stackframe(); struct tevent_context *ev; @@ -7075,8 +7115,8 @@ NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli, if (ev == NULL) { goto fail; } - req = cli_qfileinfo_send(frame, ev, cli, fnum, level, min_rdata, - max_rdata); + req = cli_qfileinfo_send( + frame, ev, cli, fnum, fscc_level, min_rdata, max_rdata); if (req == NULL) { goto fail; } diff --git a/source3/libsmb/clirap.c b/source3/libsmb/clirap.c index 24fd733d548..082a20d40fd 100644 --- a/source3/libsmb/clirap.c +++ b/source3/libsmb/clirap.c @@ -1369,14 +1369,13 @@ struct tevent_req *cli_qfileinfo_basic_send( return req; } - subreq = cli_qfileinfo_send( - state, - ev, - cli, - fnum, - SMB_QUERY_FILE_ALL_INFO, /* level */ - 68, /* min_rdata */ - CLI_BUFFER_SIZE); /* max_rdata */ + subreq = cli_qfileinfo_send(state, + ev, + cli, + fnum, + FSCC_FILE_ALL_INFORMATION, /* level */ + 68, /* min_rdata */ + CLI_BUFFER_SIZE); /* max_rdata */ if (tevent_req_nomem(subreq, req)) { return tevent_req_post(req, ev); } diff --git a/source3/libsmb/clirap.h b/source3/libsmb/clirap.h index 4dc0441cc5b..5181ef22290 100644 --- a/source3/libsmb/clirap.h +++ b/source3/libsmb/clirap.h @@ -162,16 +162,23 @@ NTSTATUS cli_qpathinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli, struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct cli_state *cli, uint16_t fnum, - uint16_t level, uint32_t min_rdata, + struct cli_state *cli, + uint16_t fnum, + uint16_t fscc_level, + uint32_t min_rdata, uint32_t max_rdata); NTSTATUS cli_qfileinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, uint16_t *recv_flags2, uint8_t **rdata, uint32_t *num_rdata); -NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli, - uint16_t fnum, uint16_t level, uint32_t min_rdata, - uint32_t max_rdata, uint16_t *recv_flags2, - uint8_t **rdata, uint32_t *num_rdata); +NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, + struct cli_state *cli, + uint16_t fnum, + uint16_t fscc_level, + uint32_t min_rdata, + uint32_t max_rdata, + uint16_t *recv_flags2, + uint8_t **rdata, + uint32_t *num_rdata); struct tevent_req *cli_flush_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, diff --git a/source3/torture/torture.c b/source3/torture/torture.c index 6476ae5c6e7..e0cc39f732d 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -4411,10 +4411,15 @@ static NTSTATUS cli_qfilename( char *name = NULL; uint32_t namelen; - status = cli_qfileinfo(talloc_tos(), cli, fnum, - SMB_QUERY_FILE_NAME_INFO, - 4, CLI_BUFFER_SIZE, &recv_flags2, - &rdata, &num_rdata); + status = cli_qfileinfo(talloc_tos(), + cli, + fnum, + FSCC_FILE_NAME_INFORMATION, + 4, + CLI_BUFFER_SIZE, + &recv_flags2, + &rdata, + &num_rdata); if (!NT_STATUS_IS_OK(status)) { return status; }