From 913d7c15f79da33aa97100286df5d8f88731e252 Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Wed, 3 Aug 2016 17:40:48 -0700 Subject: [PATCH] Standardize error checking for strtol calls This tightens up the strtol() error checking in several places where it is used for parsing environment variables, and in the backlight interface that is reading numbers from files under /sys/class/backlight. All of these uses are expecting strings containing decimal numbers and nothing else, so the error checking can all be tightened up and made consistent with other strtol() calls. This follows the error checking style used in Wayland (c.f. wayland-client.c and scanner.c) and c.f. commit cbc05378. Signed-off-by: Bryce Harrington Reviewed-by: Eric Engestrom Reviewed-by: Peter Hutterer --- compositor/main.c | 3 ++- compositor/systemd-notify.c | 2 +- libweston/compositor.c | 3 ++- libweston/libbacklight.c | 10 +++++++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/compositor/main.c b/compositor/main.c index 6746e3a..5fb5d5a 100644 --- a/compositor/main.c +++ b/compositor/main.c @@ -1699,8 +1699,9 @@ int main(int argc, char *argv[]) server_socket = getenv("WAYLAND_SERVER_SOCKET"); if (server_socket) { weston_log("Running with single client\n"); + errno = 0; fd = strtol(server_socket, &end, 10); - if (*end != '\0') + if (errno != 0 || end == server_socket || *end != '\0') fd = -1; } else { fd = -1; diff --git a/compositor/systemd-notify.c b/compositor/systemd-notify.c index 9fbd5ee..6104124 100644 --- a/compositor/systemd-notify.c +++ b/compositor/systemd-notify.c @@ -146,7 +146,7 @@ module_init(struct weston_compositor *compositor, errno = 0; watchdog_time_conv = strtol(watchdog_time_env, &tail, 10); - if ((errno != 0) || (*tail != '\0')) + if (errno != 0 || tail == watchdog_time_env || *tail != '\0') return 0; /* Convert 'WATCHDOG_USEC' to milliseconds and notify diff --git a/libweston/compositor.c b/libweston/compositor.c index b045381..e9c2a83 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -4628,8 +4628,9 @@ weston_environment_get_fd(const char *env) e = getenv(env); if (!e) return -1; + errno = 0; fd = strtol(e, &end, 10); - if (*end != '\0') + if (errno != 0 || end == e || *end != '\0') return -1; flags = fcntl(fd, F_GETFD); diff --git a/libweston/libbacklight.c b/libweston/libbacklight.c index 4039575..59f4e44 100644 --- a/libweston/libbacklight.c +++ b/libweston/libbacklight.c @@ -48,6 +48,7 @@ static long backlight_get(struct backlight *backlight, char *node) { char buffer[100]; char *path; + char *end; int fd; long value, ret; @@ -65,8 +66,15 @@ static long backlight_get(struct backlight *backlight, char *node) goto out; } - value = strtol(buffer, NULL, 10); + errno = 0; + value = strtol(buffer, &end, 10); + if (errno != 0 || end == buffer || *end != '\0') { + ret = -1; + goto out; + } + ret = value; + out: if (fd >= 0) close(fd); -- 2.7.4