mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
s3: smbd: Fix the error processing in filename_convert_dirfsp_nosymlink() to match unix_convert() 100%
We need this in order to pass: samba3.raw.samba3badpath raw.chkpath samba3.base.chkpath Now we can convert all the SMB1 reply_openXXX functions, and reply_checkpath(). Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org>
This commit is contained in:
parent
be8ac8df17
commit
758ffebb8a
@ -2749,6 +2749,19 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
|
|||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Catch an invalid path of "." before we
|
||||||
|
* call filename_split_lcomp(). We need to
|
||||||
|
* do this as filename_split_lcomp() will
|
||||||
|
* use "." for the missing relative component
|
||||||
|
* when an empty name_in path is sent by
|
||||||
|
* the client.
|
||||||
|
*/
|
||||||
|
if (ISDOT(name_in)) {
|
||||||
|
status = NT_STATUS_OBJECT_NAME_INVALID;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
ok = filename_split_lcomp(
|
ok = filename_split_lcomp(
|
||||||
talloc_tos(),
|
talloc_tos(),
|
||||||
name_in,
|
name_in,
|
||||||
@ -2761,11 +2774,6 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fname_rel[0] == '\0') {
|
|
||||||
status = NT_STATUS_OBJECT_NAME_INVALID;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!posix) {
|
if (!posix) {
|
||||||
bool name_has_wild = ms_has_wild(dirname);
|
bool name_has_wild = ms_has_wild(dirname);
|
||||||
name_has_wild |= ms_has_wild(fname_rel);
|
name_has_wild |= ms_has_wild(fname_rel);
|
||||||
@ -2828,13 +2836,39 @@ static NTSTATUS filename_convert_dirfsp_nosymlink(
|
|||||||
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
TALLOC_FREE(dirname);
|
|
||||||
|
|
||||||
if (!VALID_STAT_OF_DIR(smb_dirname->st)) {
|
if (!VALID_STAT_OF_DIR(smb_dirname->st)) {
|
||||||
status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
|
status = NT_STATUS_OBJECT_PATH_NOT_FOUND;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only look at bad last component values
|
||||||
|
* once we know we have a valid directory. That
|
||||||
|
* way we won't confuse error messages from
|
||||||
|
* opening the directory path with error
|
||||||
|
* messages from a bad last component.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Relative filename can't be empty */
|
||||||
|
if (fname_rel[0] == '\0') {
|
||||||
|
status = NT_STATUS_OBJECT_NAME_INVALID;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Relative filename can't be ".." */
|
||||||
|
if (ISDOTDOT(fname_rel)) {
|
||||||
|
status = NT_STATUS_OBJECT_NAME_INVALID;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
/* Relative name can only be dot if directory is empty. */
|
||||||
|
if (ISDOT(fname_rel) && dirname[0] != '\0') {
|
||||||
|
status = NT_STATUS_OBJECT_NAME_INVALID;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
TALLOC_FREE(dirname);
|
||||||
|
|
||||||
smb_fname_rel = synthetic_smb_fname(
|
smb_fname_rel = synthetic_smb_fname(
|
||||||
mem_ctx,
|
mem_ctx,
|
||||||
fname_rel,
|
fname_rel,
|
||||||
@ -2999,6 +3033,7 @@ done:
|
|||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
TALLOC_FREE(dirname);
|
||||||
TALLOC_FREE(smb_dirname);
|
TALLOC_FREE(smb_dirname);
|
||||||
TALLOC_FREE(smb_fname_rel);
|
TALLOC_FREE(smb_fname_rel);
|
||||||
return status;
|
return status;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user