diff options
Diffstat (limited to 'source3/libsmb')
-rw-r--r-- | source3/libsmb/clifile.c | 15 | ||||
-rw-r--r-- | source3/libsmb/libsmb_dir.c | 10 | ||||
-rw-r--r-- | source3/libsmb/proto.h | 5 |
3 files changed, 24 insertions, 6 deletions
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index e6bc40cf5cb..8f96e043d56 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -1074,7 +1074,10 @@ NTSTATUS cli_rename_recv(struct tevent_req *req) return tevent_req_simple_recv_ntstatus(req); } -NTSTATUS cli_rename(struct cli_state *cli, const char *fname_src, const char *fname_dst) +NTSTATUS cli_rename(struct cli_state *cli, + const char *fname_src, + const char *fname_dst, + bool replace) { TALLOC_CTX *frame = NULL; struct tevent_context *ev; @@ -1082,7 +1085,7 @@ NTSTATUS cli_rename(struct cli_state *cli, const char *fname_src, const char *fn NTSTATUS status = NT_STATUS_OK; if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { - return cli_smb2_rename(cli, fname_src, fname_dst, false); + return cli_smb2_rename(cli, fname_src, fname_dst, replace); } frame = talloc_stackframe(); @@ -1095,6 +1098,14 @@ NTSTATUS cli_rename(struct cli_state *cli, const char *fname_src, const char *fn goto fail; } + if (replace) { + /* + * SMB1 doesn't support replace + */ + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + ev = samba_tevent_context_init(frame); if (ev == NULL) { status = NT_STATUS_NO_MEMORY; diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c index 8bf3c6b8efc..4a4e08412bc 100644 --- a/source3/libsmb/libsmb_dir.c +++ b/source3/libsmb/libsmb_dir.c @@ -2032,12 +2032,16 @@ SMBC_rename_ctx(SMBCCTX *ocontext, return -1; } - if (!NT_STATUS_IS_OK(cli_rename(targetcli1, targetpath1, targetpath2))) { + if (!NT_STATUS_IS_OK( + cli_rename(targetcli1, targetpath1, targetpath2, false))) { int eno = SMBC_errno(ocontext, targetcli1); if (eno != EEXIST || - !NT_STATUS_IS_OK(cli_unlink(targetcli1, targetpath2, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)) || - !NT_STATUS_IS_OK(cli_rename(targetcli1, targetpath1, targetpath2))) { + !NT_STATUS_IS_OK(cli_unlink(targetcli1, targetpath2, + FILE_ATTRIBUTE_SYSTEM | + FILE_ATTRIBUTE_HIDDEN)) || + !NT_STATUS_IS_OK(cli_rename(targetcli1, targetpath1, + targetpath2, false))) { errno = eno; TALLOC_FREE(frame); diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h index 764f3fc1b12..57a45e3f363 100644 --- a/source3/libsmb/proto.h +++ b/source3/libsmb/proto.h @@ -330,7 +330,10 @@ struct tevent_req *cli_rename_send(TALLOC_CTX *mem_ctx, const char *fname_src, const char *fname_dst); NTSTATUS cli_rename_recv(struct tevent_req *req); -NTSTATUS cli_rename(struct cli_state *cli, const char *fname_src, const char *fname_dst); +NTSTATUS cli_rename(struct cli_state *cli, + const char *fname_src, + const char *fname_dst, + bool replace); struct tevent_req *cli_ntrename_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct cli_state *cli, |