summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2013-11-12 15:55:51 -0800
committerKarolin Seeger <kseeger@samba.org>2013-11-22 11:30:02 +0100
commit8c73aaec879ab2b7104575fdb1a3623d9a38141b (patch)
tree0e3c45dbf827c9a8186fa67138fb6fe5d5f37062 /source3
parentb0ce9bc6899220d921a7f520e4f92e99a7945fa8 (diff)
downloadsamba-8c73aaec879ab2b7104575fdb1a3623d9a38141b.tar.gz
s3-client: smbclient shows no error if deleting a directory with del failed
BUG: https://bugzilla.samba.org/show_bug.cgi?id=10260 In SMB1 the server filters by attribute requested, in SMB2 there is no attribute sent. Emulate this on the client to provide the same ABI to callers. In SMB1 the server returns NT_STATUS_NO_SUCH_FILE if FindFirst finds no files. Emulate this on the client. Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Thu Nov 14 21:23:07 CET 2013 on sn-devel-104 (cherry picked from commit 4ee4a7e96e71cee27c30d23610a7f83d968a8ba0)
Diffstat (limited to 'source3')
-rw-r--r--source3/libsmb/cli_smb2_fnum.c29
-rw-r--r--source3/libsmb/cli_smb2_fnum.h1
-rw-r--r--source3/libsmb/clilist.c2
3 files changed, 28 insertions, 4 deletions
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 202000fbbf..d10e1d274c 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -486,6 +486,7 @@ static bool windows_parent_dirname(TALLOC_CTX *mem_ctx,
NTSTATUS cli_smb2_list(struct cli_state *cli,
const char *pathname,
+ uint16_t attribute,
NTSTATUS (*fn)(const char *,
struct file_info *,
const char *,
@@ -497,6 +498,7 @@ NTSTATUS cli_smb2_list(struct cli_state *cli,
char *parent_dir = NULL;
const char *mask = NULL;
struct smb2_hnd *ph = NULL;
+ bool processed_file = false;
TALLOC_CTX *frame = talloc_stackframe();
TALLOC_CTX *subframe = NULL;
@@ -590,13 +592,26 @@ NTSTATUS cli_smb2_list(struct cli_state *cli,
goto fail;
}
- status = fn(cli->dfs_mountpoint,
+ if (dir_check_ftype((uint32_t)finfo->mode,
+ (uint32_t)attribute)) {
+ /*
+ * Only process if attributes match.
+ * On SMB1 server does this, so on
+ * SMB2 we need to emulate in the
+ * client.
+ *
+ * https://bugzilla.samba.org/show_bug.cgi?id=10260
+ */
+ processed_file = true;
+
+ status = fn(cli->dfs_mountpoint,
finfo,
pathname,
state);
- if (!NT_STATUS_IS_OK(status)) {
- break;
+ if (!NT_STATUS_IS_OK(status)) {
+ break;
+ }
}
TALLOC_FREE(finfo);
@@ -616,6 +631,14 @@ NTSTATUS cli_smb2_list(struct cli_state *cli,
status = NT_STATUS_OK;
}
+ if (NT_STATUS_IS_OK(status) && !processed_file) {
+ /*
+ * In SMB1 findfirst returns NT_STATUS_NO_SUCH_FILE
+ * if no files match. Emulate this in the client.
+ */
+ status = NT_STATUS_NO_SUCH_FILE;
+ }
+
fail:
if (fnum != 0xffff) {
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index 0068686636..a5cae25a2b 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -42,6 +42,7 @@ NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dirname);
NTSTATUS cli_smb2_unlink(struct cli_state *cli,const char *fname);
NTSTATUS cli_smb2_list(struct cli_state *cli,
const char *pathname,
+ uint16_t attribute,
NTSTATUS (*fn)(const char *,
struct file_info *,
const char *,
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index ed970cd896..3080fb883d 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -942,7 +942,7 @@ NTSTATUS cli_list(struct cli_state *cli, const char *mask, uint16 attribute,
uint16_t info_level;
if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
- return cli_smb2_list(cli, mask, fn, state);
+ return cli_smb2_list(cli, mask, attribute, fn, state);
}
frame = talloc_stackframe();