mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
s3: smbd: Fix SMB1 reply_unlink() to handle wildcards.
Add a 'bool have_wcard' to unlink_internals(). Move the wildcard detection out of unlink_internals() as it was looking at the wrong thing. This is now correctly set only from the unmangled last component of the path sent to reply_unlink(). We now pass: Samba3.smbtorture_s3.crypt_client.SMB1-WILD-MANGLE-UNLINK(nt4_dc_smb1) samba3.smbtorture_s3.plain.SMB1-WILD-MANGLE-UNLINK(fileserver_smb1) so remove the knownfail. Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
parent
4ba1428334
commit
90bce2c092
@ -1,3 +0,0 @@
|
|||||||
# Check SMB1 wildcard demangle
|
|
||||||
^samba3.smbtorture_s3.plain.SMB1-WILD-MANGLE-UNLINK.smbtorture\(fileserver_smb1\)
|
|
||||||
^samba3.smbtorture_s3.crypt_client.SMB1-WILD-MANGLE-UNLINK.smbtorture\(nt4_dc_smb1\)
|
|
@ -2037,7 +2037,7 @@ static NTSTATUS driver_unlink_internals(connection_struct *conn,
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = unlink_internals(conn, NULL, 0, smb_fname);
|
status = unlink_internals(conn, NULL, 0, smb_fname, false);
|
||||||
err_out:
|
err_out:
|
||||||
talloc_free(tmp_ctx);
|
talloc_free(tmp_ctx);
|
||||||
return status;
|
return status;
|
||||||
|
@ -976,7 +976,8 @@ void reply_ctemp(struct smb_request *req);
|
|||||||
NTSTATUS unlink_internals(connection_struct *conn,
|
NTSTATUS unlink_internals(connection_struct *conn,
|
||||||
struct smb_request *req,
|
struct smb_request *req,
|
||||||
uint32_t dirtype,
|
uint32_t dirtype,
|
||||||
struct smb_filename *smb_fname);
|
struct smb_filename *smb_fname,
|
||||||
|
bool has_wcard);
|
||||||
void reply_unlink(struct smb_request *req);
|
void reply_unlink(struct smb_request *req);
|
||||||
ssize_t fake_sendfile(struct smbXsrv_connection *xconn, files_struct *fsp,
|
ssize_t fake_sendfile(struct smbXsrv_connection *xconn, files_struct *fsp,
|
||||||
off_t startpos, size_t nread);
|
off_t startpos, size_t nread);
|
||||||
|
@ -3271,14 +3271,14 @@ static NTSTATUS do_unlink(connection_struct *conn,
|
|||||||
NTSTATUS unlink_internals(connection_struct *conn,
|
NTSTATUS unlink_internals(connection_struct *conn,
|
||||||
struct smb_request *req,
|
struct smb_request *req,
|
||||||
uint32_t dirtype,
|
uint32_t dirtype,
|
||||||
struct smb_filename *smb_fname)
|
struct smb_filename *smb_fname,
|
||||||
|
bool has_wild)
|
||||||
{
|
{
|
||||||
char *fname_dir = NULL;
|
char *fname_dir = NULL;
|
||||||
char *fname_mask = NULL;
|
char *fname_mask = NULL;
|
||||||
int count=0;
|
int count=0;
|
||||||
NTSTATUS status = NT_STATUS_OK;
|
NTSTATUS status = NT_STATUS_OK;
|
||||||
struct smb_filename *smb_fname_dir = NULL;
|
struct smb_filename *smb_fname_dir = NULL;
|
||||||
bool has_wild = false;
|
|
||||||
TALLOC_CTX *ctx = talloc_tos();
|
TALLOC_CTX *ctx = talloc_tos();
|
||||||
|
|
||||||
/* Split up the directory from the filename/mask. */
|
/* Split up the directory from the filename/mask. */
|
||||||
@ -3288,17 +3288,6 @@ NTSTATUS unlink_internals(connection_struct *conn,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (req != NULL && !req->posix_pathnames) {
|
|
||||||
/*
|
|
||||||
* Check the wildcard mask *before*
|
|
||||||
* unmangling. As mangling is done
|
|
||||||
* for names that can't be returned
|
|
||||||
* to Windows the unmangled name may
|
|
||||||
* contain Windows wildcard characters.
|
|
||||||
*/
|
|
||||||
has_wild = ms_has_wild(fname_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We should only check the mangled cache
|
* We should only check the mangled cache
|
||||||
* here if unix_convert failed. This means
|
* here if unix_convert failed. This means
|
||||||
@ -3518,6 +3507,7 @@ void reply_unlink(struct smb_request *req)
|
|||||||
uint32_t ucf_flags = UCF_ALWAYS_ALLOW_WCARD_LCOMP |
|
uint32_t ucf_flags = UCF_ALWAYS_ALLOW_WCARD_LCOMP |
|
||||||
ucf_flags_from_smb_request(req);
|
ucf_flags_from_smb_request(req);
|
||||||
TALLOC_CTX *ctx = talloc_tos();
|
TALLOC_CTX *ctx = talloc_tos();
|
||||||
|
bool has_wild = false;
|
||||||
|
|
||||||
START_PROFILE(SMBunlink);
|
START_PROFILE(SMBunlink);
|
||||||
|
|
||||||
@ -3550,9 +3540,22 @@ void reply_unlink(struct smb_request *req)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (req != NULL && !req->posix_pathnames) {
|
||||||
|
char *lcomp = get_original_lcomp(ctx,
|
||||||
|
conn,
|
||||||
|
name,
|
||||||
|
ucf_flags);
|
||||||
|
if (lcomp == NULL) {
|
||||||
|
reply_nterror(req, NT_STATUS_NO_MEMORY);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
has_wild = ms_has_wild(lcomp);
|
||||||
|
TALLOC_FREE(lcomp);
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG(3,("reply_unlink : %s\n", smb_fname_str_dbg(smb_fname)));
|
DEBUG(3,("reply_unlink : %s\n", smb_fname_str_dbg(smb_fname)));
|
||||||
|
|
||||||
status = unlink_internals(conn, req, dirtype, smb_fname);
|
status = unlink_internals(conn, req, dirtype, smb_fname, has_wild);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
if (open_was_deferred(req->xconn, req->mid)) {
|
if (open_was_deferred(req->xconn, req->mid)) {
|
||||||
/* We have re-scheduled this call. */
|
/* We have re-scheduled this call. */
|
||||||
|
@ -6465,7 +6465,8 @@ NTSTATUS hardlink_internals(TALLOC_CTX *ctx,
|
|||||||
status = unlink_internals(conn,
|
status = unlink_internals(conn,
|
||||||
req,
|
req,
|
||||||
FILE_ATTRIBUTE_NORMAL,
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
smb_fname_new);
|
smb_fname_new,
|
||||||
|
false);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user