freebsd-ports/security/tripwire12/files/patch-mktemp
Steve Price 0a9a4b5bd2 - Fix some of the compiler warnings (see patches/patch-warnings)
- Fix the Makefiles to obey the CC and CFLAGS settings
- Fix patches/patch-ab to be PREFIX/LOCALBASE safe
- Fix the post-install to not compress the gunzip and tripwire executables
  that go onto a floppy -- there is no support for the gzip-ed ELF binaries
  at all, and even for the older AOUT ones such support was optional
- Replaces the /kernel with `sysctl -n kern.bootfile` in the tw.conf as the
  tw.conf.freebsd2 is copied into the right place.
- Replace the use of mktemp(3) with tmpfile(3) (see patches/patch-mktemp).
  This also caused a removal of a few buffers (of size MAXPATHLEN+256) and
  quite a few strcpy and sprintf invocations.

PR:		18634
Submitted by:	Mikhail Teterin <mi@aldan.algebra.com>
2000-05-29 02:27:45 +00:00

239 lines
6.4 KiB
Text

This patches replace all uses of the (potentially insecure) mktemp(3)
with a much safer tmpfile(3).
--- src/config.parse.c Wed Jul 20 21:03:26 1994
+++ src/config.parse.c Wed May 17 17:30:22 2000
@@ -55,7 +55,6 @@
#endif
/* prototypes */
-char *mktemp();
static void configfile_descend();
#ifndef L_tmpnam
@@ -86,7 +85,6 @@
char ignorestring[1024];
char s[MAXPATHLEN+1024];
char configfile[MAXPATHLEN+512];
- char *tmpfilename;
char number[128];
int entrynum = 0;
int err;
@@ -98,18 +96,6 @@
if (!printpreprocess && !quietmode)
fputs("### Phase 1: Reading configuration file\n", stderr);
- /* generate temporary file name */
- if ((tmpfilename = (char *) malloc(L_tmpnam + MAXPATHLEN)) == NULL) {
- perror("configfile_read: malloc()");
- exit(1);
- };
- (void) strcpy(tmpfilename, TEMPFILE_TEMPLATE);
-
- if ((char *) mktemp(tmpfilename) == NULL) {
- perror("configfile_read: mktemp()");
- exit(1);
- }
-
/* generate configuration file name */
if (specified_configmode != SPECIFIED_FILE)
sprintf(configfile, "%s/%s", config_path, config_file);
@@ -149,25 +135,17 @@
err = umask(077); /* to protect the tempfile */
- if ((fpout = fopen(tmpfilename, "w+")) == NULL) {
- sprintf(s, "tripwire: Couldn't open config file '%s'", configfile);
- perror(s);
- exit(1);
- }
- (void) umask(err); /* return it to its former state */
-
- /* The following unlink accomplishes two things:
+ /* The use of tmpfile(3) accomplishes two things:
* 1) if the program terminates, we won't leave a temp
* file sitting around with potentially sensitive names
* in it.
* 2) the file is "hidden" while we run
*/
- if (unlink(tmpfilename) < 0) {
- perror("configfile_read: unlink()");
+ if ((fpout = tmpfile()) == NULL) {
+ perror("tmpfile");
exit(1);
}
- free(tmpfilename);
-
+ (void) umask(err); /* return it to its former state */
/*
* pass 0: preprocess file
--- src/dbase.build.c Mon Jul 25 11:24:09 1994
+++ src/dbase.build.c Wed May 17 18:22:14 2000
@@ -66,7 +66,6 @@
int files_scanned_num = 0;
/* prototypes */
-char *mktemp();
static void database_record_write();
char backupfile[MAXPATHLEN+256];
@@ -125,17 +124,7 @@
/* where do we write the new database? */
if (mode == DBASE_TEMPORARY) {
- char *tmpfilename = (char *) malloc(strlen(TEMPFILE_TEMPLATE)+1);
- if (tmpfilename == NULL)
- die_with_err("malloc() failed in database_build", (char *) NULL);
- (void) strcpy(tmpfilename, TEMPFILE_TEMPLATE);
-
- if ((char *) mktemp(tmpfilename) == NULL)
- die_with_err("database_build: mktemp()", (char *) NULL);
-
- (void) strcpy(tempdatabase_file, tmpfilename);
- (void) strcpy(database, tempdatabase_file);
- free(tmpfilename);
+ /* do nothing */
} /* end if temporary database */
else if (mode == DBASE_UPDATE) {
sprintf(database, "./databases/%s", database_file);
@@ -224,6 +213,12 @@
}
/* rebuild the database */
+ if (mode == DBASE_TEMPORARY) {
+ fpw = tmpfile();
+ if (fpw == NULL)
+ die_with_err("call tmpfile(3) failed. Check your TMPDIR setting",
+ NULL);
+ } else
if ((fpw = fopen(database, "w")) == NULL)
die_with_err("Hint: Maybe the database directory '%s' doesn't exist? fopen()", database);
@@ -369,6 +364,6 @@
- /* we don't want to allow anyone to spoof the temporary file in /tmp */
+ /* if the database was temporary, the file was opened by tmpfile(3) --
+ as such, it can not be accessed by anything but this process */
if (mode == DBASE_TEMPORARY) {
- if ((fptempdbase = freopen(database, "r", fpw)) == NULL)
- die_with_err("temporary database file disappeared?!?", database);
+ fptempdbase = fpw;
rewind(fptempdbase);
--- src/main.c Fri Aug 26 04:23:03 1994
+++ src/main.c Wed May 17 18:01:00 2000
@@ -108,7 +108,6 @@
char *database_path = DATABASE_PATH;
char *config_path = CONFIG_PATH;
-char tempdatabase_file[MAXPATHLEN+256];
FILE *fptempdbase;
char *defaultignore = DEFAULTIGNORE;
--- src/preen.c Mon Jul 25 11:24:11 1994
+++ src/preen.c Wed May 17 18:22:22 2000
@@ -37,7 +37,6 @@
static int numentriesread = 0; /* running count of @@contents */
/* prototypes */
-char *mktemp();
static void olddbasefile_load();
char *updatemodes[] = {
@@ -97,9 +96,6 @@
preen_report(interactive, ppp_updateentries);
if (!specified_configmode)
(void) fclose(fp_in);
-
- /* remove the temporary database file */
- (void) unlink(tempdatabase_file);
SPDEBUG(3) printf("*** leaving update_gather()\n");
--- src/siggen.c Mon Jul 25 11:24:12 1994
+++ src/siggen.c Wed May 17 18:36:51 2000
@@ -52,7 +52,6 @@
extern int optind;
int debuglevel = 0;
-char *mktemp();
int (*pf_signatures [NUM_SIGS]) () = {
SIG0FUNC,
@@ -84,7 +83,6 @@
};
int verbosity = 0;
int quietmode = 0;
-char *tmpfilename = NULL;
int readstdin = 0;
@@ -167,19 +167,6 @@
FILE *fpout;
- /* generate temporary file name */
- if ((tmpfilename = (char *) malloc(L_tmpnam + MAXPATHLEN)) == NULL) {
- perror("main: malloc()");
- exit(1);
- };
- (void) strcpy(tmpfilename, "/tmp/twzXXXXXX");
-
- if ((char *) mktemp(tmpfilename) == NULL) {
- perror("siggen: mktemp()");
- exit(1);
- }
/* output */
- if (!(fpout = fopen(tmpfilename, "w"))) {
- char err[1024];
- sprintf(err, "main: fopen(%s)", tmpfilename);
- perror(err);
+ if (!(fpout = tmpfile())) {
+ perror("tmpfile()");
exit(1);
@@ -189,12 +176,6 @@
putc(c, fpout);
- fclose(fpout);
- if ((fd = open(tmpfilename, O_RDONLY)) < 0) {
- perror("siggen: open");
- exit(1);
- }
- if (siggen(fd) < 0)
+ rewind(fpout);
+ if (siggen(fileno(fpout)) < 0)
errors++;
- if (fd)
- close(fd);
+ close(fd);
- unlink(tmpfilename);
--- src/utils.c Mon Jul 25 12:23:16 1994
+++ src/utils.c Wed May 17 18:21:38 2000
@@ -785,23 +785,15 @@
int
fd_tempfilename_generate()
{
- char tmp[MAXPATHLEN+256];
- int fd;
+ FILE *tmp;
- (void) strcpy(tmp, TEMPFILE_TEMPLATE);
- if ((char *) mktemp(tmp) == NULL) {
- perror("tempfilename_generate: mktemp()");
+ tmp = tmpfile();
+ if (tmp == NULL) {
+ perror("tempfilename_generate: tmpfile()");
exit(1);
}
- if ((fd = open(tmp, O_RDWR | O_CREAT, 0600)) < 0) {
- perror("tempfilename_generate: open()");
- exit(1);
- }
- /* unlink right away to make sure no one can tamper with our file */
- unlink(tmp);
-
- return fd;
+ return fileno(tmp);
}
/*