diff options
-rw-r--r-- | isys/devices.c | 28 | ||||
-rw-r--r-- | isys/isys.c | 8 | ||||
-rw-r--r-- | isys/silo.c | 20 | ||||
-rw-r--r-- | loader2/fwloader.c | 8 | ||||
-rw-r--r-- | loader2/loader.c | 76 | ||||
-rw-r--r-- | loader2/net.c | 47 | ||||
-rw-r--r-- | loader2/urls.c | 15 |
7 files changed, 178 insertions, 24 deletions
diff --git a/isys/devices.c b/isys/devices.c index 69a002053..06dcd8ec7 100644 --- a/isys/devices.c +++ b/isys/devices.c @@ -29,6 +29,7 @@ #include <stdlib.h> #include <unistd.h> #include <sys/types.h> +#include <limits.h> #include "devices.h" @@ -72,8 +73,15 @@ struct device **getDevices(enum deviceType type) { close(fd); continue; } + close(fd); caps = strtol(buf, NULL, 16); + + if ((errno == ERANGE && (caps == LONG_MIN || caps == LONG_MAX)) || + (errno != 0 && caps == 0)) { + return NULL; + } + if (caps & GENHD_FL_CD) devtype = DEVICE_CDROM; else @@ -86,14 +94,23 @@ struct device **getDevices(enum deviceType type) { snprintf(path, 64, "/sys/block/%s/size", ent->d_name); fd = open(path, O_RDONLY); + if (fd == -1) continue; if (read(fd, buf, 64) <= 0) { close(fd); continue; } + close(fd); - size = atoi(buf); + size = strtol(buf, NULL, 10); + + if ((errno == ERANGE && (size == LONG_MIN || + size == LONG_MAX)) || + (errno != 0 && size == 0)) { + return NULL; + } + if (size < MINIMUM_INTERESTING_SIZE) continue; } @@ -135,8 +152,15 @@ storagedone: close(fd); continue; } + close(fd); - type = atoi(buf); + type = strtol(buf, NULL, 10); + + if ((errno == ERANGE && (type == LONG_MIN || type == LONG_MAX)) || + (errno != 0 && type == 0)) { + return NULL; + } + if (type != 1) continue; diff --git a/isys/isys.c b/isys/isys.c index d1798d566..e2b40cb87 100644 --- a/isys/isys.c +++ b/isys/isys.c @@ -548,7 +548,13 @@ static PyObject * doConfigNetDevice(PyObject * s, PyObject * args) { cfg.ipv6 = ip_addr_in6(&addr6); if (strlen(prefix)) - i = atoi(prefix); + i = strtol(prefix, NULL, 10); + + if ((errno == ERANGE && (i == LONG_MIN || i == LONG_MAX)) || + (errno != 0 && i == 0)) { + return NULL; + } + if (i > 0 && i <= 128) cfg.ipv6_prefixlen = i; } diff --git a/isys/silo.c b/isys/silo.c index 66109c6c4..c0eabdbc5 100644 --- a/isys/silo.c +++ b/isys/silo.c @@ -480,7 +480,15 @@ scan_scsi(void) { while ((enthba = readdir(dirhba))) { if (enthba->d_name[0] == '.') continue; - host = atoi(enthba->d_name); + host = strtol(enthba->d_name, NULL, 10); + + if ((errno == ERANGE && (host == LONG_MIN || host == LONG_MAX)) || + (errno != 0 && host == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + sprintf (path, "/proc/scsi/%s/%s", ent->d_name, enthba->d_name); f = fopen (path, "r"); if (f == NULL) continue; @@ -799,7 +807,15 @@ disk2PromPath (PyObject *self, PyObject *args) else if (!disk[0]) part = 3; else { - part = atoi (disk); + part = strtol (disk, NULL, 10); + + if ((errno == ERANGE && (part == LONG_MIN || part == LONG_MAX)) || + (errno != 0 && part == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + if (part <= 0 || part > 8) part = -1; } if (diskno < 0 || part == -1 || diff --git a/loader2/fwloader.c b/loader2/fwloader.c index a7b57a0cc..114ffa485 100644 --- a/loader2/fwloader.c +++ b/loader2/fwloader.c @@ -473,6 +473,14 @@ static void load_firmware(struct fw_loader *fwl, struct uevent *uevent) timeout_secs = strtol(timeout, NULL, 10); + if ((errno == ERANGE && (timeout_secs == LONG_MIN || + timeout_secs == LONG_MAX)) || + (errno != 0 && timeout_secs == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + /* find the file */ for (entry = fwl->fw_pathz; entry; entry = argz_next(fwl->fw_pathz, fwl->fw_pathz_len, entry)) { diff --git a/loader2/loader.c b/loader2/loader.c index d3b75e65c..07dae795b 100644 --- a/loader2/loader.c +++ b/loader2/loader.c @@ -643,8 +643,17 @@ static void readNetInfo(struct loaderData_s ** ld) { if (!strncmp(vname, "DNS", 3)) loaderData->dns = strdup(vparm); - if (!strncmp(vname, "MTU", 3)) - loaderData->mtu = atoi(vparm); + if (!strncmp(vname, "MTU", 3)) { + loaderData->mtu = strtol(vparm, NULL, 10); + + if ((errno == ERANGE && (loaderData->mtu == LONG_MIN || + loaderData->mtu == LONG_MAX)) || + (errno != 0 && loaderData->mtu == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + } if (!strncmp(vname, "PEERID", 6)) loaderData->peerid = strdup(vparm); @@ -939,16 +948,52 @@ static void parseCmdLineFlags(struct loaderData_s * loaderData, loaderData->ethtool = strdup(argv[i] + 8); else if (!strncasecmp(argv[i], "essid=", 6)) loaderData->essid = strdup(argv[i] + 6); - else if (!strncasecmp(argv[i], "mtu=", 4)) - loaderData->mtu = atoi(argv[i] + 4); + else if (!strncasecmp(argv[i], "mtu=", 4)) { + loaderData->mtu = strtol(argv[i] + 4, NULL, 10); + + if ((errno == ERANGE && (loaderData->mtu == LONG_MIN || + loaderData->mtu == LONG_MAX)) || + (errno != 0 && loaderData->mtu == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + } else if (!strncasecmp(argv[i], "wepkey=", 7)) loaderData->wepkey = strdup(argv[i] + 7); - else if (!strncasecmp(argv[i], "linksleep=", 10)) - num_link_checks = atoi(argv[i] + 10); - else if (!strncasecmp(argv[i], "nicdelay=", 9)) - post_link_sleep = atoi(argv[i] + 9); - else if (!strncasecmp(argv[i], "dhcptimeout=", 12)) - loaderData->dhcpTimeout = atoi(argv[i] + 12); + else if (!strncasecmp(argv[i], "linksleep=", 10)) { + num_link_checks = strtol(argv[i] + 10, NULL, 10); + + if ((errno == ERANGE && (num_link_checks == LONG_MIN || + num_link_checks == LONG_MAX)) || + (errno != 0 && num_link_checks == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + } + else if (!strncasecmp(argv[i], "nicdelay=", 9)) { + post_link_sleep = strtol(argv[i] + 9, NULL, 10); + + if ((errno == ERANGE && (post_link_sleep == LONG_MIN || + post_link_sleep == LONG_MAX)) || + (errno != 0 && post_link_sleep == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + } + else if (!strncasecmp(argv[i], "dhcptimeout=", 12)) { + loaderData->dhcpTimeout = strtol(argv[i] + 12, NULL, 10); + + if ((errno == ERANGE && (loaderData->dhcpTimeout == LONG_MIN || + loaderData->dhcpTimeout == LONG_MAX)) || + (errno != 0 && loaderData->dhcpTimeout == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + } else if (!strncasecmp(argv[i], "selinux=0", 9)) flags &= ~LOADER_FLAGS_SELINUX; else if (!strncasecmp(argv[i], "selinux", 7)) @@ -2027,10 +2072,19 @@ int main(int argc, char ** argv) { char *ret; ret = fgets(buf, 256, f); - pid = atoi(buf); + pid = strtol(buf, NULL, 10); + + if ((errno == ERANGE && (pid == LONG_MIN || pid == LONG_MAX)) || + (errno != 0 && pid == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + free(buf); fclose(f); } + kill(pid, SIGUSR2); #endif stop_fw_loader(&loaderData); diff --git a/loader2/net.c b/loader2/net.c index c468b67af..8e645525c 100644 --- a/loader2/net.c +++ b/loader2/net.c @@ -73,7 +73,13 @@ static void cidrCallback(newtComponent co, void * dptr) { if (inet_pton(AF_INET, data->cidr4, &addr) >= 1) return; - cidr = atoi(data->cidr4); + cidr = strtol(data->cidr4, NULL, 10); + if ((errno == ERANGE && (cidr == LONG_MIN || cidr == LONG_MAX)) || + (errno != 0 && cidr == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } if (strcmp(data->ipv4, "")) upper = 32; @@ -81,7 +87,13 @@ static void cidrCallback(newtComponent co, void * dptr) { if (data->cidr6 == NULL && data->ipv6 == NULL) return; - cidr = atoi(data->cidr6); + cidr = strtol(data->cidr6, NULL, 10); + if ((errno == ERANGE && (cidr == LONG_MIN || cidr == LONG_MAX)) || + (errno != 0 && cidr == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } if (strcmp(data->ipv6, "")) upper = 128; @@ -107,7 +119,14 @@ static void ipCallback(newtComponent co, void * dptr) { if (data->cidr4 == NULL && data->ipv4 != NULL) { buf = strdup(data->ipv4); octet = strtok(buf, "."); - i = atoi(octet); + i = strtol(octet, NULL, 10); + + if ((errno == ERANGE && (i == LONG_MIN || i == LONG_MAX)) || + (errno != 0 && i == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } free(buf); free(octet); @@ -1144,7 +1163,16 @@ int manualNetConfig(char * device, struct networkDeviceConfig * cfg, newCfg->dev.set |= PUMP_INTFINFO_HAS_NETMASK; have[IPV4]++; } else { - cidr = atoi(ipcomps->cidr4); + cidr = strtol(ipcomps->cidr4, NULL, 10); + + if ((errno == ERANGE && (cidr == LONG_MIN || + cidr == LONG_MAX)) || + (errno != 0 && cidr == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + if (cidr >= 1 && cidr <= 32) { if (inet_pton(AF_INET, "255.255.255.255", &addr) >= 1) { addr.s_addr = htonl(ntohl(addr.s_addr) << (32 - cidr)); @@ -1168,7 +1196,16 @@ int manualNetConfig(char * device, struct networkDeviceConfig * cfg, } if (ipcomps->cidr6) { - prefix = atoi(ipcomps->cidr6); + prefix = strtol(ipcomps->cidr6, NULL, 10); + + if ((errno == ERANGE && (prefix == LONG_MIN || + prefix == LONG_MAX)) || + (errno != 0 && prefix == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + if (prefix > 0 || prefix <= 128) { newCfg->dev.ipv6_prefixlen = prefix; newCfg->dev.set |= PUMP_INTFINFO_HAS_IPV6_PREFIX; diff --git a/loader2/urls.c b/loader2/urls.c index fae48a335..f95c75dcc 100644 --- a/loader2/urls.c +++ b/loader2/urls.c @@ -33,6 +33,7 @@ #include <string.h> #include <unistd.h> #include <netdb.h> +#include <errno.h> #include "ftp.h" #include "lang.h" @@ -176,10 +177,18 @@ int urlinstStartTransfer(struct iurlinfo * ui, char *path, ui->address, path); splitHostname(ui->address, &hostname, &portstr); - if (portstr == NULL) + if (portstr == NULL) { port = -1; - else - port = atoi(portstr); + } else { + port = strtol(portstr, NULL, 10); + + if ((errno == ERANGE && (port == LONG_MIN || port == LONG_MAX)) || + (errno != 0 && port == 0)) { + logMessage(ERROR, "%s: %d: %s", __func__, __LINE__, + strerror(errno)); + abort(); + } + } if (inet_pton(AF_INET, hostname, &addr) >= 1) family = AF_INET; |