libbacklight: Fix backlight never gets initialized

In 913d7c15f7 stricter error checking was
introduced to the strtol call, which broke reading backlight values.
Since every sysfs backlight file ends with a newline.

As noted in a comment in the previous MR to prevent damaged pointers
after calling asprintf, replace every asprintf call with str_printf.

Previous-MR: https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/543

Signed-off-by: Sören Meier <soerenmeier@livgood.ch>
dev
Sören Meier 3 years ago committed by Marius Vlad
parent 6ee6e76a0c
commit edef874696
  1. 27
      libweston/backend-drm/libbacklight.c

@ -53,8 +53,10 @@ static long backlight_get(struct backlight *backlight, char *node)
int fd, value; int fd, value;
long ret; long ret;
if (asprintf(&path, "%s/%s", backlight->path, node) < 0) str_printf(&path, "%s/%s", backlight->path, node);
if (!path)
return -ENOMEM; return -ENOMEM;
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
if (fd < 0) { if (fd < 0) {
ret = -1; ret = -1;
@ -67,6 +69,9 @@ static long backlight_get(struct backlight *backlight, char *node)
goto out; goto out;
} }
if (buffer[ret - 1] == '\n')
buffer[ret - 1] = '\0';
if (!safe_strtoint(buffer, &value)) { if (!safe_strtoint(buffer, &value)) {
ret = -1; ret = -1;
goto out; goto out;
@ -103,7 +108,8 @@ long backlight_set_brightness(struct backlight *backlight, long brightness)
int fd; int fd;
long ret; long ret;
if (asprintf(&path, "%s/%s", backlight->path, "brightness") < 0) str_printf(&path, "%s/%s", backlight->path, "brightness");
if (!path)
return -ENOMEM; return -ENOMEM;
fd = open(path, O_RDWR); fd = open(path, O_RDWR);
@ -118,7 +124,8 @@ long backlight_set_brightness(struct backlight *backlight, long brightness)
goto out; goto out;
} }
if (asprintf(&buffer, "%ld", brightness) < 0) { str_printf(&buffer, "%ld", brightness);
if (!buffer) {
ret = -1; ret = -1;
goto out; goto out;
} }
@ -171,7 +178,8 @@ struct backlight *backlight_init(struct udev_device *drm_device,
if (!syspath) if (!syspath)
return NULL; return NULL;
if (asprintf(&path, "%s/%s", syspath, "device") < 0) str_printf(&path, "%s/%s", syspath, "device");
if (!path)
return NULL; return NULL;
ret = readlink(path, buffer, sizeof(buffer) - 1); ret = readlink(path, buffer, sizeof(buffer) - 1);
@ -214,11 +222,13 @@ struct backlight *backlight_init(struct udev_device *drm_device,
if (entry->d_name[0] == '.') if (entry->d_name[0] == '.')
continue; continue;
if (asprintf(&backlight_path, "%s/%s", "/sys/class/backlight", str_printf(&backlight_path, "%s/%s", "/sys/class/backlight",
entry->d_name) < 0) entry->d_name);
if (!backlight_path)
goto err; goto err;
if (asprintf(&path, "%s/%s", backlight_path, "type") < 0) { str_printf(&path, "%s/%s", backlight_path, "type");
if (!path) {
free(backlight_path); free(backlight_path);
goto err; goto err;
} }
@ -255,7 +265,8 @@ struct backlight *backlight_init(struct udev_device *drm_device,
free (path); free (path);
if (asprintf(&path, "%s/%s", backlight_path, "device") < 0) str_printf(&path, "%s/%s", backlight_path, "device");
if (!path)
goto err; goto err;
ret = readlink(path, buffer, sizeof(buffer) - 1); ret = readlink(path, buffer, sizeof(buffer) - 1);

Loading…
Cancel
Save