Eric Pouech : server: Properly return the errors for bare console objects.

Alexandre Julliard julliard at winehq.org
Wed Sep 1 11:08:55 CDT 2010


Module: wine
Branch: master
Commit: daaee9e50feee79abe03f7eba7fc2b0dfa930f40
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=daaee9e50feee79abe03f7eba7fc2b0dfa930f40

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Mon Aug 30 22:19:12 2010 +0200

server: Properly return the errors for bare console objects.

---

 server/console.c |   59 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/server/console.c b/server/console.c
index 954c51d..2ca6bd4 100644
--- a/server/console.c
+++ b/server/console.c
@@ -731,6 +731,13 @@ static int set_console_input_info( const struct set_console_input_info_request *
     struct console_renderer_event evt;
 
     if (!(console = console_input_get( req->handle, FILE_WRITE_PROPERTIES ))) goto error;
+    if (console_input_is_bare(console) &&
+        (req->mask & (SET_CONSOLE_INPUT_INFO_ACTIVE_SB|
+                      SET_CONSOLE_INPUT_INFO_WIN)))
+    {
+        set_error( STATUS_UNSUCCESSFUL );
+        goto error;
+    }
 
     memset(&evt.u, 0, sizeof(evt.u));
     if (req->mask & SET_CONSOLE_INPUT_INFO_ACTIVE_SB)
@@ -1339,17 +1346,13 @@ static void read_console_output( struct screen_buffer *screen_buffer, int x, int
 }
 
 /* scroll parts of a screen buffer */
-static void scroll_console_output( obj_handle_t handle, int xsrc, int ysrc, int xdst, int ydst,
+static void scroll_console_output( struct screen_buffer *screen_buffer, int xsrc, int ysrc, int xdst, int ydst,
                                    int w, int h )
 {
-    struct screen_buffer *screen_buffer;
     int				j;
     char_info_t *psrc, *pdst;
     struct console_renderer_event evt;
 
-    if (!(screen_buffer = (struct screen_buffer *)get_handle_obj( current->process, handle,
-                                                                  FILE_WRITE_DATA, &screen_buffer_ops )))
-	return;
     if (xsrc < 0 || ysrc < 0 || xdst < 0 || ydst < 0 ||
 	xsrc + w > screen_buffer->width  ||
 	xdst + w > screen_buffer->width  ||
@@ -1358,7 +1361,6 @@ static void scroll_console_output( obj_handle_t handle, int xsrc, int ysrc, int
 	w == 0 || h == 0)
     {
 	set_error( STATUS_INVALID_PARAMETER );
-	release_object( screen_buffer );
 	return;
     }
 
@@ -1396,8 +1398,6 @@ static void scroll_console_output( obj_handle_t handle, int xsrc, int ysrc, int
     evt.u.update.top    = min(ysrc, ydst);
     evt.u.update.bottom = max(ysrc, ydst) + h - 1;
     console_input_events_append( screen_buffer->input, &evt );
-
-    release_object( screen_buffer );
 }
 
 /* allocate a console for the renderer */
@@ -1615,7 +1615,7 @@ DECL_HANDLER(create_console_output)
     {
         if ((fd = thread_get_inflight_fd( current, req->fd )) == -1)
         {
-            set_error( STATUS_INVALID_HANDLE ); /* FIXME */
+            set_error( STATUS_INVALID_HANDLE );
             return;
         }
     }
@@ -1625,6 +1625,12 @@ DECL_HANDLER(create_console_output)
         close(fd);
         return;
     }
+    if (console_input_is_bare( console ) ^ (fd != -1))
+    {
+        close( fd );
+        set_error( STATUS_INVALID_HANDLE );
+        return;
+    }
 
     screen_buffer = create_console_output( console, fd );
     if (screen_buffer)
@@ -1683,6 +1689,12 @@ DECL_HANDLER(read_console_output)
     if ((screen_buffer = (struct screen_buffer*)get_handle_obj( current->process, req->handle,
                                                                 FILE_READ_DATA, &screen_buffer_ops )))
     {
+        if (console_input_is_bare( screen_buffer->input ))
+        {
+            set_error( STATUS_OBJECT_TYPE_MISMATCH );
+            release_object( screen_buffer );
+            return;
+        }
         read_console_output( screen_buffer, req->x, req->y, req->mode, req->wrap );
         reply->width  = screen_buffer->width;
         reply->height = screen_buffer->height;
@@ -1698,6 +1710,12 @@ DECL_HANDLER(write_console_output)
     if ((screen_buffer = (struct screen_buffer*)get_handle_obj( current->process, req->handle,
                                                                 FILE_WRITE_DATA, &screen_buffer_ops)))
     {
+        if (console_input_is_bare( screen_buffer->input ))
+        {
+            set_error( STATUS_OBJECT_TYPE_MISMATCH );
+            release_object( screen_buffer );
+            return;
+        }
         reply->written = write_console_output( screen_buffer, get_req_data_size(), get_req_data(),
                                                req->mode, req->x, req->y, req->wrap );
         reply->width  = screen_buffer->width;
@@ -1714,6 +1732,12 @@ DECL_HANDLER(fill_console_output)
     if ((screen_buffer = (struct screen_buffer*)get_handle_obj( current->process, req->handle,
                                                                 FILE_WRITE_DATA, &screen_buffer_ops)))
     {
+        if (console_input_is_bare( screen_buffer->input ))
+        {
+            set_error( STATUS_OBJECT_TYPE_MISMATCH );
+            release_object( screen_buffer );
+            return;
+        }
         reply->written = fill_console_output( screen_buffer, req->data, req->mode,
                                               req->x, req->y, req->count, req->wrap );
         release_object( screen_buffer );
@@ -1723,8 +1747,21 @@ DECL_HANDLER(fill_console_output)
 /* move a rect of data in a screen buffer */
 DECL_HANDLER(move_console_output)
 {
-    scroll_console_output( req->handle, req->x_src, req->y_src, req->x_dst, req->y_dst,
-			   req->w, req->h );
+    struct screen_buffer *screen_buffer;
+
+    if ((screen_buffer = (struct screen_buffer*)get_handle_obj( current->process, req->handle,
+                                                                FILE_WRITE_DATA, &screen_buffer_ops)))
+    {
+        if (console_input_is_bare( screen_buffer->input ))
+        {
+            set_error( STATUS_OBJECT_TYPE_MISMATCH );
+            release_object( screen_buffer );
+            return;
+        }
+        scroll_console_output( screen_buffer, req->x_src, req->y_src, req->x_dst, req->y_dst,
+                               req->w, req->h );
+        release_object( screen_buffer );
+    }
 }
 
 /* sends a signal to a console (process, group...) */




More information about the wine-cvs mailing list