Zebediah Figura : server: Do not create an iosb for IRP calls not associated with an async.
Alexandre Julliard
julliard at winehq.org
Thu Sep 2 15:45:29 CDT 2021
Module: wine
Branch: master
Commit: fd4e7703e97fef65d809cde9125b45db3381c499
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fd4e7703e97fef65d809cde9125b45db3381c499
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Sep 1 17:28:37 2021 -0500
server: Do not create an iosb for IRP calls not associated with an async.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/async.c | 54 +++++++++++++++++++++++++++---------------------------
server/device.c | 36 +++++++++++++++++++-----------------
server/file.h | 1 -
3 files changed, 46 insertions(+), 45 deletions(-)
diff --git a/server/async.c b/server/async.c
index 5deaf04d686..d45f234144d 100644
--- a/server/async.c
+++ b/server/async.c
@@ -282,32 +282,6 @@ void set_async_pending( struct async *async, int signal )
}
}
-/* create an async associated with iosb for async-based requests
- * returned async must be passed to async_handoff */
-struct async *create_request_async( struct fd *fd, unsigned int comp_flags, const async_data_t *data )
-{
- struct async *async;
- struct iosb *iosb;
-
- if (!(iosb = create_iosb( get_req_data(), get_req_data_size(), get_reply_max_size() )))
- return NULL;
-
- async = create_async( fd, current, data, iosb );
- release_object( iosb );
- if (async)
- {
- if (!(async->wait_handle = alloc_handle( current->process, async, SYNCHRONIZE, 0 )))
- {
- release_object( async );
- return NULL;
- }
- async->pending = 0;
- async->direct_result = 1;
- async->comp_flags = comp_flags;
- }
- return async;
-}
-
/* return async object status and wait handle to client */
obj_handle_t async_handoff( struct async *async, int success, data_size_t *result, int force_blocking )
{
@@ -536,7 +510,7 @@ static void iosb_destroy( struct object *obj )
}
/* allocate iosb struct */
-struct iosb *create_iosb( const void *in_data, data_size_t in_size, data_size_t out_size )
+static struct iosb *create_iosb( const void *in_data, data_size_t in_size, data_size_t out_size )
{
struct iosb *iosb;
@@ -558,6 +532,32 @@ struct iosb *create_iosb( const void *in_data, data_size_t in_size, data_size_t
return iosb;
}
+/* create an async associated with iosb for async-based requests
+ * returned async must be passed to async_handoff */
+struct async *create_request_async( struct fd *fd, unsigned int comp_flags, const async_data_t *data )
+{
+ struct async *async;
+ struct iosb *iosb;
+
+ if (!(iosb = create_iosb( get_req_data(), get_req_data_size(), get_reply_max_size() )))
+ return NULL;
+
+ async = create_async( fd, current, data, iosb );
+ release_object( iosb );
+ if (async)
+ {
+ if (!(async->wait_handle = alloc_handle( current->process, async, SYNCHRONIZE, 0 )))
+ {
+ release_object( async );
+ return NULL;
+ }
+ async->pending = 0;
+ async->direct_result = 1;
+ async->comp_flags = comp_flags;
+ }
+ return async;
+}
+
struct iosb *async_get_iosb( struct async *async )
{
return async->iosb ? (struct iosb *)grab_object( async->iosb ) : NULL;
diff --git a/server/device.c b/server/device.c
index ef93a0a9024..a89c03f0fb0 100644
--- a/server/device.c
+++ b/server/device.c
@@ -369,11 +369,6 @@ static struct irp_call *create_irp( struct device_file *file, const irp_params_t
irp->user_ptr = 0;
if (async) irp->iosb = async_get_iosb( async );
- if (!irp->iosb && !(irp->iosb = create_iosb( NULL, 0, 0 )))
- {
- release_object( irp );
- irp = NULL;
- }
}
return irp;
}
@@ -382,21 +377,22 @@ static void set_irp_result( struct irp_call *irp, unsigned int status,
const void *out_data, data_size_t out_size, data_size_t result )
{
struct device_file *file = irp->file;
- struct iosb *iosb = irp->iosb;
if (!file) return; /* already finished */
- iosb->status = status;
- iosb->result = result;
- iosb->out_size = min( iosb->out_size, out_size );
- if (iosb->out_size && !(iosb->out_data = memdup( out_data, iosb->out_size )))
- iosb->out_size = 0;
-
/* remove it from the device queue */
list_remove( &irp->dev_entry );
irp->file = NULL;
if (irp->async)
{
+ struct iosb *iosb = irp->iosb;
+
+ iosb->status = status;
+ iosb->result = result;
+ iosb->out_size = min( iosb->out_size, out_size );
+ if (iosb->out_size && !(iosb->out_data = memdup( out_data, iosb->out_size )))
+ iosb->out_size = 0;
+
if (result) status = STATUS_ALERTED;
async_terminate( irp->async, status );
release_object( irp->async );
@@ -993,15 +989,21 @@ DECL_HANDLER(get_next_device_request)
reply->client_tid = get_thread_id( thread );
iosb = irp->iosb;
- reply->in_size = iosb->in_size;
- if (iosb->in_size > get_reply_max_size()) set_error( STATUS_BUFFER_OVERFLOW );
+ if (iosb)
+ reply->in_size = iosb->in_size;
+
+ if (iosb && iosb->in_size > get_reply_max_size())
+ set_error( STATUS_BUFFER_OVERFLOW );
else if (!irp->file || (reply->next = alloc_handle( current->process, irp, 0, 0 )))
{
if (fill_irp_params( manager, irp, &reply->params ))
{
- set_reply_data_ptr( iosb->in_data, iosb->in_size );
- iosb->in_data = NULL;
- iosb->in_size = 0;
+ if (iosb)
+ {
+ set_reply_data_ptr( iosb->in_data, iosb->in_size );
+ iosb->in_data = NULL;
+ iosb->in_size = 0;
+ }
list_remove( &irp->mgr_entry );
list_init( &irp->mgr_entry );
/* we already own the object if it's only on manager queue */
diff --git a/server/file.h b/server/file.h
index 10b5c0d0493..f6c5832a733 100644
--- a/server/file.h
+++ b/server/file.h
@@ -230,7 +230,6 @@ extern void async_terminate( struct async *async, unsigned int status );
extern void async_wake_up( struct async_queue *queue, unsigned int status );
extern struct completion *fd_get_completion( struct fd *fd, apc_param_t *p_key );
extern void fd_copy_completion( struct fd *src, struct fd *dst );
-extern struct iosb *create_iosb( const void *in_data, data_size_t in_size, data_size_t out_size );
extern struct iosb *async_get_iosb( struct async *async );
extern struct thread *async_get_thread( struct async *async );
extern struct async *find_pending_async( struct async_queue *queue );
More information about the wine-cvs
mailing list