mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
server-Pipe_ObjectName: Update and simplify patchset.
This commit is contained in:
parent
fe47c7cf07
commit
dce75fac5b
@ -5443,16 +5443,14 @@ fi
|
||||
# | * rpcrt4-Pipe_Transport, server-Desktop_Refcount, kernel32-Named_Pipe
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * server/named_pipe.c, server/object.c, server/object.h
|
||||
# | * server/named_pipe.c, server/object.c
|
||||
# |
|
||||
if test "$enable_server_Pipe_ObjectName" -eq 1; then
|
||||
patch_apply server-Pipe_ObjectName/0001-server-Move-parent-reference-from-object_name-to-obj.patch
|
||||
patch_apply server-Pipe_ObjectName/0002-server-Link-named-pipes-to-their-device.patch
|
||||
patch_apply server-Pipe_ObjectName/0003-server-Store-a-reference-to-the-parent-object-for-pi.patch
|
||||
patch_apply server-Pipe_ObjectName/0001-server-Link-named-pipes-to-their-device.patch
|
||||
patch_apply server-Pipe_ObjectName/0002-server-Store-a-reference-to-the-parent-object-for-pi.patch
|
||||
(
|
||||
echo '+ { "Sebastian Lackner", "server: Move parent reference from object_name to object.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "server: Link named pipes to their device.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "server: Store a reference to the parent object for pipe servers.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "server: Store a reference to the parent object for pipe servers.", 2 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
|
@ -1,123 +0,0 @@
|
||||
From fa91df6b120d18ad5c44c204dd5f17da734b859b Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Mon, 17 Aug 2015 00:13:27 +0200
|
||||
Subject: server: Move parent reference from object_name to object.
|
||||
|
||||
---
|
||||
server/object.c | 22 +++++++++++-----------
|
||||
server/object.h | 1 +
|
||||
2 files changed, 12 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/server/object.c b/server/object.c
|
||||
index 1ec547a..b330831 100644
|
||||
--- a/server/object.c
|
||||
+++ b/server/object.c
|
||||
@@ -44,7 +44,6 @@ struct object_name
|
||||
{
|
||||
struct list entry; /* entry in the hash list */
|
||||
struct object *obj; /* object owning this name */
|
||||
- struct object *parent; /* parent object */
|
||||
data_size_t len; /* name length in bytes */
|
||||
WCHAR name[1];
|
||||
};
|
||||
@@ -138,18 +137,15 @@ static struct object_name *alloc_name( const struct unicode_str *name )
|
||||
if ((ptr = mem_alloc( sizeof(*ptr) + name->len - sizeof(ptr->name) )))
|
||||
{
|
||||
ptr->len = name->len;
|
||||
- ptr->parent = NULL;
|
||||
memcpy( ptr->name, name->str, name->len );
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/* free the name of an object */
|
||||
-static void free_name( struct object *obj )
|
||||
+static void free_name( struct object_name *ptr )
|
||||
{
|
||||
- struct object_name *ptr = obj->name;
|
||||
list_remove( &ptr->entry );
|
||||
- if (ptr->parent) release_object( ptr->parent );
|
||||
free( ptr );
|
||||
}
|
||||
|
||||
@@ -185,7 +181,7 @@ WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len )
|
||||
{
|
||||
struct object_name *name = ptr->name;
|
||||
len += name->len + sizeof(WCHAR);
|
||||
- ptr = name->parent;
|
||||
+ ptr = ptr->parent;
|
||||
}
|
||||
if (!len) return NULL;
|
||||
if (!(ret = malloc( len ))) return NULL;
|
||||
@@ -197,7 +193,7 @@ WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len )
|
||||
memcpy( ret + len - name->len, name->name, name->len );
|
||||
len -= name->len + sizeof(WCHAR);
|
||||
memcpy( ret + len, &backslash, sizeof(WCHAR) );
|
||||
- obj = name->parent;
|
||||
+ obj = obj->parent;
|
||||
}
|
||||
return (WCHAR *)ret;
|
||||
}
|
||||
@@ -210,6 +206,7 @@ void *alloc_object( const struct object_ops *ops )
|
||||
{
|
||||
obj->refcount = 1;
|
||||
obj->handle_count = 0;
|
||||
+ obj->parent = NULL;
|
||||
obj->ops = ops;
|
||||
obj->name = NULL;
|
||||
obj->sd = NULL;
|
||||
@@ -232,7 +229,7 @@ void *create_object( struct namespace *namespace, const struct object_ops *ops,
|
||||
if ((obj = alloc_object( ops )))
|
||||
{
|
||||
set_object_name( namespace, obj, name_ptr );
|
||||
- if (parent) name_ptr->parent = grab_object( parent );
|
||||
+ if (parent) obj->parent = grab_object( parent );
|
||||
}
|
||||
else
|
||||
free( name_ptr );
|
||||
@@ -275,7 +272,7 @@ static void dump_name( struct object *obj )
|
||||
struct object_name *name = obj->name;
|
||||
|
||||
if (!name) return;
|
||||
- if (name->parent) dump_name( name->parent );
|
||||
+ if (obj->parent) dump_name( obj->parent );
|
||||
fputs( "\\\\", stderr );
|
||||
dump_strW( name->name, name->len / sizeof(WCHAR), stderr, "[]" );
|
||||
}
|
||||
@@ -292,8 +289,10 @@ void dump_object_name( struct object *obj )
|
||||
/* unlink a named object from its namespace, without freeing the object itself */
|
||||
void unlink_named_object( struct object *obj )
|
||||
{
|
||||
- if (obj->name) free_name( obj );
|
||||
+ if (obj->name) free_name( obj->name );
|
||||
+ if (obj->parent) release_object( obj->parent );
|
||||
obj->name = NULL;
|
||||
+ obj->parent = NULL;
|
||||
}
|
||||
|
||||
/* mark an object as being stored statically, i.e. only released at shutdown */
|
||||
@@ -325,7 +324,8 @@ void release_object( void *ptr )
|
||||
/* if the refcount is 0, nobody can be in the wait queue */
|
||||
assert( list_empty( &obj->wait_queue ));
|
||||
obj->ops->destroy( obj );
|
||||
- if (obj->name) free_name( obj );
|
||||
+ if (obj->name) free_name( obj->name );
|
||||
+ if (obj->parent) release_object( obj->parent );
|
||||
free( obj->sd );
|
||||
#ifdef DEBUG_OBJECTS
|
||||
list_remove( &obj->obj_list );
|
||||
diff --git a/server/object.h b/server/object.h
|
||||
index 8e010a3..4b554bc 100644
|
||||
--- a/server/object.h
|
||||
+++ b/server/object.h
|
||||
@@ -96,6 +96,7 @@ struct object
|
||||
{
|
||||
unsigned int refcount; /* reference count */
|
||||
unsigned int handle_count;/* handle count */
|
||||
+ struct object *parent; /* parent object */
|
||||
const struct object_ops *ops;
|
||||
struct list wait_queue;
|
||||
struct object_name *name;
|
||||
--
|
||||
2.6.4
|
||||
|
@ -0,0 +1,124 @@
|
||||
From 3a5501c1595dd32c25c9df6acb377aa92037b49f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Mon, 17 Aug 2015 01:11:47 +0200
|
||||
Subject: server: Store a reference to the parent object for pipe servers. (v2)
|
||||
|
||||
---
|
||||
server/named_pipe.c | 11 +++++++----
|
||||
server/object.c | 31 ++++++++++++++++++++++---------
|
||||
2 files changed, 29 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/server/named_pipe.c b/server/named_pipe.c
|
||||
index 49b3f62..36a5c78 100644
|
||||
--- a/server/named_pipe.c
|
||||
+++ b/server/named_pipe.c
|
||||
@@ -765,9 +765,10 @@ static struct pipe_server *get_pipe_server_obj( struct process *process,
|
||||
static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned int options,
|
||||
unsigned int pipe_flags )
|
||||
{
|
||||
+ static const struct unicode_str str = { NULL, 0 };
|
||||
struct pipe_server *server;
|
||||
|
||||
- server = alloc_object( &pipe_server_ops );
|
||||
+ server = create_object( NULL, &pipe_server_ops, &str, &pipe->obj );
|
||||
if (!server)
|
||||
return NULL;
|
||||
|
||||
@@ -789,11 +790,13 @@ static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned
|
||||
return server;
|
||||
}
|
||||
|
||||
-static struct pipe_client *create_pipe_client( unsigned int flags, unsigned int pipe_flags )
|
||||
+static struct pipe_client *create_pipe_client( struct named_pipe *pipe, unsigned int flags,
|
||||
+ unsigned int pipe_flags )
|
||||
{
|
||||
+ static const struct unicode_str str = { NULL, 0 };
|
||||
struct pipe_client *client;
|
||||
|
||||
- client = alloc_object( &pipe_client_ops );
|
||||
+ client = create_object( NULL, &pipe_client_ops, &str, &pipe->obj );
|
||||
if (!client)
|
||||
return NULL;
|
||||
|
||||
@@ -879,7 +882,7 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- if ((client = create_pipe_client( options, pipe->flags )))
|
||||
+ if ((client = create_pipe_client( pipe, options, pipe->flags )))
|
||||
{
|
||||
type = ((pipe->flags & NAMED_PIPE_MESSAGE_STREAM_WRITE) && is_messagemode_supported()) ?
|
||||
SOCK_SEQPACKET : SOCK_STREAM;
|
||||
diff --git a/server/object.c b/server/object.c
|
||||
index a1b1184..fd24722 100644
|
||||
--- a/server/object.c
|
||||
+++ b/server/object.c
|
||||
@@ -55,6 +55,7 @@ struct namespace
|
||||
struct list names[1]; /* array of hash entry lists */
|
||||
};
|
||||
|
||||
+static struct list dummy_namespace = LIST_INIT(dummy_namespace);
|
||||
|
||||
#ifdef DEBUG_OBJECTS
|
||||
static struct list object_list = LIST_INIT(object_list);
|
||||
@@ -157,9 +158,15 @@ static void free_name( struct object *obj )
|
||||
static void set_object_name( struct namespace *namespace,
|
||||
struct object *obj, struct object_name *ptr )
|
||||
{
|
||||
- int hash = get_name_hash( namespace, ptr->name, ptr->len );
|
||||
-
|
||||
- list_add_head( &namespace->names[hash], &ptr->entry );
|
||||
+ if (namespace)
|
||||
+ {
|
||||
+ int hash = get_name_hash( namespace, ptr->name, ptr->len );
|
||||
+ list_add_head( &namespace->names[hash], &ptr->entry );
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ list_add_tail( &dummy_namespace, &ptr->entry );
|
||||
+ }
|
||||
ptr->obj = obj;
|
||||
obj->name = ptr;
|
||||
}
|
||||
@@ -184,7 +191,7 @@ WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len )
|
||||
while (ptr && ptr->name)
|
||||
{
|
||||
struct object_name *name = ptr->name;
|
||||
- len += name->len + sizeof(WCHAR);
|
||||
+ if (name->len) len += name->len + sizeof(WCHAR);
|
||||
ptr = name->parent;
|
||||
}
|
||||
if (!len) return NULL;
|
||||
@@ -194,9 +201,12 @@ WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len )
|
||||
while (obj && obj->name)
|
||||
{
|
||||
struct object_name *name = obj->name;
|
||||
- memcpy( ret + len - name->len, name->name, name->len );
|
||||
- len -= name->len + sizeof(WCHAR);
|
||||
- memcpy( ret + len, &backslash, sizeof(WCHAR) );
|
||||
+ if (name->len)
|
||||
+ {
|
||||
+ memcpy( ret + len - name->len, name->name, name->len );
|
||||
+ len -= name->len + sizeof(WCHAR);
|
||||
+ memcpy( ret + len, &backslash, sizeof(WCHAR) );
|
||||
+ }
|
||||
obj = name->parent;
|
||||
}
|
||||
return (WCHAR *)ret;
|
||||
@@ -276,8 +286,11 @@ static void dump_name( struct object *obj )
|
||||
|
||||
if (!name) return;
|
||||
if (name->parent) dump_name( name->parent );
|
||||
- fputs( "\\\\", stderr );
|
||||
- dump_strW( name->name, name->len / sizeof(WCHAR), stderr, "[]" );
|
||||
+ if (name->len)
|
||||
+ {
|
||||
+ fputs( "\\\\", stderr );
|
||||
+ dump_strW( name->name, name->len / sizeof(WCHAR), stderr, "[]" );
|
||||
+ }
|
||||
}
|
||||
|
||||
/* dump the name of an object to stderr */
|
||||
--
|
||||
2.6.4
|
||||
|
@ -1,103 +0,0 @@
|
||||
From 84d1dc87366a3f72365b29f490da5bed67998386 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Mon, 17 Aug 2015 01:11:47 +0200
|
||||
Subject: server: Store a reference to the parent object for pipe servers.
|
||||
|
||||
---
|
||||
server/named_pipe.c | 9 +++++----
|
||||
server/object.c | 21 ++++++++++++---------
|
||||
2 files changed, 17 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/server/named_pipe.c b/server/named_pipe.c
|
||||
index 0ce3e59..283eb2c 100644
|
||||
--- a/server/named_pipe.c
|
||||
+++ b/server/named_pipe.c
|
||||
@@ -764,7 +764,7 @@ static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned
|
||||
{
|
||||
struct pipe_server *server;
|
||||
|
||||
- server = alloc_object( &pipe_server_ops );
|
||||
+ server = create_object( NULL, &pipe_server_ops, NULL, &pipe->obj );
|
||||
if (!server)
|
||||
return NULL;
|
||||
|
||||
@@ -786,11 +786,12 @@ static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned
|
||||
return server;
|
||||
}
|
||||
|
||||
-static struct pipe_client *create_pipe_client( unsigned int flags, unsigned int pipe_flags )
|
||||
+static struct pipe_client *create_pipe_client( struct named_pipe *pipe, unsigned int flags,
|
||||
+ unsigned int pipe_flags )
|
||||
{
|
||||
struct pipe_client *client;
|
||||
|
||||
- client = alloc_object( &pipe_client_ops );
|
||||
+ client = create_object( NULL, &pipe_client_ops, NULL, &pipe->obj );
|
||||
if (!client)
|
||||
return NULL;
|
||||
|
||||
@@ -876,7 +877,7 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- if ((client = create_pipe_client( options, pipe->flags )))
|
||||
+ if ((client = create_pipe_client( pipe, options, pipe->flags )))
|
||||
{
|
||||
type = ((pipe->flags & NAMED_PIPE_MESSAGE_STREAM_WRITE) && is_messagemode_supported()) ?
|
||||
SOCK_SEQPACKET : SOCK_STREAM;
|
||||
diff --git a/server/object.c b/server/object.c
|
||||
index bfb4689..5f16046 100644
|
||||
--- a/server/object.c
|
||||
+++ b/server/object.c
|
||||
@@ -175,22 +175,25 @@ WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len )
|
||||
data_size_t len = 0;
|
||||
char *ret;
|
||||
|
||||
- while (ptr && ptr->name)
|
||||
+ while (ptr)
|
||||
{
|
||||
struct object_name *name = ptr->name;
|
||||
- len += name->len + sizeof(WCHAR);
|
||||
+ if (name) len += name->len + sizeof(WCHAR);
|
||||
ptr = ptr->parent;
|
||||
}
|
||||
if (!len) return NULL;
|
||||
if (!(ret = malloc( len ))) return NULL;
|
||||
|
||||
*ret_len = len;
|
||||
- while (obj && obj->name)
|
||||
+ while (obj)
|
||||
{
|
||||
struct object_name *name = obj->name;
|
||||
- memcpy( ret + len - name->len, name->name, name->len );
|
||||
- len -= name->len + sizeof(WCHAR);
|
||||
- memcpy( ret + len, &backslash, sizeof(WCHAR) );
|
||||
+ if (name)
|
||||
+ {
|
||||
+ memcpy( ret + len - name->len, name->name, name->len );
|
||||
+ len -= name->len + sizeof(WCHAR);
|
||||
+ memcpy( ret + len, &backslash, sizeof(WCHAR) );
|
||||
+ }
|
||||
obj = obj->parent;
|
||||
}
|
||||
return (WCHAR *)ret;
|
||||
@@ -220,13 +223,13 @@ void *alloc_object( const struct object_ops *ops )
|
||||
void *create_object( struct namespace *namespace, const struct object_ops *ops,
|
||||
const struct unicode_str *name, struct object *parent )
|
||||
{
|
||||
+ struct object_name *name_ptr = NULL;
|
||||
struct object *obj;
|
||||
- struct object_name *name_ptr;
|
||||
|
||||
- if (!(name_ptr = alloc_name( name ))) return NULL;
|
||||
+ if (namespace && !(name_ptr = alloc_name( name ))) return NULL;
|
||||
if ((obj = alloc_object( ops )))
|
||||
{
|
||||
- set_object_name( namespace, obj, name_ptr );
|
||||
+ if (namespace) set_object_name( namespace, obj, name_ptr );
|
||||
if (parent) obj->parent = grab_object( parent );
|
||||
}
|
||||
else
|
||||
--
|
||||
2.5.0
|
||||
|
Loading…
x
Reference in New Issue
Block a user