Module Name:    src
Committed By:   christos
Date:           Thu Dec  3 21:30:54 UTC 2015

Modified Files:
        src/sbin/gpt: create.c gpt.c map.c map.h recover.c resizedisk.c

Log Message:
CID 1341556: Don't leak map info


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sbin/gpt/create.c
cvs rdiff -u -r1.60 -r1.61 src/sbin/gpt/gpt.c
cvs rdiff -u -r1.12 -r1.13 src/sbin/gpt/map.c
cvs rdiff -u -r1.5 -r1.6 src/sbin/gpt/map.h
cvs rdiff -u -r1.13 -r1.14 src/sbin/gpt/recover.c
cvs rdiff -u -r1.14 -r1.15 src/sbin/gpt/resizedisk.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/gpt/create.c
diff -u src/sbin/gpt/create.c:1.18 src/sbin/gpt/create.c:1.19
--- src/sbin/gpt/create.c:1.18	Wed Dec  2 21:02:43 2015
+++ src/sbin/gpt/create.c	Thu Dec  3 16:30:54 2015
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/create.c,v 1.11 2005/08/31 01:47:19 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: create.c,v 1.18 2015/12/03 02:02:43 christos Exp $");
+__RCSID("$NetBSD: create.c,v 1.19 2015/12/03 21:30:54 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -102,7 +102,7 @@ create(gpt_t gpt, u_int parts, int force
 		mbr->mbr_sig = htole16(MBR_SIG);
 		gpt_create_pmbr_part(mbr->mbr_part, last);
 
-		map = map_add(gpt, 0LL, 1LL, MAP_TYPE_PMBR, mbr);
+		map = map_add(gpt, 0LL, 1LL, MAP_TYPE_PMBR, mbr, 1);
 		if (gpt_write(gpt, map) == -1) {
 			gpt_warn(gpt, "Can't write PMBR");
 			return -1;

Index: src/sbin/gpt/gpt.c
diff -u src/sbin/gpt/gpt.c:1.60 src/sbin/gpt/gpt.c:1.61
--- src/sbin/gpt/gpt.c:1.60	Wed Dec  2 21:16:00 2015
+++ src/sbin/gpt/gpt.c	Thu Dec  3 16:30:54 2015
@@ -35,7 +35,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/gpt.c,v 1.16 2006/07/07 02:44:23 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: gpt.c,v 1.60 2015/12/03 02:16:00 christos Exp $");
+__RCSID("$NetBSD: gpt.c,v 1.61 2015/12/03 21:30:54 christos Exp $");
 #endif
 
 #include <sys/param.h>
@@ -308,7 +308,7 @@ gpt_mbr(gpt_t gpt, off_t lba)
 			    (uintmax_t)lba);
 		else if (gpt->verbose > 1)
 			gpt_msg(gpt, "PMBR at sector %ju", (uintmax_t)lba);
-		p = map_add(gpt, lba, 1LL, MAP_TYPE_PMBR, mbr);
+		p = map_add(gpt, lba, 1LL, MAP_TYPE_PMBR, mbr, 1);
 		goto out;
 	}
 	if (pmbr)
@@ -316,7 +316,7 @@ gpt_mbr(gpt_t gpt, off_t lba)
 	else if (gpt->verbose > 1)
 		gpt_msg(gpt, "MBR at sector %ju", (uintmax_t)lba);
 
-	p = map_add(gpt, lba, 1LL, MAP_TYPE_MBR, mbr);
+	p = map_add(gpt, lba, 1LL, MAP_TYPE_MBR, mbr, 1);
 	if (p == NULL)
 		goto out;
 
