From: Alexandre Julliard Date: Thu, 4 Dec 2008 15:12:04 +0000 (+0100) Subject: server: Limit the number of allocated handles before running out of memory. X-Git-Tag: wine-1.1.10~44 X-Git-Url: http://git.etersoft.ru/projects/?a=commitdiff_plain;h=9434e1996513c02861969fb4b766ab837587c4c1;p=wine%2Feterwine.git server: Limit the number of allocated handles before running out of memory. --- diff --git a/server/handle.c b/server/handle.c index 29214d6d01..37cfa9b28e 100644 --- a/server/handle.c +++ b/server/handle.c @@ -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; diff --git a/server/trace.c b/server/trace.c index 8b6e622f03..dfbddacbd2 100644 --- a/server/trace.c +++ b/server/trace.c @@ -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 },