server: Limit the number of allocated handles before running out of memory.
authorAlexandre Julliard <julliard@winehq.org>
Thu, 4 Dec 2008 15:12:04 +0000 (16:12 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 4 Dec 2008 15:12:04 +0000 (16:12 +0100)
server/handle.c
server/trace.c

index 29214d6d01327d11857692c0a3878d97d706c291..37cfa9b28efb3e7a1d28117897f6147e7dcf7644 100644 (file)
@@ -64,6 +64,7 @@ static struct handle_table *global_table;
 #define RESERVED_ALL           (RESERVED_INHERIT | RESERVED_CLOSE_PROTECT)
 
 #define MIN_HANDLE_ENTRIES  32
+#define MAX_HANDLE_ENTRIES  0x00ffffff
 
 
 /* handle to table index conversion */
@@ -191,13 +192,12 @@ struct handle_table *alloc_handle_table( struct process *process, int count )
 static int grow_handle_table( struct handle_table *table )
 {
     struct handle_entry *new_entries;
-    int count = table->count;
+    int count = min( table->count * 2, MAX_HANDLE_ENTRIES );
 
-    if (count >= INT_MAX / 2) return 0;
-    count *= 2;
-    if (!(new_entries = realloc( table->entries, count * sizeof(struct handle_entry) )))
+    if (count == table->count ||
+        !(new_entries = realloc( table->entries, count * sizeof(struct handle_entry) )))
     {
-        set_error( STATUS_NO_MEMORY );
+        set_error( STATUS_INSUFFICIENT_RESOURCES );
         return 0;
     }
     table->entries = new_entries;
index 8b6e622f03314716ebd9b07d11a7da93d9d5fe4f..dfbddacbd2975000b82df5498d8b082ce7b5922d 100644 (file)
@@ -4582,6 +4582,7 @@ static const struct
     { "HANDLE_NOT_CLOSABLE",         STATUS_HANDLE_NOT_CLOSABLE },
     { "ILLEGAL_FUNCTION",            STATUS_ILLEGAL_FUNCTION },
     { "INSTANCE_NOT_AVAILABLE",      STATUS_INSTANCE_NOT_AVAILABLE },
+    { "INSUFFICIENT_RESOURCES",      STATUS_INSUFFICIENT_RESOURCES },
     { "INVALID_CID",                 STATUS_INVALID_CID },
     { "INVALID_DEVICE_REQUEST",      STATUS_INVALID_DEVICE_REQUEST },
     { "INVALID_FILE_FOR_SECTION",    STATUS_INVALID_FILE_FOR_SECTION },