@@ -340,8 +340,7 @@ gpt_mbr(gpt_t gpt, off_t lba)
 			    mbr->mbr_part[i].part_typ,
 			    (uintmax_t)start, (uintmax_t)size);
 		if (mbr->mbr_part[i].part_typ != MBR_PTYPE_EXT_LBA) {
-			// XXX: map add with non-allocated memory
-			m = map_add(gpt, start, size, MAP_TYPE_MBR_PART, p);
+			m = map_add(gpt, start, size, MAP_TYPE_MBR_PART, p, 0);
 			if (m == NULL)
 				return -1;
 			m->map_index = i + 1;
@@ -415,13 +414,13 @@ gpt_gpt(gpt_t gpt, off_t lba, int found)
 		    (lba == 1) ? "Pri" : "Sec", (uintmax_t)lba);
 
 	m = map_add(gpt, lba, 1, (lba == 1)
-	    ? MAP_TYPE_PRI_GPT_HDR : MAP_TYPE_SEC_GPT_HDR, hdr);
+	    ? MAP_TYPE_PRI_GPT_HDR : MAP_TYPE_SEC_GPT_HDR, hdr, 1);
 	if (m == NULL)
 		return (-1);
 
 	m = map_add(gpt, (off_t)le64toh((uint64_t)hdr->hdr_lba_table),
 	    (off_t)blocks,
-	    lba == 1 ? MAP_TYPE_PRI_GPT_TBL : MAP_TYPE_SEC_GPT_TBL, p);
+	    lba == 1 ? MAP_TYPE_PRI_GPT_TBL : MAP_TYPE_SEC_GPT_TBL, p, 1);
 	if (m == NULL)
 		return (-1);
 
@@ -444,9 +443,8 @@ gpt_gpt(gpt_t gpt, off_t lba, int found)
 			    (uintmax_t)le64toh(ent->ent_lba_start),
 			    (uintmax_t)size);
 		}
-		// XXX: map add with not allocated memory.
 		m = map_add(gpt, (off_t)le64toh((uint64_t)ent->ent_lba_start),
-		    size, MAP_TYPE_GPT_PART, ent);
+		    size, MAP_TYPE_GPT_PART, ent, 0);
 		if (m == NULL)
 			return (-1);
 		m->map_index = i + 1;
@@ -835,7 +833,7 @@ gpt_create(gpt_t gpt, off_t last, u_int 
 		return -1;
 	}
 	if ((gpt->gpt = map_add(gpt, 1LL, 1LL,
-	    MAP_TYPE_PRI_GPT_HDR, p)) == NULL) {
+	    MAP_TYPE_PRI_GPT_HDR, p, 1)) == NULL) {
 		free(p);
 		gpt_warnx(gpt, "Can't add the primary GPT");
 		return -1;
@@ -846,7 +844,7 @@ gpt_create(gpt_t gpt, off_t last, u_int 
 		return -1;
 	}
 	if ((gpt->tbl = map_add(gpt, 2LL, blocks,
-	    MAP_TYPE_PRI_GPT_TBL, p)) == NULL) {
+	    MAP_TYPE_PRI_GPT_TBL, p, 1)) == NULL) {
 		free(p);
 		gpt_warnx(gpt, "Can't add the primary GPT table");
 		return -1;
@@ -892,13 +890,13 @@ gpt_create(gpt_t gpt, off_t last, u_int 
 	}
 
 	if ((gpt->tpg = map_add(gpt, last, 1LL,
-	    MAP_TYPE_SEC_GPT_HDR, p)) == NULL) {
+	    MAP_TYPE_SEC_GPT_HDR, p, 1)) == NULL) {
 		gpt_warnx(gpt, "Can't add the secondary GPT");
 		return -1;
 	}
 
 	if ((gpt->lbt = map_add(gpt, last - blocks, blocks,
-	    MAP_TYPE_SEC_GPT_TBL, gpt->tbl->map_data)) == NULL) {
+	    MAP_TYPE_SEC_GPT_TBL, gpt->tbl->map_data, 0)) == NULL) {
 		gpt_warnx(gpt, "Can't add the secondary GPT table");
 		return -1;
 	}

