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++) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to