1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2025-01-28 09:38:38 +00:00

fix racecondition in eve, based on a patch from Vasiliy Kulikov, based on a patch from Brandon

This commit is contained in:
Nikolas Garofil 2011-02-11 18:30:04 +01:00
parent 18ce365d16
commit 70b6f35a84

View File

@ -254,19 +254,6 @@ static char *formatTime(struct tm *ends)
} }
} }
static int file_exists(const char *filename)
{
struct stat fi;
if ((stat(filename, &fi)) == 0) {
if (fi.st_size > 0)
return 1;
else
return 0;
} else
return 0;
}
static void writeSkilltree(char *content, const char *filename) static void writeSkilltree(char *content, const char *filename)
{ {
FILE *fp = fopen(filename, "w"); FILE *fp = fopen(filename, "w");
@ -283,14 +270,12 @@ static char *getSkillname(const char *file, int skillid)
xmlDocPtr doc = 0; xmlDocPtr doc = 0;
xmlNodePtr root = 0; xmlNodePtr root = 0;
if (!file_exists(file)) {
skilltree = getXmlFromAPI(NULL, NULL, NULL, EVEURL_SKILLTREE); skilltree = getXmlFromAPI(NULL, NULL, NULL, EVEURL_SKILLTREE);
//2x file_exits() so that someone (malicious?) couldn't create it during during the previous call writeSkilltree(skilltree, file);
if (!file_exists(file)) writeSkilltree(skilltree, file);
free(skilltree); free(skilltree);
}
doc = xmlReadFile(file, NULL, 0); doc = xmlReadFile(file, NULL, 0);
unlink(file);
if (!doc) if (!doc)
return NULL; return NULL;
@ -341,7 +326,7 @@ static char *getSkillname(const char *file, int skillid)
static char *eve(char *userid, char *apikey, char *charid) static char *eve(char *userid, char *apikey, char *charid)
{ {
Character *chr = NULL; Character *chr = NULL;
const char *skillfile = "/tmp/.cesf"; char skillfile[] = "/tmp/.cesfXXXXXX";
int i = 0; int i = 0;
char *output = 0; char *output = 0;
char *timel = 0; char *timel = 0;
@ -349,6 +334,7 @@ static char *eve(char *userid, char *apikey, char *charid)
char *content = 0; char *content = 0;
time_t now = 0; time_t now = 0;
char *error = 0; char *error = 0;
int tmp_fd, old_umask;
for (i = 0; i < MAXCHARS; i++) { for (i = 0; i < MAXCHARS; i++) {
@ -401,6 +387,14 @@ static char *eve(char *userid, char *apikey, char *charid)
output = (char *)malloc(200 * sizeof(char)); output = (char *)malloc(200 * sizeof(char));
timel = formatTime(&chr->ends); timel = formatTime(&chr->ends);
old_umask = umask(0066);
tmp_fd = mkstemp(skillfile);
umask(old_umask);
if (tmp_fd == -1) {
error = strdup("Cannot create temporary file");
return error;
}
close(tmp_fd);
skill = getSkillname(skillfile, chr->skill); skill = getSkillname(skillfile, chr->skill);
chr->skillname = strdup(skill); chr->skillname = strdup(skill);