plug memory leaks and fix nested loops in udf_find_partmaps()

Pedro Martelletto pedro at ambientworks.net
Thu Jun 22 15:30:08 UTC 2006


currently, there are two nested 'for' loops in udf_find_partmaps() which
use the same control variable (i), as well as memory leaks in two error
paths, which the following diff should fix.

-p.

Index: udf_vfsops.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/udf/udf_vfsops.c,v
retrieving revision 1.41
diff -u -p -r1.41 udf_vfsops.c
--- udf_vfsops.c	26 May 2006 01:21:51 -0000	1.41
+++ udf_vfsops.c	22 Jun 2006 15:08:25 -0000
@@ -728,7 +728,7 @@ udf_find_partmaps(struct udf_mnt *udfmp,
 	struct regid *pmap_id;
 	struct buf *bp;
 	unsigned char regid_id[UDF_REGID_ID_SIZE + 1];
-	int i, ptype, psize, error;
+	int i, k, ptype, psize, error;
 
 	for (i = 0; i < le32toh(lvd->n_pm); i++) {
 		pmap = (union udf_pmap *)&lvd->maps[i * UDF_PMAP_SIZE];
@@ -776,6 +776,7 @@ udf_find_partmaps(struct udf_mnt *udfmp,
 				brelse(bp);
 			printf("Failed to read Sparing Table at sector %d\n",
 			    le32toh(pms->st_loc[0]));
+			FREE(udfmp->s_table, M_UDFMOUNT);
 			return (error);
 		}
 		bcopy(bp->b_data, udfmp->s_table, le32toh(pms->st_size));
@@ -783,15 +784,16 @@ udf_find_partmaps(struct udf_mnt *udfmp,
 
 		if (udf_checktag(&udfmp->s_table->tag, 0)) {
 			printf("Invalid sparing table found\n");
+			FREE(udfmp->s_table, M_UDFMOUNT);
 			return (EINVAL);
 		}
 
 		/* See how many valid entries there are here.  The list is
 		 * supposed to be sorted. 0xfffffff0 and higher are not valid
 		 */
-		for (i = 0; i < le16toh(udfmp->s_table->rt_l); i++) {
-			udfmp->s_table_entries = i;
-			if (le32toh(udfmp->s_table->entries[i].org) >=
+		for (k = 0; k < le16toh(udfmp->s_table->rt_l); k++) {
+			udfmp->s_table_entries = k;
+			if (le32toh(udfmp->s_table->entries[k].org) >=
 			    0xfffffff0)
 				break;
 		}


More information about the freebsd-fs mailing list