aboutsummaryrefslogtreecommitdiffstats
path: root/FICS
diff options
context:
space:
mode:
Diffstat (limited to 'FICS')
-rw-r--r--FICS/obsproc.c23
-rw-r--r--FICS/playerdb.c57
-rw-r--r--FICS/playerdb.h1
3 files changed, 50 insertions, 31 deletions
diff --git a/FICS/obsproc.c b/FICS/obsproc.c
index dc47cbe..283ecc3 100644
--- a/FICS/obsproc.c
+++ b/FICS/obsproc.c
@@ -30,6 +30,8 @@
fscanf().
Markus Uhlin 24/12/02 Improved old_mail_moves()
Markus Uhlin 25/01/18 Fixed -Wshadow
+ Markus Uhlin 25/03/15 Fixed possible buffer overflow
+ in FindHistory2().
*/
#include "stdinclude.h"
@@ -994,9 +996,10 @@ FindHistory(int p, int p1, int p_game)
}
PRIVATE char *
-FindHistory2(int p, int p1, int p_game, char *End)
+FindHistory2(int p, int p1, int p_game, char *End, const size_t End_size)
{
FILE *fpHist;
+ char fmt[80] = { '\0' };
int index = 0;
long int when = 0;
static char fileName[MAX_FILENAME_SIZE];
@@ -1009,12 +1012,11 @@ FindHistory2(int p, int p1, int p_game, char *End)
return NULL;
}
- do {
- int ret;
+ msnprintf(fmt, sizeof fmt, "%%d %%*c %%*d %%*c %%*d %%*s %%*s %%*d "
+ "%%*d %%*d %%*d %%*s %%%zus %%ld\n", (End_size - 1));
- ret = fscanf(fpHist, "%d %*c %*d %*c %*d %*s %*s %*d %*d %*d "
- "%*d %*s %s %ld", &index, End, &when);
- if (ret != 3)
+ do {
+ if (fscanf(fpHist, fmt, &index, End, &when) != 3)
warn("%s: %s: corrupt", __func__, &fileName[0]);
} while (!feof(fpHist) && index != p_game);
@@ -1815,14 +1817,15 @@ jsave_history(int p, char save_spot, int p1, int from, char *to_file)
char *EndSymbol;
char *HistoryFname;
char *name_to = parray[p].login;
- char End[100];
- char command[MAX_FILENAME_SIZE * 2 + 3];
+ char End[100] = { '\0' };
+ char command[MAX_FILENAME_SIZE * 2 + 3] = { '\0' };
char filename[MAX_FILENAME_SIZE + 1] = { '\0' }; // XXX
- char jfname[MAX_FILENAME_SIZE];
+ char jfname[MAX_FILENAME_SIZE] = { '\0' };
char type[4];
int g;
- if ((HistoryFname = FindHistory2(p, p1, from, End)) != NULL) {
+ if ((HistoryFname = FindHistory2(p, p1, from, End, sizeof End)) !=
+ NULL) {
if ((Game = fopen(HistoryFname, "r")) == NULL) {
pprintf(p, "History game %d not available for %s.\n",
from,
diff --git a/FICS/playerdb.c b/FICS/playerdb.c
index f84dfe4..5888078 100644
--- a/FICS/playerdb.c
+++ b/FICS/playerdb.c
@@ -75,6 +75,21 @@ player_num_ok_chk(const int num)
num < (int)ARRAY_SIZE(parray));
}
+PUBLIC void
+xrename(const char *fn, const char *name1, const char *name2)
+{
+ if (fn == NULL || name1 == NULL || name2 == NULL) {
+ errno = EINVAL;
+ warn("%s", __func__);
+ return;
+ }
+
+ errno = 0;
+
+ if (rename(name1, name2) != 0)
+ warn("%s: '%s' -> '%s'", fn, name1, name2);
+}
+
PRIVATE int
get_empty_slot(void)
{
@@ -1104,7 +1119,7 @@ player_markdeleted(int p)
parray[p].login[0], parray[p].login);
snprintf(fname2, sizeof fname2, "%s/%c/%s.delete", player_dir,
parray[p].login[0], parray[p].login);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
if ((fp = fopen(fname2, "a")) != NULL) { // Touch the file
fprintf(fp, "\n");
@@ -2886,7 +2901,7 @@ player_kill(char *name)
name);
snprintf(fname2, sizeof fname2, "%s/%c/.rem.%s", player_dir, name[0],
name);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
RemHist(name);
@@ -2894,25 +2909,25 @@ player_kill(char *name)
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.games",
stats_dir, name[0], name);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.comments",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.comments",
stats_dir, name[0], name);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.logons",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.logons",
stats_dir, name[0], name);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.messages",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.messages",
stats_dir, name[0], name);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
return 0;
}
@@ -2927,31 +2942,31 @@ player_rename(char *name, char *newname)
name);
snprintf(fname2, sizeof fname2, "%s/%c/%s", player_dir, newname[0],
newname);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.games",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/%s.games",
stats_dir, newname[0], newname);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.comments",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/%s.comments",
stats_dir, newname[0], newname);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.logons",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/%s.logons",
stats_dir, newname[0], newname);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.messages",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/%s.messages",
stats_dir, newname[0], newname);
- rename(fname, fname2);
+ xrename(__func__, fname, fname2);
return 0;
}
@@ -2966,31 +2981,31 @@ player_raise(char *name)
name[0], name);
snprintf(fname2, sizeof fname2, "%s/%c/.rem.%s", player_dir,
name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.games",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.games",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.comments",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.comments",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.logons",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.logons",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.messages",
stats_dir, name[0], name);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.messages",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
return 0;
}
@@ -3005,31 +3020,31 @@ player_reincarn(char *name, char *newname)
newname[0], newname);
snprintf(fname2, sizeof fname2, "%s/%c/.rem.%s", player_dir,
name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.games",
stats_dir, newname[0], newname);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.games",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.comments",
stats_dir, newname[0], newname);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.comments",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.logons",
stats_dir, newname[0], newname);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.logons",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.messages",
stats_dir, newname[0], newname);
snprintf(fname2, sizeof fname2, "%s/player_data/%c/.rem.%s.messages",
stats_dir, name[0], name);
- rename(fname2, fname);
+ xrename(__func__, fname2, fname);
return 0;
}
diff --git a/FICS/playerdb.h b/FICS/playerdb.h
index dc5d6cc..1ccae61 100644
--- a/FICS/playerdb.h
+++ b/FICS/playerdb.h
@@ -204,6 +204,7 @@ extern player parray[PARRAY_SIZE];
extern int p_num;
extern bool player_num_ok_chk(const int);
+extern void xrename(const char *, const char *, const char *);
extern int ClearMsgsBySender(int, param_list);
extern int ClrMsgRange(int, int, int);