aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'FICS/command.c')
-rw-r--r--FICS/command.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/FICS/command.c b/FICS/command.c
index 88aae2e..e6c76db 100644
--- a/FICS/command.c
+++ b/FICS/command.c
@@ -738,6 +738,7 @@ rscan_news(FILE *fp, int p, int lc)
PRIVATE void
check_news(int p, int admin)
{
+#define SCAN_JUNK "%ld %9s"
FILE *fp = NULL;
char count[10] = { '\0' };
char filename[MAX_FILENAME_SIZE] = { '\0' };
@@ -747,6 +748,8 @@ check_news(int p, int admin)
time_t crtime = 0;
time_t lc = player_lastconnect(p);
+ _Static_assert(ARRAY_SIZE(count) > 9, "Unexpected array size");
+
if (admin) {
msnprintf(filename, sizeof filename, "%s/newadminnews.index",
news_dir);
@@ -760,11 +763,23 @@ check_news(int p, int admin)
if (num_anews == -1) {
num_anews = count_lines(fp);
fclose(fp);
- fp = fopen(filename, "r");
+ if ((fp = fopen(filename, "r")) == NULL) {
+ warn("%s: can't find admin news index (%s)",
+ __func__, filename);
+ return;
+ }
+ }
+
+ if (fgets(junk, sizeof junk, fp) == NULL) {
+ warnx("%s: fgets() error", __func__);
+ fclose(fp);
+ return;
+ } else if (sscanf(junk, SCAN_JUNK, &lval, count) != 2) {
+ warnx("%s: sscanf() error", __func__);
+ fclose(fp);
+ return;
}
- fgets(junk, MAX_LINE_SIZE, fp);
- sscanf(junk, "%ld %s", &lval, count);
crtime = lval;
if ((crtime - lc) < 0) {
@@ -805,8 +820,16 @@ check_news(int p, int admin)
}
}
- fgets(junk, MAX_LINE_SIZE, fp);
- sscanf(junk, "%ld %s", &lval, count);
+ if (fgets(junk, sizeof junk, fp) == NULL) {
+ warnx("%s: fgets() error", __func__);
+ fclose(fp);
+ return;
+ } else if (sscanf(junk, SCAN_JUNK, &lval, count) != 2) {
+ warnx("%s: sscanf() error", __func__);
+ fclose(fp);
+ return;
+ }
+
crtime = lval;
if ((crtime - lc) < 0) {