svn commit: r185309 - head/sys/geom/vinum

Ulf Lilleengen lulf at FreeBSD.org
Tue Nov 25 11:13:58 PST 2008


Author: lulf
Date: Tue Nov 25 19:13:58 2008
New Revision: 185309
URL: http://svn.freebsd.org/changeset/base/185309

Log:
  - Fix a potential NULL pointer reference. Note that this cannot happen in
    practice, but it is a good programming practice nontheless and it allows the
    kernel to not depend on userland correctness.
  
  Found with:   Coverity Prevent(tm)
  CID:          655-659, 664-667

Modified:
  head/sys/geom/vinum/geom_vinum.c
  head/sys/geom/vinum/geom_vinum_list.c
  head/sys/geom/vinum/geom_vinum_move.c
  head/sys/geom/vinum/geom_vinum_rename.c
  head/sys/geom/vinum/geom_vinum_rm.c

Modified: head/sys/geom/vinum/geom_vinum.c
==============================================================================
--- head/sys/geom/vinum/geom_vinum.c	Tue Nov 25 19:06:20 2008	(r185308)
+++ head/sys/geom/vinum/geom_vinum.c	Tue Nov 25 19:13:58 2008	(r185309)
@@ -165,12 +165,20 @@ gv_create(struct g_geom *gp, struct gctl
 	plexes = gctl_get_paraml(req, "plexes", sizeof(*plexes));
 	subdisks = gctl_get_paraml(req, "subdisks", sizeof(*subdisks));
 	drives = gctl_get_paraml(req, "drives", sizeof(*drives));
+	if (volumes == NULL || plexes == NULL || subdisks == NULL ||
+	    drives == NULL) {
+		gctl_error(req, "number of objects not given");
+		return (-1);
+	}
 
 	/* First, handle drive definitions ... */
 	for (i = 0; i < *drives; i++) {
 		snprintf(buf, sizeof(buf), "drive%d", i);
 		d2 = gctl_get_paraml(req, buf, sizeof(*d2));
-
+		if (d2 == NULL) {
+			gctl_error(req, "no drive definition given");
+			return (-1);
+		}
 		d = gv_find_drive(sc, d2->name);
 		if (d != NULL) {
 			gctl_error(req, "drive '%s' is already known",
@@ -205,7 +213,10 @@ gv_create(struct g_geom *gp, struct gctl
 		error = 0;
 		snprintf(buf, sizeof(buf), "volume%d", i);
 		v2 = gctl_get_paraml(req, buf, sizeof(*v2));
-
+		if (v2 == NULL) {
+			gctl_error(req, "no volume definition given");
+			return (-1);
+		}
 		v = gv_find_vol(sc, v2->name);
 		if (v != NULL) {
 			gctl_error(req, "volume '%s' is already known",
@@ -226,7 +237,10 @@ gv_create(struct g_geom *gp, struct gctl
 		error = 0;
 		snprintf(buf, sizeof(buf), "plex%d", i);
 		p2 = gctl_get_paraml(req, buf, sizeof(*p2));
-
+		if (p2 == NULL) {
+			gctl_error(req, "no plex definition given");
+			return (-1);
+		}
 		p = gv_find_plex(sc, p2->name);
 		if (p != NULL) {
 			gctl_error(req, "plex '%s' is already known", p->name);
@@ -260,7 +274,10 @@ gv_create(struct g_geom *gp, struct gctl
 		error = 0;
 		snprintf(buf, sizeof(buf), "sd%d", i);
 		s2 = gctl_get_paraml(req, buf, sizeof(*s2));
-
+		if (s2 == NULL) {
+			gctl_error(req, "no subdisk definition given");
+			return (-1);
+		}
 		s = gv_find_sd(sc, s2->name);
 		if (s != NULL) {
 			gctl_error(req, "subdisk '%s' is already known",
@@ -405,7 +422,10 @@ gv_config(struct gctl_req *req, struct g
 	/* Return configuration in string form. */
 	} else if (!strcmp(verb, "getconfig")) {
 		comment = gctl_get_param(req, "comment", NULL);
-
+		if (comment == NULL) {
+			gctl_error(req, "no comment parameter given");
+			return;
+		}
 		sb = sbuf_new(NULL, NULL, GV_CFG_LEN, SBUF_FIXEDLEN);
 		gv_format_config(sc, sb, 0, comment);
 		sbuf_finish(sb);

Modified: head/sys/geom/vinum/geom_vinum_list.c
==============================================================================
--- head/sys/geom/vinum/geom_vinum_list.c	Tue Nov 25 19:06:20 2008	(r185308)
+++ head/sys/geom/vinum/geom_vinum_list.c	Tue Nov 25 19:13:58 2008	(r185309)
@@ -62,6 +62,10 @@ gv_list(struct g_geom *gp, struct gctl_r
 	}
 
 	flags = gctl_get_paraml(req, "flags", sizeof(*flags));
+	if (flags == NULL) {
+		gctl_error(req, "no flags given");
+		return;
+	}
 
 	sc = gp->softc;
 
@@ -69,6 +73,10 @@ gv_list(struct g_geom *gp, struct gctl_r
 
 	/* Figure out which command was given. */
 	cmd = gctl_get_param(req, "cmd", NULL);
+	if (cmd == NULL) {
+		gctl_error(req, "no command given");
+		return;
+	}
 
 	/* List specific objects or everything. */
 	if (!strcmp(cmd, "list") || !strcmp(cmd, "l")) {

Modified: head/sys/geom/vinum/geom_vinum_move.c
==============================================================================
--- head/sys/geom/vinum/geom_vinum_move.c	Tue Nov 25 19:06:20 2008	(r185308)
+++ head/sys/geom/vinum/geom_vinum_move.c	Tue Nov 25 19:13:58 2008	(r185309)
@@ -56,7 +56,15 @@ gv_move(struct g_geom *gp, struct gctl_r
 	sc = gp->softc;
 
 	argc = gctl_get_paraml(req, "argc", sizeof(*argc));
+	if (argc == NULL) {
+		gctl_error(req, "no arguments given");
+		return;
+	}
 	flags = gctl_get_paraml(req, "flags", sizeof(*flags));
+	if (flags == NULL) {
+		gctl_error(req, "no flags given");
+		return;
+	}
 	destination = gctl_get_param(req, "destination", NULL);
 	if (destination == NULL) {
 		gctl_error(req, "no destination given");

Modified: head/sys/geom/vinum/geom_vinum_rename.c
==============================================================================
--- head/sys/geom/vinum/geom_vinum_rename.c	Tue Nov 25 19:06:20 2008	(r185308)
+++ head/sys/geom/vinum/geom_vinum_rename.c	Tue Nov 25 19:13:58 2008	(r185309)
@@ -65,6 +65,10 @@ gv_rename(struct g_geom *gp, struct gctl
 	sc = gp->softc;
 
 	flags = gctl_get_paraml(req, "flags", sizeof(*flags));
+	if (flags == NULL) {
+		gctl_error(req, "no flags given");
+		return;
+	}
 
 	newname = gctl_get_param(req, "newname", NULL);
 	if (newname == NULL) {

Modified: head/sys/geom/vinum/geom_vinum_rm.c
==============================================================================
--- head/sys/geom/vinum/geom_vinum_rm.c	Tue Nov 25 19:06:20 2008	(r185308)
+++ head/sys/geom/vinum/geom_vinum_rm.c	Tue Nov 25 19:13:58 2008	(r185309)
@@ -59,13 +59,18 @@ gv_remove(struct g_geom *gp, struct gctl
 	int i, type, err;
 
 	argc = gctl_get_paraml(req, "argc", sizeof(*argc));
-	flags = gctl_get_paraml(req, "flags", sizeof(*flags));
 
 	if (argc == NULL || *argc == 0) {
 		gctl_error(req, "no arguments given");
 		return;
 	}
 
+	flags = gctl_get_paraml(req, "flags", sizeof(*flags));
+	if (flags == NULL) {
+		gctl_error(req, "no flags given");
+		return;
+	}
+
 	sc = gp->softc;
 
 	for (i = 0; i < *argc; i++) {


More information about the svn-src-all mailing list