checkers: argument paranoia
authorHannes Reinecke <hare@suse.de>
Mon, 2 May 2011 14:11:50 +0000 (16:11 +0200)
committerHannes Reinecke <hare@suse.de>
Tue, 3 May 2011 08:03:18 +0000 (10:03 +0200)
After suffering from the umpteenth crash it's time to add
argument validation to checkers.c

Signed-off-by: Hannes Reinecke <hare@suse.de>
libmultipath/checkers.c

index 3bc3e5a..01dafdd 100644 (file)
@@ -80,6 +80,8 @@ struct checker * checker_lookup (char * name)
 {
        struct checker * c;
 
+       if (!name || !strlen(name))
+               return NULL;
        list_for_each_entry(c, &checkers, node) {
                if (!strncmp(name, c->name, CHECKER_NAME_LEN))
                        return c;
@@ -145,31 +147,43 @@ out:
 
 void checker_set_fd (struct checker * c, int fd)
 {
+       if (!c)
+               return;
        c->fd = fd;
 }
 
 void checker_set_sync (struct checker * c)
 {
+       if (!c)
+               return;
        c->sync = 1;
 }
 
 void checker_set_async (struct checker * c)
 {
+       if (!c)
+               return;
        c->sync = 0;
 }
 
 void checker_enable (struct checker * c)
 {
+       if (!c)
+               return;
        c->disable = 0;
 }
 
 void checker_disable (struct checker * c)
 {
+       if (!c)
+               return;
        c->disable = 1;
 }
 
 int checker_init (struct checker * c, void ** mpctxt_addr)
 {
+       if (!c)
+               return 1;
        c->mpcontext = mpctxt_addr;
        return c->init(c);
 }
@@ -178,6 +192,8 @@ void checker_put (struct checker * dst)
 {
        struct checker * src;
 
+       if (!dst)
+               return;
        src = checker_lookup(dst->name);
        if (dst->free)
                dst->free(dst);
@@ -189,8 +205,14 @@ int checker_check (struct checker * c)
 {
        int r;
 
-       if (c->disable)
+       if (!c)
+               return PATH_WILD;
+
+       c->message[0] = '\0';
+       if (c->disable) {
+               MSG(c, "checker disabled");
                return PATH_UNCHECKED;
+       }
        if (c->fd <= 0) {
                MSG(c, "no usable fd");
                return PATH_WILD;
@@ -202,21 +224,29 @@ int checker_check (struct checker * c)
 
 int checker_selected (struct checker * c)
 {
+       if (!c)
+               return 0;
        return (c->check) ? 1 : 0;
 }
 
 char * checker_name (struct checker * c)
 {
+       if (!c)
+               return NULL;
        return c->name;
 }
 
 char * checker_message (struct checker * c)
 {
+       if (!c)
+               return NULL;
        return c->message;
 }
 
 void checker_clear_message (struct checker *c)
 {
+       if (!c)
+               return;
        c->message[0] = '\0';
 }
 
@@ -224,6 +254,9 @@ void checker_get (struct checker * dst, char * name)
 {
        struct checker * src = checker_lookup(name);
 
+       if (!dst)
+               return;
+
        if (!src) {
                dst->check = NULL;
                return;