From 546c856ade4908ccd2e3a1d9bbd1633f3fb52194 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Wed, 5 Dec 2012 18:47:09 +0000 Subject: [PATCH] backlight: Revamp error handling code to not leak the directory To neatly free the directory pointer allocated by opendir(), adjust the error handling paths to go through to the err label. --- src/libbacklight.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libbacklight.c b/src/libbacklight.c index 2ac135a5..add89b27 100644 --- a/src/libbacklight.c +++ b/src/libbacklight.c @@ -149,11 +149,11 @@ struct backlight *backlight_init(struct udev_device *drm_device, char *pci_name = NULL; char *chosen_path = NULL; char *path = NULL; - DIR *backlights; + DIR *backlights = NULL; struct dirent *entry; enum backlight_type type = 0; char buffer[100]; - struct backlight *backlight; + struct backlight *backlight = NULL; int ret; if (!drm_device) @@ -208,10 +208,10 @@ struct backlight *backlight_init(struct udev_device *drm_device, if (asprintf(&backlight_path, "%s/%s", "/sys/class/backlight", entry->d_name) < 0) - return NULL; + goto err; if (asprintf(&path, "%s/%s", backlight_path, "type") < 0) - return NULL; + goto err; fd = open(path, O_RDONLY); @@ -246,7 +246,7 @@ struct backlight *backlight_init(struct udev_device *drm_device, free (path); if (asprintf(&path, "%s/%s", backlight_path, "device") < 0) - return NULL; + goto err; ret = readlink(path, buffer, sizeof(buffer) - 1); @@ -280,7 +280,7 @@ struct backlight *backlight_init(struct udev_device *drm_device, } if (!chosen_path) - return NULL; + goto err; backlight = malloc(sizeof(struct backlight)); @@ -298,10 +298,11 @@ struct backlight *backlight_init(struct udev_device *drm_device, if (backlight->brightness < 0) goto err; + closedir(backlights); return backlight; err: - if (chosen_path) - free(chosen_path); + closedir(backlights); + free (chosen_path); free (backlight); return NULL; }