Index: src/sbin/gpt/map.c
diff -u src/sbin/gpt/map.c:1.12 src/sbin/gpt/map.c:1.13
--- src/sbin/gpt/map.c:1.12	Wed Dec  2 15:01:44 2015
+++ src/sbin/gpt/map.c	Thu Dec  3 16:30:54 2015
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/map.c,v 1.6 2005/08/31 01:47:19 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: map.c,v 1.12 2015/12/02 20:01:44 christos Exp $");
+__RCSID("$NetBSD: map.c,v 1.13 2015/12/03 21:30:54 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -46,7 +46,7 @@ __RCSID("$NetBSD: map.c,v 1.12 2015/12/0
 #include "gpt_private.h"
 
 static map_t
-mkmap(off_t start, off_t size, int type)
+map_create(off_t start, off_t size, int type)
 {
 	map_t m;
 
@@ -59,9 +59,20 @@ mkmap(off_t start, off_t size, int type)
 	m->map_type = type;
 	m->map_index = 0;
 	m->map_data = NULL;
+	m->map_alloc = 0;
 	return m;
 }
 
+static void
+map_destroy(map_t m)
+{
+	if (m == NULL)
+		return;
+	if (m->map_alloc)
+		free(m->map_data);
+	free(m);
+}
+
 static const char *maptypes[] = {
 	"unused",
 	"mbr",
@@ -83,7 +94,7 @@ map_type(int t)
 }
 
 map_t
-map_add(gpt_t gpt, off_t start, off_t size, int type, void *data)
+map_add(gpt_t gpt, off_t start, off_t size, int type, void *data, int alloc)
 {
 	map_t m, n, p;
 
@@ -122,6 +133,7 @@ map_add(gpt_t gpt, off_t start, off_t si
 		}
 		n->map_type = type;
 		n->map_data = data;
+		n->map_alloc = alloc;
 		return n;
 	}
 
@@ -135,11 +147,12 @@ map_add(gpt_t gpt, off_t start, off_t si
 		n->map_type = MAP_TYPE_UNUSED;
 	}
 
-	m = mkmap(start, size, type);
+	m = map_create(start, size, type);
 	if (m == NULL)
 		goto oomem;
 
 	m->map_data = data;
+	m->map_alloc = alloc;
 
 	if (start == n->map_start) {
 		m->map_prev = n->map_prev;
@@ -160,7 +173,7 @@ map_add(gpt_t gpt, off_t start, off_t si
 		p->map_next = m;
 		p->map_size -= size;
 	} else {
-		p = mkmap(n->map_start, start - n->map_start, n->map_type);
+		p = map_create(n->map_start, start - n->map_start, n->map_type);
 		if (p == NULL)
 			goto oomem;
 		n->map_start += p->map_size + m->map_size;
@@ -178,6 +191,7 @@ map_add(gpt_t gpt, off_t start, off_t si
 
 	return m;
 oomem:
+	map_destroy(m);
 	gpt_warn(gpt, "Can't create map");
 	return NULL;
 }
@@ -221,7 +235,7 @@ map_alloc(gpt_t gpt, off_t start, off_t 
 					size = m->map_size - delta;
 			}
 			return map_add(gpt, m->map_start + delta, size,
-				    MAP_TYPE_GPT_PART, NULL);
+			    MAP_TYPE_GPT_PART, NULL, 0);
 		}
 	}
 
@@ -257,9 +271,7 @@ map_resize(gpt_t gpt, map_t m, off_t siz
 			m->map_next = n->map_next;
 			if (n->map_next != NULL)
 				n->map_next->map_prev = m;
-			if (n->map_data != NULL)
-				free(n->map_data);
-			free(n);
+			map_destroy(n);
 			return size;
 		} else { /* alignment > 0 */
 			prevsize = m->map_size;
@@ -277,9 +289,7 @@ map_resize(gpt_t gpt, map_t m, off_t siz
 				m->map_next = n->map_next;
 				if (n->map_next != NULL)
 					n->map_next->map_prev = m;
-				if (n->map_data != NULL)
-					free(n->map_data);
-				free(n);
+				map_destroy(n);
 			}
 			return size;
 		}
