summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--isys/devices.c28
-rw-r--r--isys/isys.c8
-rw-r--r--isys/silo.c20
-rw-r--r--loader2/fwloader.c8
-rw-r--r--loader2/loader.c76
-rw-r--r--loader2/net.c47
-rw-r--r--loader2/urls.c15
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;