From 7b41b7510f5315518fce5dfc5e396fa778b8701a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 24 Mar 2020 12:47:31 +0100 Subject: [PATCH] server: Add a helper function for splitting a path into individual elements. Signed-off-by: Alexandre Julliard --- server/directory.c | 26 ++++++++++++-------------- server/object.c | 9 +++++++++ server/object.h | 1 + server/winstation.c | 5 ++--- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/server/directory.c b/server/directory.c index c995487f59e..8ee9a97a99e 100644 --- a/server/directory.c +++ b/server/directory.c @@ -142,30 +142,28 @@ static struct object *directory_lookup_name( struct object *obj, struct unicode_ struct directory *dir = (struct directory *)obj; struct object *found; struct unicode_str tmp; - const WCHAR *p; assert( obj->ops == &directory_ops ); if (!name) return NULL; /* open the directory itself */ - if (!(p = memchrW( name->str, '\\', name->len / sizeof(WCHAR) ))) - /* Last element in the path name */ - tmp.len = name->len; - else - tmp.len = (p - name->str) * sizeof(WCHAR); - tmp.str = name->str; + tmp.len = get_path_element( name->str, name->len ); + if ((found = find_object( dir->entries, &tmp, attr ))) { - /* Skip trailing \\ */ - if (p) + /* Skip trailing \\ and move to the next element */ + if (tmp.len < name->len) { - p++; tmp.len += sizeof(WCHAR); + name->str += tmp.len / sizeof(WCHAR); + name->len -= tmp.len; + } + else + { + name->str = NULL; + name->len = 0; } - /* Move to the next element*/ - name->str = p; - name->len -= tmp.len; return found; } @@ -173,7 +171,7 @@ static struct object *directory_lookup_name( struct object *obj, struct unicode_ { if (tmp.len == 0) /* Double backslash */ set_error( STATUS_OBJECT_NAME_INVALID ); - else if (p) /* Path still has backslashes */ + else if (tmp.len < name->len) /* Path still has backslashes */ set_error( STATUS_OBJECT_PATH_NOT_FOUND ); } return NULL; diff --git a/server/object.c b/server/object.c index 94a48c909bb..ee89b8698d0 100644 --- a/server/object.c +++ b/server/object.c @@ -276,6 +276,15 @@ struct object *lookup_named_object( struct object *root, const struct unicode_st return parent; } +/* return length of first path element in name */ +data_size_t get_path_element( const WCHAR *name, data_size_t len ) +{ + data_size_t i; + + for (i = 0; i < len / sizeof(WCHAR); i++) if (name[i] == '\\') break; + return i * sizeof(WCHAR); +} + static struct object *create_object( struct object *parent, const struct object_ops *ops, const struct unicode_str *name, const struct security_descriptor *sd ) { diff --git a/server/object.h b/server/object.h index 4a486e0d633..8114a8fb6b9 100644 --- a/server/object.h +++ b/server/object.h @@ -135,6 +135,7 @@ extern WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len ); extern void dump_object_name( struct object *obj ); extern struct object *lookup_named_object( struct object *root, const struct unicode_str *name, unsigned int attr, struct unicode_str *name_left ); +extern data_size_t get_path_element( const WCHAR *name, data_size_t len ); extern void *create_named_object( struct object *parent, const struct object_ops *ops, const struct unicode_str *name, unsigned int attributes, const struct security_descriptor *sd ); diff --git a/server/winstation.c b/server/winstation.c index b53e367fc14..43d112334d4 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -38,7 +38,6 @@ #include "user.h" #include "file.h" #include "security.h" -#include "wine/unicode.h" static struct list winstation_list = LIST_INIT(winstation_list); @@ -163,7 +162,7 @@ static struct object *winstation_lookup_name( struct object *obj, struct unicode if (!name) return NULL; /* open the winstation itself */ - if (memchrW( name->str, '\\', name->len / sizeof(WCHAR) )) /* no backslash allowed in name */ + if (get_path_element( name->str, name->len ) < name->len) /* no backslash allowed in name */ { set_error( STATUS_OBJECT_PATH_SYNTAX_BAD ); return NULL; @@ -262,7 +261,7 @@ static int desktop_link_name( struct object *obj, struct object_name *name, stru set_error( STATUS_OBJECT_TYPE_MISMATCH ); return 0; } - if (memchrW( name->name, '\\', name->len / sizeof(WCHAR) )) /* no backslash allowed in name */ + if (get_path_element( name->name, name->len ) < name->len) /* no backslash allowed in name */ { set_error( STATUS_OBJECT_PATH_SYNTAX_BAD ); return 0;