lib: configfs: Fix asprintf return value usage
authorKieran Bingham <kieran.bingham@ideasonboard.com>
Tue, 26 Jun 2018 23:07:54 +0000 (00:07 +0100)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 31 Jul 2018 12:56:38 +0000 (15:56 +0300)
The asprintf function returns -1, and leaves the first parameter
undefined in case of an allocation error. This conflicts with the
code's assumption that the parameter is set NULL on error.

Check all return values of asprintf, and ensure that the string
parameter is not used as a return value on error paths.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
lib/configfs.c

index 1dfde95..5de7079 100644 (file)
 static char *path_join(const char *dirname, const char *name)
 {
        char *path;
+       int ret;
+
+       ret = asprintf(&path, "%s/%s", dirname, name);
 
-       asprintf(&path, "%s/%s", dirname, name);
+       /*
+        * asprintf returns -1 on allocation or other errors, leaving 'path'
+        * undefined. We shouldn't even call free(path) here. We want to return
+        * NULL on error, so we must manually set it.
+        */
+       if (ret < 0)
+               path = NULL;
 
        return path;
 }
@@ -192,10 +201,12 @@ static char *udc_find_video_device(const char *udc, const char *function)
        char *video = NULL;
        glob_t globbuf;
        unsigned int i;
+       int ret;
 
-       asprintf(&vpath, "/sys/class/udc/%s/device/gadget/video4linux/video*",
-                udc ? udc : "*");
-       if (!vpath)
+       ret = asprintf(&vpath,
+                      "/sys/class/udc/%s/device/gadget/video4linux/video*",
+                      udc ? udc : "*");
+       if (!ret)
                return NULL;
 
        glob(vpath, 0, NULL, &globbuf);