From bdf5ec0ef8368ad36dab2a280a4833fb88747d04 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 17 Apr 2017 17:43:42 +0900 Subject: [PATCH] change sscanf to strtol for getting fd Change-Id: I7fed3efbd3fc9a9273a670b3b967707453471be2 Signed-off-by: Junkyeong Kim --- src/tdm_helper.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 6b4178e..4adbcb8 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -521,15 +521,35 @@ tdm_helper_get_fd(const char *env) { const char *value; int fd, newfd, flags, ret; + char *end; + errno = 0; value = (const char*)getenv(env); if (!value) return -1; - ret = sscanf(value, "%d", &fd); - if (ret < 0) { - TDM_ERR("sscanf failed: %m"); + const long sl = strtol(value, &end, 10); + if (end == value) { + TDM_ERR("%s: not a decimal number\n", value); return -1; + } else if (*end != '\0') { + TDM_ERR("%s: extra characters at end of input: %s\n", value, end); + return -1; + } else if ((sl == LONG_MIN || sl == LONG_MAX) && errno == ERANGE) { + TDM_ERR("%s out of range of type long\n", value); + return -1; + } else if (sl > INT_MAX) { + TDM_ERR("%ld greater than INT_MAX\n", sl); + return -1; + } else if (sl < INT_MIN) { + TDM_ERR("%ld less than INT_MIN\n", sl); + return -1; + } else { + fd = (int)sl; + if (fd < 0) { + TDM_ERR("%d out of fd range\n", fd); + return -1; + } } flags = fcntl(fd, F_GETFD); -- 2.7.4