Hi, the provided patch is actually not fixing the issue really. I attached 2 patches for trr_update and trr_format which should fix this. Please test them before you upload the changes since I don't use emacs and have no idea of the program. But it would be a good idea to do a complete rewrite of the code, its really ugly. Kind regards NIco
-- Nico Golde - http://www.ngolde.de JAB: [EMAIL PROTECTED] - GPG: 0x73647CFF Forget about that mouse with 3/4/5 buttons, gimme a keyboard with 103/104/105 keys!
--- /home/nion/build/trr19-1.0beta5/trr_format.c 2006-12-29 17:54:11.000000000 +0100 +++ trr_format.c 2006-12-29 18:27:26.000000000 +0100 @@ -18,6 +18,7 @@ #include <stdlib.h> #include <stdio.h> +#include <limits.h> #include <signal.h> #include <errno.h> #include <pwd.h> @@ -40,27 +41,25 @@ main(int argc, char **argv){ - char textfile[256], formattedfile[256], lockfile[256], *tmpfname; - char command[256], line[1024]; + char textfile[_POSIX_PATH_MAX], formattedfile[_POSIX_PATH_MAX], lockfile[_POSIX_PATH_MAX], *tmpfname; + char command[_POSIX_PATH_MAX], line[_POSIX_PATH_MAX]; FILE *fd, *tmpfd; int i; struct passwd *pw = NULL; - /* ignore signals */ signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTERM, SIG_IGN); + if(argc<2){ + fprintf(stderr, "no file specified..\n"); + exit(EXIT_FAILURE); + } - strcpy(textfile, TEXT_DIR); - strcat(textfile, argv[1]); - strcpy(formattedfile, textfile); - strcat(formattedfile, ".formed"); - strcpy(lockfile, textfile); - strcat(lockfile, ".lock"); + snprintf(line, sizeof(line), "%s%s%s.formed%s.lock", TEXT_DIR, argv[1], textfile, textfile); - umask(18); + umask(022); /* if previous process is formatting same target text, wait for that process to finish formatting. */ @@ -91,7 +90,7 @@ /* format a text - fork and exec the processes so we can drop privileges */ switch( fork() ) { case -1: /* Error */ - perror(fork); + perror("fork"); exit(1); break; case 0: /* Child */ @@ -100,9 +99,13 @@ /* Drop group privileges */ pw = getpwuid(getuid()); + if(!pw){ + fprintf(stderr, "You don't exist..go away\n"); + exit(EXIT_FAILURE); + } setgid(pw->pw_gid); - sprintf(command, "%s -v '^[ \t]*$' %s | %s 's/\\([.?!;]\\) *$/\\1/' | %s 's/^ *\\(.*\\)$/\\1/' > %s", + snprintf(command, sizeof(command), "%s -v '^[ \t]*$' %s | %s 's/\\([.?!;]\\) *$/\\1/' | %s 's/^ *\\(.*\\)$/\\1/' > %s" GREP, textfile, SED, SED, tmpfname); system(command); break; @@ -111,15 +114,23 @@ } tmpfd = fopen(tmpfname, "r"); + if(!tmpfd){ + perror("fopen"); + exit(EXIT_FAILURE); + } fd = fopen(formattedfile, "w"); + if(!fd){ + perror("fopen"); + exit(EXIT_FAILURE); + } - while(fgets(line, 1024, tmpfd)) + while(fgets(line, sizeof(line), tmpfd)) fputs(line, fd); fclose(tmpfd); fclose(fd); unlink(tmpfname); - + free(line); /* release lock */ unlink(lockfile); return 0;
--- /home/nion/build/trr19-1.0beta5/trr_update.c 1996-07-03 06:52:08.000000000 +0200 +++ trr_update.c 2006-12-29 19:05:35.000000000 +0100 @@ -21,6 +21,7 @@ #include <stdlib.h> #include <signal.h> #include <errno.h> +#include <limits.h> #if defined(HAVE_STRING_H) #include <string.h> @@ -45,10 +46,10 @@ #endif /* HAVE_FCNTL_H */ main(int argc, char **argv){ - char scorefile[256], lockfile[256], datestr[64]; - char line[256], savedline[256]; - const char *user, *scores, *step, *times, *ttime, *token; - FILE *fd, *tmpf; + char scorefile[_POSIX_PATH_MAX], lockfile[_POSIX_PATH_MAX], datestr[64]; + char line[_POSIX_PATH_MAX], savedline[_POSIX_PATH_MAX]; + const char *user=NULL, *scores=NULL, *step=NULL, *times=NULL, *ttime=NULL, *token=NULL; + FILE *fd=NULL, *tmpf=NULL; int score, tmpscore, i, myself, inserted; long datev; @@ -58,25 +59,34 @@ signal(SIGQUIT, SIG_IGN); signal(SIGTERM, SIG_IGN); - umask(18); - strcpy(scorefile, RECORD_DIR); + snprintf(lockfile, sizeof(lockfile), "%s.lock", scorefile); - /* create a new record file */ - if (argc == 2){ - strcat(scorefile, argv[1]); + if (argc<2) { + fprintf(stderr,"too few arguments\n"); + exit(EXIT_FAILURE); + } - if ((fd = fopen(scorefile, "w")) == NULL){ - perror(scorefile); - exit(1); - } else + umask(022); + snprintf(scorefile, sizeof(scorefile), RECORD_DIR "%s", argv[1]); + + /* create a new record file */ + if (argc == 2){ + + if ((fd = fopen(scorefile, "w")) == NULL){ + perror(scorefile); + exit(1); + } else fclose(fd); - exit(0); + exit(0); } - /* upfate high score file */ - strcat(scorefile, argv[1]); - strcpy(lockfile, scorefile); - strcat(lockfile, ".lock"); + /* upate high score file */ + snprintf(lockfile,sizeof(lockfile),"%s.lock",scorefile); + + if(argc < 7){ + fprintf(stderr, "not enough arguments given..\n"); + exit(EXIT_FAILURE); + } user = argv[2]; scores = argv[3]; score = atoi(argv[3]); @@ -85,7 +95,7 @@ ttime = argv[6]; time(&datev); - strftime(datestr, 63, "%y.%m.%d, %H:%M", localtime(&datev)); + strftime(datestr, sizeof(datestr), "%y.%m.%d, %H:%M", localtime(&datev)); /* lock */ i = 0; @@ -110,13 +120,17 @@ inserted = 0; /* sorting ... */ - while (fgets(line, 256, fd)){ + while (fgets(line, sizeof(line), fd)){ myself = 0; - strcpy(savedline, line); + strncpy(savedline, sizeof(savedline), line); token = (char*)strtok(line, " \t"); - if (! strcmp(user, token)) + if (token && !strcmp(user, token)) myself = 1; token = (char*)strtok(NULL, " \t"); + if(!token) { + perror("strtok"); + exit(EXIT_FAILURE); + } tmpscore = atoi(token); if ((! inserted) && (tmpscore <= score)){ inserted = 1; @@ -146,7 +160,7 @@ unlink(lockfile); exit(1); } - while (fgets(line, 256, tmpf)) + while (fgets(line, sizeof(line), tmpf)) fputs(line, fd); fclose(tmpf);
pgpAcjIHbLHsE.pgp
Description: PGP signature