[PATCH 5/7] server: Add a helper to call async_request_complete() while allocating new memory.
Zebediah Figura
zfigura at codeweavers.com
Wed Sep 1 17:28:39 CDT 2021
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
server/async.c | 15 +++++++++++++++
server/console.c | 7 +------
server/device.c | 6 +-----
server/file.h | 2 ++
server/sock.c | 6 +-----
5 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/server/async.c b/server/async.c
index e71dceb201b..17ef709f89e 100644
--- a/server/async.c
+++ b/server/async.c
@@ -361,6 +361,21 @@ void async_request_complete( struct async *async, unsigned int status, data_size
async_terminate( async, status );
}
+/* complete a request-based async */
+void async_request_complete_alloc( struct async *async, unsigned int status, data_size_t result,
+ data_size_t out_size, const void *out_data )
+{
+ void *out_data_copy = NULL;
+
+ if (out_size && !(out_data_copy = memdup( out_data, out_size )))
+ {
+ async_terminate( async, STATUS_NO_MEMORY );
+ return;
+ }
+
+ async_request_complete( async, status, result, out_size, out_data_copy );
+}
+
/* set the timeout of an async operation */
void async_set_timeout( struct async *async, timeout_t timeout, unsigned int status )
{
diff --git a/server/console.c b/server/console.c
index 94f7c37e7c5..3360f680448 100644
--- a/server/console.c
+++ b/server/console.c
@@ -1500,12 +1500,7 @@ DECL_HANDLER(get_next_console_request)
{
data_size_t out_size = min( iosb->out_size, get_req_data_size() );
data_size_t result = ioctl->code == IOCTL_CONDRV_WRITE_FILE ? iosb->in_size : out_size;
- void *out_data;
-
- if (!out_size || (out_data = memdup( get_req_data(), out_size )))
- async_request_complete( async, status, result, out_size, out_data );
- else
- async_terminate( async, STATUS_NO_MEMORY );
+ async_request_complete_alloc( async, status, result, out_size, get_req_data() );
}
release_object( async );
diff --git a/server/device.c b/server/device.c
index 96389a1459b..29b36845e68 100644
--- a/server/device.c
+++ b/server/device.c
@@ -385,12 +385,8 @@ static void set_irp_result( struct irp_call *irp, unsigned int status,
irp->file = NULL;
if (irp->async)
{
- void *out_data;
-
out_size = min( irp->iosb->out_size, out_size );
- if (out_size && !(out_data = memdup( out_data, out_size )))
- out_size = 0;
- async_request_complete( irp->async, status, result, out_size, out_data );
+ async_request_complete_alloc( irp->async, status, result, out_size, out_data );
release_object( irp->async );
irp->async = NULL;
}
diff --git a/server/file.h b/server/file.h
index 1c019a0667e..8e42cd3704e 100644
--- a/server/file.h
+++ b/server/file.h
@@ -229,6 +229,8 @@ extern int async_waiting( struct async_queue *queue );
extern void async_terminate( struct async *async, unsigned int status );
extern void async_request_complete( struct async *async, unsigned int status, data_size_t result,
data_size_t out_size, void *out_data );
+extern void async_request_complete_alloc( struct async *async, unsigned int status, data_size_t result,
+ data_size_t out_size, const void *out_data );
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 );
diff --git a/server/sock.c b/server/sock.c
index 00d5d47edff..1e31b806986 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -710,7 +710,6 @@ static void complete_async_accept( struct sock *sock, struct accept_req *req )
else
{
obj_handle_t handle;
- void *out_data;
if (!(acceptsock = accept_socket( sock )))
{
@@ -727,10 +726,7 @@ static void complete_async_accept( struct sock *sock, struct accept_req *req )
return;
}
- if (!(out_data = malloc( sizeof(handle) ))) return;
-
- memcpy( out_data, &handle, sizeof(handle) );
- async_request_complete( req->async, STATUS_SUCCESS, 0, sizeof(handle), out_data );
+ async_request_complete_alloc( req->async, STATUS_SUCCESS, 0, sizeof(handle), &handle );
}
}
--
2.33.0
More information about the wine-devel
mailing list