summaryrefslogtreecommitdiff
path: root/src/libbacklight.c
diff options
context:
space:
mode:
authorRob Bradford <rob@linux.intel.com>2012-12-05 18:47:09 +0000
committerKristian Høgsberg <krh@bitplanet.net>2012-12-06 22:33:01 -0500
commit546c856ade4908ccd2e3a1d9bbd1633f3fb52194 (patch)
treee3c3dad77d993047c66282fec48d6a69e9448110 /src/libbacklight.c
parentacfb7121275dee018b221ef34b7f5fa7026675b5 (diff)
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.
Diffstat (limited to 'src/libbacklight.c')
-rw-r--r--src/libbacklight.c17
1 files 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;
}