From: Volker Lendecke Date: Tue, 26 Oct 2021 06:51:16 +0000 (+0200) Subject: libsmb: Use cli_ntcreate in cli_chkpath X-Git-Tag: ldb-2.5.0~86 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0fda0bd6262a571159b9df02fdc313ef8b32113;p=thirdparty%2Fsamba.git libsmb: Use cli_ntcreate in cli_chkpath cli_ntcreate handles smb2, thus remove cli_smb2_chkpath. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index f70639e41bd..87c56b5564d 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -1627,87 +1627,6 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli, return status; } -struct cli_smb2_chkpath_state { - struct tevent_context *ev; - struct cli_state *cli; -}; - -static void cli_smb2_chkpath_opened(struct tevent_req *subreq); -static void cli_smb2_chkpath_closed(struct tevent_req *subreq); - -struct tevent_req *cli_smb2_chkpath_send( - TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct cli_state *cli, - const char *name) -{ - struct tevent_req *req = NULL, *subreq = NULL; - struct cli_smb2_chkpath_state *state = NULL; - - req = tevent_req_create( - mem_ctx, &state, struct cli_smb2_chkpath_state); - if (req == NULL) { - return NULL; - } - state->ev = ev; - state->cli = cli; - - /* Ensure this is a directory. */ - subreq = cli_smb2_create_fnum_send( - state, /* mem_ctx */ - ev, /* ev */ - cli, /* cli */ - name, /* fname */ - 0, /* create_flags */ - SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level */ - FILE_READ_ATTRIBUTES, /* desired_access */ - FILE_ATTRIBUTE_DIRECTORY, /* file_attributes */ - FILE_SHARE_READ| - FILE_SHARE_WRITE| - FILE_SHARE_DELETE, /* share_access */ - FILE_OPEN, /* create_disposition */ - FILE_DIRECTORY_FILE, /* create_options */ - NULL); /* in_cblobs */ - if (tevent_req_nomem(subreq, req)) { - return tevent_req_post(req, ev); - } - tevent_req_set_callback(subreq, cli_smb2_chkpath_opened, req); - return req; -} - -static void cli_smb2_chkpath_opened(struct tevent_req *subreq) -{ - struct tevent_req *req = tevent_req_callback_data( - subreq, struct tevent_req); - struct cli_smb2_chkpath_state *state = tevent_req_data( - req, struct cli_smb2_chkpath_state); - NTSTATUS status; - uint16_t fnum = 0xffff; - - status = cli_smb2_create_fnum_recv(subreq, &fnum, NULL, NULL, NULL); - TALLOC_FREE(subreq); - if (tevent_req_nterror(req, status)) { - return; - } - - subreq = cli_smb2_close_fnum_send(state, state->ev, state->cli, fnum); - if (tevent_req_nomem(subreq, req)) { - return; - } - tevent_req_set_callback(subreq, cli_smb2_chkpath_closed, req); -} - -static void cli_smb2_chkpath_closed(struct tevent_req *subreq) -{ - NTSTATUS status = cli_smb2_close_fnum_recv(subreq); - tevent_req_simple_finish_ntstatus(subreq, status); -} - -NTSTATUS cli_smb2_chkpath_recv(struct tevent_req *req) -{ - return tevent_req_simple_recv_ntstatus(req); -} - struct cli_smb2_query_info_fnum_state { DATA_BLOB outbuf; }; diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h index 91781b6a11b..f3355b33ca3 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -109,12 +109,6 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli, NTSTATUS cli_smb2_qpathinfo_alt_name(struct cli_state *cli, const char *name, fstring alt_name); -struct tevent_req *cli_smb2_chkpath_send( - TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct cli_state *cli, - const char *name); -NTSTATUS cli_smb2_chkpath_recv(struct tevent_req *req); struct tevent_req *cli_smb2_query_info_fnum_send( TALLOC_CTX *mem_ctx, struct tevent_context *ev, diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index c619b009ec4..e300b6b96de 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -4623,10 +4623,12 @@ NTSTATUS cli_setatr(struct cli_state *cli, ****************************************************************************/ static void cli_chkpath_done(struct tevent_req *subreq); -static void cli_chkpath_done2(struct tevent_req *subreq); +static void cli_chkpath_opened(struct tevent_req *subreq); +static void cli_chkpath_closed(struct tevent_req *subreq); struct cli_chkpath_state { - int dummy; + struct tevent_context *ev; + struct cli_state *cli; }; struct tevent_req *cli_chkpath_send(TALLOC_CTX *mem_ctx, @@ -4644,13 +4646,29 @@ struct tevent_req *cli_chkpath_send(TALLOC_CTX *mem_ctx, if (req == NULL) { return NULL; } + state->ev = ev; + state->cli = cli; - if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { - subreq = cli_smb2_chkpath_send(state, ev, cli, fname); + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_NT1) { + subreq = cli_ntcreate_send( + state, /* mem_ctx */ + state->ev, /* ev */ + state->cli, /* cli */ + fname, /* fname */ + 0, /* create_flags */ + FILE_READ_ATTRIBUTES, /* desired_access */ + FILE_ATTRIBUTE_DIRECTORY, /* FileAttributes */ + FILE_SHARE_READ| + FILE_SHARE_WRITE| + FILE_SHARE_DELETE, /* share_access */ + FILE_OPEN, /* CreateDisposition */ + FILE_DIRECTORY_FILE, /* CreateOptions */ + SMB2_IMPERSONATION_IMPERSONATION, + 0); /* SecurityFlags */ if (tevent_req_nomem(subreq, req)) { return tevent_req_post(req, ev); } - tevent_req_set_callback(subreq, cli_chkpath_done2, req); + tevent_req_set_callback(subreq, cli_chkpath_opened, req); return req; } @@ -4681,22 +4699,37 @@ struct tevent_req *cli_chkpath_send(TALLOC_CTX *mem_ctx, } static void cli_chkpath_done(struct tevent_req *subreq) +{ + NTSTATUS status = cli_smb_recv( + subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL); + tevent_req_simple_finish_ntstatus(subreq, status); +} + +static void cli_chkpath_opened(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data( subreq, struct tevent_req); + struct cli_chkpath_state *state = tevent_req_data( + req, struct cli_chkpath_state); NTSTATUS status; + uint16_t fnum; - status = cli_smb_recv(subreq, NULL, NULL, 0, NULL, NULL, NULL, NULL); + status = cli_ntcreate_recv(subreq, &fnum, NULL); TALLOC_FREE(subreq); if (tevent_req_nterror(req, status)) { return; } - tevent_req_done(req); + + subreq = cli_close_send(state, state->ev, state->cli, fnum); + if (tevent_req_nomem(subreq, req)) { + return; + } + tevent_req_set_callback(subreq, cli_chkpath_closed, req); } -static void cli_chkpath_done2(struct tevent_req *subreq) +static void cli_chkpath_closed(struct tevent_req *subreq) { - NTSTATUS status = cli_smb2_chkpath_recv(subreq); + NTSTATUS status = cli_close_recv(subreq); tevent_req_simple_finish_ntstatus(subreq, status); }