svn commit: r286583 - head/sys/vm

Zbigniew Bodek zbb at FreeBSD.org
Mon Aug 10 17:16:50 UTC 2015


Author: zbb
Date: Mon Aug 10 17:16:49 2015
New Revision: 286583
URL: https://svnweb.freebsd.org/changeset/base/286583

Log:
  Avoid sign extension of value passed to kva_alloc from uma_zone_reserve_kva
  
  Fixes "panic: vm_radix_reserve_kva: unable to reserve KVA" caused by sign
  extention of "pages * UMA_SLAB_SIZE" value passed to kva_alloc() which
  takes unsigned long argument.
  
  In the erroneus case that triggered this bug, the number of pages
  to allocate in uma_zone_reserve_kva() was 0x8ebe6, that gave the
  total number of bytes to allocate equal to 0x8ebe6000 (int).
  This was then sign extended in kva_alloc() to 0xffffffff8ebe6000
  (unsigned long).
  
  Reviewed by:   alc, kib
  Submitted by:  Zbigniew Bodek <zbb at semihalf.com>
  Obtained from: Semihalf
  Sponsored by:  The FreeBSD Foundation
  Differential Revision: https://reviews.freebsd.org/D3346

Modified:
  head/sys/vm/uma_core.c

Modified: head/sys/vm/uma_core.c
==============================================================================
--- head/sys/vm/uma_core.c	Mon Aug 10 17:02:42 2015	(r286582)
+++ head/sys/vm/uma_core.c	Mon Aug 10 17:16:49 2015	(r286583)
@@ -3126,7 +3126,7 @@ uma_zone_reserve_kva(uma_zone_t zone, in
 {
 	uma_keg_t keg;
 	vm_offset_t kva;
-	int pages;
+	u_int pages;
 
 	keg = zone_first_keg(zone);
 	if (keg == NULL)
@@ -3141,7 +3141,7 @@ uma_zone_reserve_kva(uma_zone_t zone, in
 #else
 	if (1) {
 #endif
-		kva = kva_alloc(pages * UMA_SLAB_SIZE);
+		kva = kva_alloc((vm_size_t)pages * UMA_SLAB_SIZE);
 		if (kva == 0)
 			return (0);
 	} else


More information about the svn-src-all mailing list