From e0a363855cfb91c83c3484f08d719a3c86883475 Mon Sep 17 00:00:00 2001 From: Kim Holviala Date: Mon, 29 Jan 2018 11:41:37 +0200 Subject: [PATCH] Fixed checking return values of fgets() calls --- gophernicus.c | 2 +- menu.c | 4 +- options.c | 8 +++- platform.c | 124 +++++++++++++++++++++++++------------------------- 4 files changed, 71 insertions(+), 67 deletions(-) diff --git a/gophernicus.c b/gophernicus.c index 3c7220e..4601fe3 100644 --- a/gophernicus.c +++ b/gophernicus.c @@ -567,7 +567,7 @@ int main(int argc, char *argv[]) /* Read selector */ get_selector: if (fgets(selector, sizeof(selector) - 1, stdin) == NULL) - selector[0] = '\0'; + strclear(selector); /* Remove trailing CRLF */ chomp(selector); diff --git a/menu.c b/menu.c index 9ffa259..4f85f5f 100644 --- a/menu.c +++ b/menu.c @@ -483,7 +483,7 @@ void gopher_menu(state *st) /* Read & output gophertag */ if ((fp = fopen(pathname , "r"))) { - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) == NULL) strclear(buf); chomp(buf); info(st, buf, TYPE_TITLE); @@ -588,7 +588,7 @@ void gopher_menu(state *st) /* Use the gophertag as displayname */ if ((fp = fopen(buf , "r"))) { - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) == NULL) strclear(buf); chomp(buf); fclose(fp); diff --git a/options.c b/options.c index bd49f1a..a6659a9 100644 --- a/options.c +++ b/options.c @@ -173,7 +173,9 @@ void parse_args(state *st, int argc, char *argv[]) if (*st->server_description == '/') { if ((fp = fopen(st->server_description , "r"))) { - fgets(st->server_description, sizeof(st->server_description), fp); + if (fgets(st->server_description, sizeof(st->server_description), fp) == NULL) + strclear(st->server_description); + chomp(st->server_description); fclose(fp); } @@ -184,7 +186,9 @@ void parse_args(state *st, int argc, char *argv[]) if (*st->server_location == '/') { if ((fp = fopen(st->server_location , "r"))) { - fgets(st->server_location, sizeof(st->server_location), fp); + if (fgets(st->server_location, sizeof(st->server_location), fp) == NULL) + strclear(st->server_description); + chomp(st->server_location); fclose(fp); } diff --git a/platform.c b/platform.c index 1636fdc..f4e21b7 100644 --- a/platform.c +++ b/platform.c @@ -63,22 +63,20 @@ void platform(state *st) /* Get CPU type */ if ((fp = popen("/usr/sbin/getsystype -i", "r"))) { - fgets(machine, sizeof(machine), fp); + if (fgets(machine, sizeof(machine), fp) != NULL) + strreplace(machine, ' ', '_'); pclose(fp); - - strreplace(machine, ' ', '_'); } /* Get hardware name using shell uname */ if (!*st->server_description && (fp = popen("/usr/bin/uname -M", "r"))) { - fgets(st->server_description, - sizeof(st->server_description), fp); + if (fgets(st->server_description, sizeof(st->server_description), fp) != NULL) { + strreplace(st->server_description, ',', ' '); + chomp(st->server_description); + } pclose(fp); - - strreplace(st->server_description, ',', ' '); - chomp(st->server_description); } #endif @@ -90,7 +88,7 @@ void platform(state *st) /* Get OS X version */ if ((fp = popen("/usr/bin/sw_vers -productVersion", "r"))) { - fgets(release, sizeof(release), fp); + if (fgets(release, sizeof(release), fp) == NULL) strclear(release); pclose(fp); } @@ -99,16 +97,17 @@ void platform(state *st) (fp = popen("/usr/sbin/sysctl -n hw.model", "r"))) { /* Read hardware name */ - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) != NULL) { + + /* Clones are gone now so we'll hardcode the manufacturer */ + sstrlcpy(st->server_description, "Apple "); + sstrlcat(st->server_description, buf); + + /* Remove hardware revision */ + for (c = st->server_description; *c; c++) + if (*c >= '0' && *c <= '9') { *c = '\0'; break; } + } pclose(fp); - - /* Clones are gone now so we'll hardcode the manufacturer */ - sstrlcpy(st->server_description, "Apple "); - sstrlcat(st->server_description, buf); - - /* Remove hardware revision */ - for (c = st->server_description; *c; c++) - if (*c >= '0' && *c <= '9') { *c = '\0'; break; } } #endif @@ -136,25 +135,26 @@ void platform(state *st) /* Get hardware type from DMI data */ if (!*st->server_description && (fp = fopen("/sys/class/dmi/id/board_vendor" , "r"))) { - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) != NULL) { + sstrlcpy(st->server_description, buf); + chomp(st->server_description); + } fclose(fp); - sstrlcpy(st->server_description, buf); - chomp(st->server_description); - if ((fp = fopen("/sys/class/dmi/id/board_name" , "r"))) { - fgets(buf, sizeof(buf), fp); - fclose(fp); + if (fgets(buf, sizeof(buf), fp) != NULL) { + if (*st->server_description) sstrlcat(st->server_description, " "); + sstrlcat(st->server_description, buf); + chomp(st->server_description); + } - if (*st->server_description) sstrlcat(st->server_description, " "); - sstrlcat(st->server_description, buf); - chomp(st->server_description); + fclose(fp); } } /* No DMI? Get possible hypervisor name */ if (!*st->server_description && (fp = fopen("/sys/hypervisor/type" , "r"))) { - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) == NULL) strclear(buf); fclose(fp); chomp(buf); @@ -165,35 +165,38 @@ void platform(state *st) /* Identify Gentoo */ if (!*sysname && (fp = fopen("/etc/gentoo-release", "r"))) { - fgets(sysname, sizeof(sysname), fp); + if (fgets(sysname, sizeof(sysname), fp) != NULL) { + if ((c = strstr(sysname, "release "))) sstrlcpy(release, c + 8); + if ((c = strchr(release, ' '))) *c = '\0'; + if ((c = strchr(sysname, ' '))) *c = '\0'; + } fclose(fp); - - if ((c = strstr(sysname, "release "))) sstrlcpy(release, c + 8); - if ((c = strchr(release, ' '))) *c = '\0'; - if ((c = strchr(sysname, ' '))) *c = '\0'; } /* Identify RedHat */ if (!*sysname && (fp = fopen("/etc/redhat-release", "r"))) { - fgets(sysname, sizeof(sysname), fp); + if (fgets(sysname, sizeof(sysname), fp) != NULL) { + if ((c = strstr(sysname, "release "))) sstrlcpy(release, c + 8); + if ((c = strchr(release, ' '))) *c = '\0'; + if ((c = strchr(sysname, ' '))) *c = '\0'; + + if (strcmp(sysname, "Red") == MATCH) sstrlcpy(sysname, "RedHat"); + } fclose(fp); - - if ((c = strstr(sysname, "release "))) sstrlcpy(release, c + 8); - if ((c = strchr(release, ' '))) *c = '\0'; - if ((c = strchr(sysname, ' '))) *c = '\0'; - - if (strcmp(sysname, "Red") == MATCH) sstrlcpy(sysname, "RedHat"); } /* Identify Slackware */ if (!*sysname && (fp = fopen("/etc/slackware-version", "r"))) { - fgets(sysname, sizeof(sysname), fp); - fclose(fp); + if (fgets(sysname, sizeof(sysname), fp) != NULL) { - if ((c = strchr(sysname, ' '))) { - sstrlcpy(release, c + 1); - *c = '\0'; + if ((c = strchr(sysname, ' '))) { + sstrlcpy(release, c + 1); + *c = '\0'; + } + + if ((c = strchr(sysname, '-'))) *c = '\0'; } + fclose(fp); } /* Identify CRUX */ @@ -202,11 +205,10 @@ void platform(state *st) sstrlcpy(sysname, "CRUX"); if ((fp = popen("/usr/bin/crux", "r"))) { - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) != NULL && + (c = strchr(buf, ' ')) && + (c = strchr(c + 1, ' '))) sstrlcpy(release, c + 1); pclose(fp); - - if ((c = strchr(buf, ' ')) && (c = strchr(c + 1, ' '))) - sstrlcpy(release, c + 1); } } @@ -214,31 +216,30 @@ void platform(state *st) if (stat("/usr/bin/lsb_release", &file) == OK && (file.st_mode & S_IXOTH)) { if (!*sysname && (fp = popen("/usr/bin/lsb_release -i -s", "r"))) { - fgets(sysname, sizeof(sysname), fp); + if (fgets(sysname, sizeof(sysname), fp) == NULL) strclear(sysname); pclose(fp); } if (!*release && (fp = popen("/usr/bin/lsb_release -r -s", "r"))) { - fgets(release, sizeof(release), fp); + if (fgets(release, sizeof(release), fp) == NULL) strclear(release); pclose(fp); } } /* OK, nothing worked - let's try /etc/issue for sysname */ if (!*sysname && (fp = fopen("/etc/issue", "r"))) { - fgets(sysname, sizeof(sysname), fp); + if (fgets(sysname, sizeof(sysname), fp) != NULL) { + if ((c = strchr(sysname, ' '))) *c = '\0'; + if ((c = strchr(sysname, '\\'))) *c = '\0'; + } fclose(fp); - - if ((c = strchr(sysname, ' '))) *c = '\0'; - if ((c = strchr(sysname, '\\'))) *c = '\0'; } /* Debian version should be in /etc/debian_version */ if (!*release && (fp = fopen("/etc/debian_version", "r"))) { - fgets (release, sizeof(release), fp); + if (fgets (release, sizeof(release), fp) != NULL) + if ((c = strchr(release, '/'))) *c = '\0'; fclose(fp); - - if ((c = strchr(release, '/'))) *c = '\0'; } #endif @@ -298,9 +299,8 @@ float loadavg(void) /* Faster Linux version */ #ifdef __linux - buf[0] = '\0'; if ((fp = fopen("/proc/loadavg" , "r")) == NULL) return 0; - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) == NULL) strclear(buf); fclose(fp); return (float) atof(buf); @@ -311,11 +311,11 @@ float loadavg(void) char *c; if ((fp = popen("/usr/bin/uptime", "r"))) { - fgets(buf, sizeof(buf), fp); + if (fgets(buf, sizeof(buf), fp) == NULL) strclear(buf); pclose(fp); if ((c = strstr(buf, "average: ")) || (c = strstr(buf, "averages: "))) - return (float) atof(c + 10); + return (float) atof(c + 9); } #endif