@@ -293,7 +303,7 @@ map_resize(gpt_t gpt, map_t m, off_t siz
 		prevsize = m->map_size;
 		m->map_size = alignsize;
 		if (n == NULL || n->map_type != MAP_TYPE_UNUSED) {
-			o = mkmap(m->map_start + alignsize,
+			o = map_create(m->map_start + alignsize,
 				  prevsize - alignsize, MAP_TYPE_UNUSED);
 			if (o == NULL) {
 				gpt_warn(gpt, "Can't create map");
@@ -332,9 +342,7 @@ map_resize(gpt_t gpt, map_t m, off_t siz
 			m->map_next = n->map_next;
 			if (n->map_next != NULL)
 				n->map_next->map_prev = m;
-			if (n->map_data != NULL)
-				free(n->map_data);
-			free(n);
+			map_destroy(n);
 		}
 		m->map_size = alignsize;
 		return alignsize;
@@ -391,7 +399,7 @@ map_init(gpt_t gpt, off_t size)
 {
 	char buf[32];
 
-	gpt->mediamap = mkmap(0LL, size, MAP_TYPE_UNUSED);
+	gpt->mediamap = map_create(0LL, size, MAP_TYPE_UNUSED);
 	if (gpt->mediamap == NULL) {
 		gpt_warn(gpt, "Can't create map");
 		return -1;

Index: src/sbin/gpt/map.h
diff -u src/sbin/gpt/map.h:1.5 src/sbin/gpt/map.h:1.6
--- src/sbin/gpt/map.h:1.5	Wed Dec  2 15:01:44 2015
+++ src/sbin/gpt/map.h	Thu Dec  3 16:30:54 2015
@@ -46,11 +46,12 @@ struct map {
 #define	MAP_TYPE_PMBR		8
 	unsigned int map_index;
 	void 	*map_data;
+	int	map_alloc;
 };
 
 struct gpt;
 
-struct map *map_add(struct gpt *, off_t, off_t, int, void *);
+struct map *map_add(struct gpt *, off_t, off_t, int, void *, int);
 struct map *map_alloc(struct gpt *, off_t, off_t, off_t);
 struct map *map_find(struct gpt *, int);
 struct map *map_first(struct gpt *);

Index: src/sbin/gpt/recover.c
diff -u src/sbin/gpt/recover.c:1.13 src/sbin/gpt/recover.c:1.14
--- src/sbin/gpt/recover.c:1.13	Wed Dec  2 21:02:43 2015
+++ src/sbin/gpt/recover.c	Thu Dec  3 16:30:54 2015
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/recover.c,v 1.8 2005/08/31 01:47:19 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: recover.c,v 1.13 2015/12/03 02:02:43 christos Exp $");
+__RCSID("$NetBSD: recover.c,v 1.14 2015/12/03 21:30:54 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -98,7 +98,7 @@ recover_gpt_hdr(gpt_t gpt, int type, off
 		gpt_warn(gpt, "Cannot allocate %s GPT header", name);
 		return -1;
 	}
-	if ((*dgpt = map_add(gpt, last, 1LL, type, p)) == NULL) {
+	if ((*dgpt = map_add(gpt, last, 1LL, type, p, 1)) == NULL) {
 		gpt_warnx(gpt, "Cannot add %s GPT header", name);
 		return -1;
 	}
@@ -141,8 +141,7 @@ recover_gpt_tbl(gpt_t gpt, int type, off
 		return -1;
 	}
 
-	// XXX: non allocated memory
-	*dtbl = map_add(gpt, start, stbl->map_size, type, stbl->map_data);
+	*dtbl = map_add(gpt, start, stbl->map_size, type, stbl->map_data, 0);
 	if (*dtbl == NULL) {
 		gpt_warnx(gpt, "Adding %s GPT table failed", name);
 		return -1;

Index: src/sbin/gpt/resizedisk.c
diff -u src/sbin/gpt/resizedisk.c:1.14 src/sbin/gpt/resizedisk.c:1.15
--- src/sbin/gpt/resizedisk.c:1.14	Wed Dec  2 21:09:20 2015
+++ src/sbin/gpt/resizedisk.c	Thu Dec  3 16:30:54 2015
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: resizedisk.c,v 1.14 2015/12/03 02:09:20 christos Exp $");
+__RCSID("$NetBSD: resizedisk.c,v 1.15 2015/12/03 21:30:54 christos Exp $");
 #endif
 
 #include <sys/bootblock.h>
@@ -180,15 +180,14 @@ resizedisk(gpt_t gpt, off_t sector, off_
 			return -1;
 		}
 
-		gpt->tpg = map_add(gpt, newloc, 1LL, MAP_TYPE_SEC_GPT_HDR, p);
+		gpt->tpg = map_add(gpt, newloc, 1LL, MAP_TYPE_SEC_GPT_HDR, p, 1);
 		if (gpt->tpg == NULL) {
 			gpt_warn(gpt, "Error adding secondary GPT header");
 			return -1;
 		}
 
-		// XXX: map add with non-allocated memory
 		gpt->lbt = map_add(gpt, newloc - gpt_size, gpt_size,
-		    MAP_TYPE_SEC_GPT_TBL, gpt->tbl->map_data);
+		    MAP_TYPE_SEC_GPT_TBL, gpt->tbl->map_data, 0);
 		if (gpt->lbt == NULL) {
 			gpt_warn(gpt, "Error adding secondary GPT table");
 			return -1;

Reply via email to