1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-27 03:21:53 +03:00

r20721: Fix the search unix_convert error returns. Only open

to go...
Jeremy.
This commit is contained in:
Jeremy Allison 2007-01-13 01:29:10 +00:00 committed by Gerald (Jerry) Carter
parent c5be0082ef
commit 89f03a8db4
3 changed files with 37 additions and 27 deletions

View File

@ -56,6 +56,38 @@ static BOOL mangled_equal(const char *name1, const char *name2,
return strequal(name1, tmpname);
}
/****************************************************************************
Cope with the differing wildcard and non-wildcard error cases.
****************************************************************************/
static NTSTATUS determine_path_error(const char *name, BOOL allow_wcard_last_component)
{
const char *p;
if (!allow_wcard_last_component) {
/* Error code within a pathname. */
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
/* We're terminating here so we
* can be a little slower and get
* the error code right. Windows
* treats the last part of the pathname
* separately I think, so if the last
* component is a wildcard then we treat
* this ./ as "end of component" */
p = strchr(name, '/');
if (!p && (ms_has_wild(name) || ISDOT(name))) {
/* Error code at the end of a pathname. */
return NT_STATUS_OBJECT_NAME_INVALID;
} else {
/* Error code within a pathname. */
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
}
/****************************************************************************
This routine is called to convert names from the dos namespace to unix
namespace. It needs to handle any case conversions, mangling, format
@ -150,8 +182,7 @@ NTSTATUS unix_convert(connection_struct *conn,
if (name[1] == '\0' || name[2] == '\0') {
return NT_STATUS_OBJECT_NAME_INVALID;
} else {
/* Longer pathname starts with ./ */
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
return determine_path_error(&name[2], allow_wcard_last_component);
}
}
@ -264,32 +295,11 @@ NTSTATUS unix_convert(connection_struct *conn,
/* The name cannot have a component of "." */
if (ISDOT(start)) {
if (end) {
if (allow_wcard_last_component) {
/* We're terminating here so we
* can be a little slower and get
* the error code right. Windows
* treats the last part of the pathname
* separately I think, so if the last
* component is a wildcard then we treat
* this ./ as "end of component" */
const char *p = strchr(end+1, '/');
if (!p && ms_has_wild(end+1)) {
/* Error code at the end of a pathname. */
return NT_STATUS_OBJECT_NAME_INVALID;
} else {
/* Error code within a pathname. */
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
}
/* Error code within a pathname. */
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
} else {
if (!end) {
/* Error code at the end of a pathname. */
return NT_STATUS_OBJECT_NAME_INVALID;
}
return determine_path_error(end+1, allow_wcard_last_component);
}
/* The name cannot have a wildcard if it's not

View File

@ -952,7 +952,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
pstrcpy(directory,path);
pstrcpy(dir2,path);
nt_status = unix_convert(conn, directory, mask_contains_wcard, NULL, &sbuf);
nt_status = unix_convert(conn, directory, True, NULL, &sbuf);
if (!NT_STATUS_IS_OK(nt_status)) {
END_PROFILE(SMBsearch);
return ERROR_NT(nt_status);

View File

@ -1718,7 +1718,7 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
RESOLVE_DFSPATH_WCARD(directory, conn, inbuf, outbuf);
ntstatus = unix_convert(conn, directory, mask_contains_wcard, NULL, &sbuf);
ntstatus = unix_convert(conn, directory, True, NULL, &sbuf);
if (!NT_STATUS_IS_OK(ntstatus)) {
return ERROR_NT(ntstatus);
}