fix incomplete memory wrap around logic (gcc 12 -Waddress)
authorMichael Gilbert <mgilbert@debian.org>
Wed, 6 Jul 2022 00:44:32 +0000 (01:44 +0100)
committerMichael Gilbert <mgilbert@debian.org>
Wed, 6 Jul 2022 00:44:32 +0000 (01:44 +0100)
Gbp-Pq: Topic warnings
Gbp-Pq: Name address.patch

dlls/ntdll/unix/virtual.c
libs/wine/mmap.c

index 1f817cd977d8e80aab66c5e5ed8fcfc0f7edfc39..0ed89b6ce5dd6282b1997959e99413fb7197817e 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <sys/types.h>
@@ -235,10 +236,13 @@ void *anon_mmap_alloc( size_t size, int prot )
 
 static void mmap_add_reserved_area( void *addr, SIZE_T size )
 {
+    SIZE_T max_size = SIZE_MAX - (SIZE_T)addr;
     struct reserved_area *area;
     struct list *ptr;
 
-    if (!((char *)addr + size)) size--;  /* avoid wrap-around */
+    _Static_assert(sizeof(SIZE_MAX) == sizeof(SIZE_T), "SIZE_MAX and SIZE_T are not the same size");
+
+    if (size > max_size) size = max_size;  /* avoid wrap-around */
 
     LIST_FOR_EACH( ptr, &reserved_areas )
     {
@@ -284,10 +288,13 @@ static void mmap_add_reserved_area( void *addr, SIZE_T size )
 
 static void mmap_remove_reserved_area( void *addr, SIZE_T size )
 {
+    SIZE_T max_size = SIZE_MAX - (SIZE_T)addr;
     struct reserved_area *area;
     struct list *ptr;
 
-    if (!((char *)addr + size)) size--;  /* avoid wrap-around */
+    _Static_assert(sizeof(SIZE_MAX) == sizeof(SIZE_T), "SIZE_MAX and SIZE_T are not the same size");
+
+    if (size > max_size) size = max_size; /* avoid wrap-around */
 
     ptr = list_head( &reserved_areas );
     /* find the first area covering address */
index ad51153d0394faf5b0403d6fb1c615036ead1512..c8b6bba94efd1dbd4a636a1e5c0208cd86dcae85 100644 (file)
@@ -498,10 +498,13 @@ void mmap_init(void)
  */
 void wine_mmap_add_reserved_area_obsolete( void *addr, size_t size )
 {
+    size_t max_size = SIZE_MAX - (size_t)addr;
     struct reserved_area *area;
     struct list *ptr;
 
-    if (!((char *)addr + size)) size--;  /* avoid wrap-around */
+    _Static_assert(sizeof(SIZE_MAX) == sizeof(size_t), "SIZE_MAX and SIZE_T are not the same size");
+
+    if (size > max_size) size = max_size;  /* avoid wrap-around */
 
     LIST_FOR_EACH( ptr, &reserved_areas )
     {
@@ -557,10 +560,13 @@ void wine_mmap_add_reserved_area_obsolete( void *addr, size_t size )
  */
 void wine_mmap_remove_reserved_area_obsolete( void *addr, size_t size, int unmap )
 {
+    size_t max_size = SIZE_MAX - (size_t)addr;
     struct reserved_area *area;
     struct list *ptr;
 
-    if (!((char *)addr + size)) size--;  /* avoid wrap-around */
+    _Static_assert(sizeof(SIZE_MAX) == sizeof(size_t), "SIZE_MAX and SIZE_T are not the same size");
+
+    if (size > max_size) size = max_size;  /* avoid wrap-around */
 
     ptr = list_head( &reserved_areas );
     /* find the first area covering address */