svn commit: r279008 - stable/10/lib/libc/gen

Pedro F. Giffuni pfg at FreeBSD.org
Thu Feb 19 16:17:45 UTC 2015


Author: pfg
Date: Thu Feb 19 16:17:44 2015
New Revision: 279008
URL: https://svnweb.freebsd.org/changeset/base/279008

Log:
  MFC	r278300, r278314:
  getdiskbyname(): plug resource leak
  
  Variable cq going out of scope leaks the storage it points to.
  
  CID:		270511
  Phabric:	D1775
  Reviewed by:	imp
  Obtained from:	NetBSD (CVS rev. 1.34)

Modified:
  stable/10/lib/libc/gen/disklabel.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/gen/disklabel.c
==============================================================================
--- stable/10/lib/libc/gen/disklabel.c	Thu Feb 19 15:41:23 2015	(r279007)
+++ stable/10/lib/libc/gen/disklabel.c	Thu Feb 19 16:17:44 2015	(r279008)
@@ -85,10 +85,13 @@ getdiskbyname(const char *name)
 		cq++, cp++;
 	*cq = '\0';
 
-	if (cgetstr(buf, "ty", &cq) > 0 && strcmp(cq, "removable") == 0)
-		dp->d_flags |= D_REMOVABLE;
-	else  if (cq && strcmp(cq, "simulated") == 0)
-		dp->d_flags |= D_RAMDISK;
+	if (cgetstr(buf, "ty", &cq) > 0) {
+		if (strcmp(cq, "removable") == 0)
+			dp->d_flags |= D_REMOVABLE;
+		else  if (cq && strcmp(cq, "simulated") == 0)
+			dp->d_flags |= D_RAMDISK;
+		free(cq);
+	}
 	if (cgetcap(buf, "sf", ':') != NULL)
 		dp->d_flags |= D_BADSECT;
 
@@ -100,9 +103,10 @@ getdiskbyname(const char *name)
 	getnumdflt(dp->d_nsectors, "ns", 0);
 	getnumdflt(dp->d_ncylinders, "nc", 0);
 
-	if (cgetstr(buf, "dt", &cq) > 0)
+	if (cgetstr(buf, "dt", &cq) > 0) {
 		dp->d_type = gettype(cq, dktypenames);
-	else
+		free(cq);
+	} else
 		getnumdflt(dp->d_type, "dt", 0);
 	getnumdflt(dp->d_secpercyl, "sc", dp->d_nsectors * dp->d_ntracks);
 	getnumdflt(dp->d_secperunit, "su", dp->d_secpercyl * dp->d_ncylinders);
@@ -140,8 +144,11 @@ getdiskbyname(const char *name)
 					pp->p_frag = 8;
 			}
 			getnumdflt(pp->p_fstype, ptype, 0);
-			if (pp->p_fstype == 0 && cgetstr(buf, ptype, &cq) > 0)
-				pp->p_fstype = gettype(cq, fstypenames);
+			if (pp->p_fstype == 0)
+				if (cgetstr(buf, ptype, &cq) >= 0) {
+					pp->p_fstype = gettype(cq, fstypenames);
+					free(cq);
+				}
 			max = p;
 		}
 	}


More information about the svn-src-all mailing list