Rémi Bernon : server: Grow rawinput buffer instead of allocating its maximum size.

Alexandre Julliard julliard at winehq.org
Tue Feb 9 15:57:07 CST 2021


Module: wine
Branch: master
Commit: 50798b1320b24e7c74d350853a895b16881c376d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=50798b1320b24e7c74d350853a895b16881c376d

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Mon Feb  8 12:09:43 2021 +0100

server: Grow rawinput buffer instead of allocating its maximum size.

Call of Duty: WWII call GetRawInputBuffer with very large client buffer,
so the maximum buffer size may be large and it causes an unnecessary
load on wineserver when it allocates and clears the reply buffer.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/queue.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/server/queue.c b/server/queue.c
index ad886a3ba80..e47980a4aa8 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -3256,12 +3256,11 @@ DECL_HANDLER(get_rawinput_buffer)
     struct thread_input *input = current->queue->input;
     data_size_t size = 0, next_size = 0;
     struct list *ptr;
-    char *buf, *cur;
-    int count = 0;
+    char *buf, *cur, *tmp;
+    int count = 0, buf_size = 16 * sizeof(struct hardware_msg_data);
 
     if (!req->buffer_size) buf = NULL;
-    else if (!(buf = mem_alloc( get_reply_max_size() )))
-        return;
+    else if (!(buf = mem_alloc( buf_size ))) return;
 
     cur = buf;
     ptr = list_head( &input->msg_list );
@@ -3276,6 +3275,17 @@ DECL_HANDLER(get_rawinput_buffer)
         next_size = req->rawinput_size;
         if (size + next_size > req->buffer_size) break;
         if (cur + sizeof(*data) > buf + get_reply_max_size()) break;
+        if (cur + sizeof(*data) > buf + buf_size)
+        {
+            buf_size += buf_size / 2;
+            if (!(tmp = realloc( buf, buf_size )))
+            {
+                set_error( STATUS_NO_MEMORY );
+                return;
+            }
+            cur = tmp + (cur - buf);
+            buf = tmp;
+        }
 
         memcpy(cur, data, sizeof(*data));
         list_remove( &msg->entry );




More information about the wine-cvs mailing list