aboutsummaryrefslogtreecommitdiffstats
path: root/FICS/playerdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'FICS/playerdb.c')
-rw-r--r--FICS/playerdb.c95
1 files changed, 77 insertions, 18 deletions
diff --git a/FICS/playerdb.c b/FICS/playerdb.c
index 1373630..29e14f4 100644
--- a/FICS/playerdb.c
+++ b/FICS/playerdb.c
@@ -46,6 +46,9 @@
Markus Uhlin 25/04/02 add_to_list: added an upper
limit for the list size.
Markus Uhlin 25/04/06 Fixed Clang Tidy warnings.
+ Markus Uhlin 25/07/28 Restricted file permissions upon
+ creation.
+ Markus Uhlin 25/07/30 Usage of 'int64_t'.
*/
#include "stdinclude.h"
@@ -53,6 +56,8 @@
#include <err.h>
#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
#include <stdint.h>
#include "command.h"
@@ -1174,6 +1179,7 @@ player_markdeleted(int p)
FILE *fp;
char fname[MAX_FILENAME_SIZE];
char fname2[MAX_FILENAME_SIZE];
+ int fd;
if (!parray[p].registered) // Player must not be registered
return -1;
@@ -1184,9 +1190,17 @@ player_markdeleted(int p)
parray[p].login[0], parray[p].login);
xrename(__func__, fname, fname2);
- if ((fp = fopen(fname2, "a")) != NULL) { // Touch the file
+ errno = 0;
+ fd = open(fname2, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
+
+ if (fd < 0) {
+ warn("%s: open", __func__);
+ return -1;
+ } else if ((fp = fdopen(fd, "a")) != NULL) { // Touch the file
fprintf(fp, "\n");
fclose(fp);
+ } else {
+ close(fd);
}
return 0;
@@ -1290,6 +1304,7 @@ player_save(int p)
{
FILE *fp;
char fname[MAX_FILENAME_SIZE];
+ int fd;
if (!player_num_ok_chk(p)) {
warnx("%s: invalid player number %d", __func__, p);
@@ -1314,8 +1329,15 @@ player_save(int p)
snprintf(fname, sizeof fname, "%s/%c/%s", player_dir,
parray[p].login[0], parray[p].login);
- if ((fp = fopen(fname, "w")) == NULL) {
+ errno = 0;
+ fd = open(fname, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
+
+ if (fd < 0) {
+ warn("%s: Problem opening file %s for write", __func__, fname);
+ return -1;
+ } else if ((fp = fdopen(fd, "w")) == NULL) {
warn("%s: Problem opening file %s for write", __func__, fname);
+ close(fd);
return -1;
}
@@ -1601,10 +1623,20 @@ player_ontime(int p)
PRIVATE void
write_p_inout(int inout, int p, char *file, int maxlines)
{
- FILE *fp;
+ FILE *fp;
+ int fd;
+
+ errno = 0;
+ fd = open(file, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
- if ((fp = fopen(file, "a")) == NULL)
+ if (fd < 0) {
+ warn("%s: open", __func__);
+ return;
+ } else if ((fp = fdopen(fd, "a")) == NULL) {
+ warn("%s: fdopen", __func__);
+ close(fd);
return;
+ }
fprintf(fp, "%d %s %ld %d %s\n", inout, parray[p].name,
(long int)time(NULL), parray[p].registered,
@@ -1663,7 +1695,7 @@ player_lastconnect(int p)
char loginName[MAX_LOGIN_NAME];
int inout, registered;
int ret, too_long;
- long int lval = 0;
+ int64_t lval = 0;
time_t last = 0;
ret = snprintf(fname, sizeof fname, "%s/player_data/%c/%s.%s",
@@ -1689,8 +1721,8 @@ player_lastconnect(int p)
_Static_assert(19 < ARRAY_SIZE(ipstr),
"'ipstr' too small");
- if (fscanf(fp, "%d %19s %ld %d %19s\n", &inout, loginName,
- &lval, &registered, ipstr) != 5) {
+ if (fscanf(fp, ("%d %19s " "%" SCNd64 " %d %19s\n"), &inout,
+ loginName, &lval, &registered, ipstr) != 5) {
fprintf(stderr, "FICS: Error in login info format. %s"
"\n", fname);
fclose(fp);
@@ -1711,7 +1743,7 @@ player_lastdisconnect(int p)
char loginName[MAX_LOGIN_NAME];
int inout, registered;
int ret, too_long;
- long int lval;
+ int64_t lval;
time_t last = 0;
ret = snprintf(fname, sizeof fname, "%s/player_data/%c/%s.%s",
@@ -1732,8 +1764,8 @@ player_lastdisconnect(int p)
_Static_assert(19 < ARRAY_SIZE(ipstr),
"'ipstr' too small");
- if (fscanf(fp, "%d %19s %ld %d %19s\n", &inout, loginName,
- &lval, &registered, ipstr) != 5) {
+ if (fscanf(fp, ("%d %19s " "%" SCNd64 " %d %19s\n"), &inout,
+ loginName, &lval, &registered, ipstr) != 5) {
fprintf(stderr, "FICS: Error in login info format. %s"
"\n", fname);
fclose(fp);
@@ -2573,9 +2605,10 @@ PUBLIC int
player_add_message(int top, int fromp, char *message)
{
FILE *fp;
- char fname[MAX_FILENAME_SIZE];
- char messbody[1024];
- char subj[256];
+ char fname[MAX_FILENAME_SIZE] = { '\0' };
+ char messbody[1024] = { '\0' };
+ char subj[256] = { '\0' };
+ int fd;
time_t t = time(NULL);
if (!parray[top].registered)
@@ -2588,8 +2621,16 @@ player_add_message(int top, int fromp, char *message)
if (lines_file(fname) >= MAX_MESSAGES && parray[top].adminLevel == 0)
return -1;
- if ((fp = fopen(fname, "a")) == NULL)
+ errno = 0;
+ fd = open(fname, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
+
+ if (fd < 0)
+ return -1;
+ else if ((fp = fdopen(fd, "a")) == NULL) {
+ close(fd);
return -1;
+ }
+
fprintf(fp, "%s at %s: %s\n", parray[fromp].name, strltime(&t),
message);
fclose(fp);
@@ -2752,13 +2793,21 @@ PRIVATE int
WriteMsgFile(int p, textlist *Head)
{
FILE *fp;
- char fName[MAX_FILENAME_SIZE];
+ char fName[MAX_FILENAME_SIZE] = { '\0' };
+ int fd;
textlist *Cur;
GetMsgFile(p, fName, sizeof fName, __func__);
- if ((fp = fopen(fName, "w")) == NULL)
+ errno = 0;
+ fd = open(fName, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
+
+ if (fd < 0)
+ return 0;
+ else if ((fp = fdopen(fd, "w")) == NULL) {
+ close(fd);
return 0;
+ }
for (Cur = Head; Cur != NULL; Cur = Cur->next)
fprintf(fp, "%s", Cur->text);
fclose(fp);
@@ -3161,7 +3210,8 @@ PUBLIC int
player_add_comment(int p_by, int p_to, char *comment)
{
FILE *fp;
- char fname[MAX_FILENAME_SIZE];
+ char fname[MAX_FILENAME_SIZE] = { '\0' };
+ int fd;
time_t t = time(NULL);
if (!parray[p_to].registered)
@@ -3170,8 +3220,17 @@ player_add_comment(int p_by, int p_to, char *comment)
snprintf(fname, sizeof fname, "%s/player_data/%c/%s.%s", stats_dir,
parray[p_to].login[0], parray[p_to].login, "comments");
- if ((fp = fopen(fname, "a")) == NULL)
+ errno = 0;
+ fd = open(fname, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
+
+ if (fd < 0) {
+ warn("%s: open", __func__);
+ return -1;
+ } else if ((fp = fdopen(fd, "a")) == NULL) {
+ warn("%s: fdopen", __func__);
+ close(fd);
return -1;
+ }
fprintf(fp, "%s at %s: %s\n", parray[p_by].name, strltime(&t), comment);
fclose(fp);