Subject: Re: CVS commit: syssrc/sys/uvm
To: None <atatat@netbsd.org>
From: enami tsugutomo <enami@sm.sony.co.jp>
List: source-changes
Date: 11/15/2002 16:51:25
Andrew Brown <atatat@netbsd.org> writes:

> cvs rdiff -r1.45 -r1.46 syssrc/sys/uvm/uvm_amap.c

@@ -385,6 +476,11 @@
 	newover = malloc(slotalloc * sizeof(struct vm_anon *), M_UVMAMAP,
 	    M_WAITOK | M_CANFAIL);
 	if (newsl == NULL || newbck == NULL || newover == NULL) {
+#ifdef UVM_AMAP_PPREF
+		if (newppref != NULL) {
+			free(amap->am_ppref, M_UVMAMAP);
+		}
+#endif
 		if (newsl != NULL) {
 			free(newsl, M_UVMAMAP);
 		}

- At this point, newppref isn't assigned to amap->am_ppref yet.

- I guess we can defer the deallocation of amap->am_ppref when failed
  to allocate newppref so that it remains unchanged if we return
  ENOMEM.

enami.
Index: uvm_amap.c
===================================================================
RCS file: /cvsroot/syssrc/sys/uvm/uvm_amap.c,v
retrieving revision 1.46
diff -u -r1.46 uvm_amap.c
--- uvm_amap.c	2002/11/14 17:58:49	1.46
+++ uvm_amap.c	2002/11/15 07:33:30
@@ -463,10 +463,6 @@
 	if (amap->am_ppref && amap->am_ppref != PPREF_NONE) {
 		newppref = malloc(slotalloc * sizeof(int), M_UVMAMAP,
 		    M_WAITOK | M_CANFAIL);
-		if (newppref == NULL) {
-			free(amap->am_ppref, M_UVMAMAP);
-			amap->am_ppref = PPREF_NONE;
-		}
 	}
 #endif
 	newsl = malloc(slotalloc * sizeof(int), M_UVMAMAP,
@@ -478,7 +474,7 @@
 	if (newsl == NULL || newbck == NULL || newover == NULL) {
 #ifdef UVM_AMAP_PPREF
 		if (newppref != NULL) {
-			free(amap->am_ppref, M_UVMAMAP);
+			free(newppref, M_UVMAMAP);
 		}
 #endif
 		if (newsl != NULL) {
@@ -562,7 +558,8 @@
 			pp_setreflen(newppref, slotalloc - slotneed, 1,
 			    slotneed - slotmapped);
 		}
-	}
+	} else
+		amap->am_ppref = PPREF_NONE;
 #endif
 
 	/* update master values */