Alexandre Julliard : ntdll:
Return an error instead of dying in wine_server_call if the input
buffer is invalid .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 20 07:42:45 CDT 2007
Module: wine
Branch: master
Commit: 7378fac50582b46b89e0d97f36ffb2dfc334952e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7378fac50582b46b89e0d97f36ffb2dfc334952e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Aug 20 14:40:18 2007 +0200
ntdll: Return an error instead of dying in wine_server_call if the input buffer is invalid.
---
dlls/ntdll/server.c | 17 ++++++++++-------
1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index 29c9cfd..33f81dc 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -219,7 +219,7 @@ void server_protocol_perror( const char *err )
*
* Send a request to the server.
*/
-static void send_request( const struct __server_request_info *req )
+static unsigned int send_request( const struct __server_request_info *req )
{
unsigned int i;
int ret;
@@ -227,7 +227,7 @@ static void send_request( const struct __server_request_info *req )
if (!req->u.req.request_header.request_size)
{
if ((ret = write( ntdll_get_thread_data()->request_fd, &req->u.req,
- sizeof(req->u.req) )) == sizeof(req->u.req)) return;
+ sizeof(req->u.req) )) == sizeof(req->u.req)) return STATUS_SUCCESS;
}
else
@@ -242,11 +242,12 @@ static void send_request( const struct __server_request_info *req )
vec[i+1].iov_len = req->data[i].size;
}
if ((ret = writev( ntdll_get_thread_data()->request_fd, vec, i+1 )) ==
- req->u.req.request_header.request_size + sizeof(req->u.req)) return;
+ req->u.req.request_header.request_size + sizeof(req->u.req)) return STATUS_SUCCESS;
}
if (ret >= 0) server_protocol_error( "partial write %d\n", ret );
if (errno == EPIPE) server_abort_thread(0);
+ if (errno == EFAULT) return STATUS_ACCESS_VIOLATION;
server_protocol_perror( "write" );
}
@@ -283,11 +284,12 @@ static void read_reply_data( void *buffer, size_t size )
*
* Wait for a reply from the server.
*/
-static inline void wait_reply( struct __server_request_info *req )
+static inline unsigned int wait_reply( struct __server_request_info *req )
{
read_reply_data( &req->u.reply, sizeof(req->u.reply) );
if (req->u.reply.reply_header.reply_size)
read_reply_data( req->reply_data, req->u.reply.reply_header.reply_size );
+ return req->u.reply.reply_header.error;
}
@@ -317,12 +319,13 @@ unsigned int wine_server_call( void *req_ptr )
{
struct __server_request_info * const req = req_ptr;
sigset_t old_set;
+ unsigned int ret;
pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, &old_set );
- send_request( req );
- wait_reply( req );
+ ret = send_request( req );
+ if (!ret) ret = wait_reply( req );
pthread_functions.sigprocmask( SIG_SETMASK, &old_set, NULL );
- return req->u.reply.reply_header.error;
+ return ret;
}
More information about the wine-cvs
mailing list