Skip to contentSkip to conversation

boundary condition bug fix for vmalloc()

PATCH Kanoj Sarcar 2 participants 2 messages Apr 22, 1999 Memory management

lore
Share & tools
lore
#0 lore raw

Hi,

Under heavy load conditions, get_vm_area() might end up allocating an address range beyond VMALLOC_END. The problem is after the for loop in get_vm_area() terminates, no consistency check (addr > VMALLOC_END
- size) is performed on the "addr".

I believe the following patch will fix the problem:

vmalloc.c renamed from vmalloc.old +1 -1
@@ -161,11 +161,11 @@
        for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
                if (size + addr < (unsigned long) tmp->addr)
                        break;
+               addr = tmp->size + (unsigned long) tmp->addr;
                if (addr > VMALLOC_END-size) {
                        kfree(area);
                        return NULL;
                }
-               addr = tmp->size + (unsigned long) tmp->addr;
        }
        area->addr = (void *)addr;
        area->size = size + PAGE_SIZE;

Please let me know if this patch is pulled into the source tree, so I can update my tree.

Thanks.

Kanoj
[email protected]
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/

#1 lore raw

Patch: Re: boundary condition bug fix for vmalloc()

Hi,

Quoted 4 lines · On Wed, 21 Apr 1999 17:12:37 -0700 (PDT), [email protected] (Kanoj…

Under heavy load conditions, get_vm_area() might end up allocating an address range beyond VMALLOC_END. The problem is after the for loop in get_vm_area() terminates, no consistency check (addr > VMALLOC_END - size) is performed on the "addr".

Agreed, and the patch looks OK. Moving the test outside the for loop entirely has the same effect while shaving a few cycles off the function. The existing clearly broken in not checking the size of the final area if we ran off the end of the vm_area chain.

--Stephen

----------------------------------------------------------------

vmalloc.c renamed from vmalloc.c~ +4 -4
@@ -161,11 +161,11 @@
 	for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
 		if (size + addr < (unsigned long) tmp->addr)
 			break;
-		if (addr > VMALLOC_END-size) {
-			kfree(area);
-			return NULL;
-		}
 		addr = tmp->size + (unsigned long) tmp->addr;
+	}
+	if (addr > VMALLOC_END-size) {
+		kfree(area);
+		return NULL;
 	}
 	area->addr = (void *)addr;
 	area->size = size + PAGE_SIZE;

----------------------------------------------------------------
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address' in the body to [email protected]. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/