Date: Tue, 25 Jan 2000 17:01:48 -0800 (PST) From: Michael Oswell <oswell@xcert.com> To: freebsd-security@FreeBSD.ORG Subject: make -j vulnerability && FreeBSD 2.2.x Message-ID: <Pine.BSF.4.21.0001251654410.34816-100000@oswell.x509.com>
next in thread | raw e-mail | index | archive | help
It seems that the patch that was released for the make vulnerability a few days ago is not relevant to machines running FreeBSD 2.2.x. I manually entered the changes from the patch which was released into the Make source on a FreeBSD 2.2.8 box, as well as a few other minor changes to make it compile. I have attached my new patch below in case it is of interest to anyone. I make no guarentees that this patch is correct, and would appreciate it if anyone could verify that it does indeed fix the problem. Also, if a patch has already been released for 2.2.x machines to fix this problem, please let me know. Thanks. *** job.c Tue Jan 25 16:37:52 2000 --- job.c.patched Tue Jan 25 16:47:58 2000 *************** *** 157,173 **** #define JOB_FINISHED 2 /* The job is already finished */ #define JOB_STOPPED 3 /* The job is stopped */ /* - * tfile is the name of a file into which all shell commands are put. It is - * used over by removing it before the child shell is executed. The XXXXX in - * the string are replaced by the pid of the make process in a 5-character - * field with leading zeroes. - */ - static char tfile[] = TMPPAT; - - - /* * Descriptions for various shells. */ static Shell shells[] = { /* --- 157,164 ---- *************** *** 988,996 **** if ((aborting == ABORT_ERROR) && Job_Empty()) { /* * If we are aborting and the job table is now empty, we finish. */ ! (void) eunlink(tfile); Finish(errors); } } --- 979,987 ---- if ((aborting == ABORT_ERROR) && Job_Empty()) { /* * If we are aborting and the job table is now empty, we finish. */ ! (void) eunlink(job->tfile); Finish(errors); } } *************** *** 1661,1668 **** --- 1652,1660 ---- static int jobno = 0; /* job number of catching output in a file */ Boolean cmdsOK; /* true if the nodes commands were all right */ Boolean local; /* Set true if the job was run locally */ Boolean noExec; /* Set true if we decide not to run the job */ + int tfd; /* File descriptor for temp file */ if (previous != NULL) { previous->flags &= ~(JOB_FIRST|JOB_IGNERR|JOB_SILENT|JOB_REMOTE); job = previous; *************** *** 1690,1697 **** --- 1682,1695 ---- job->flags |= JOB_SILENT; } job->flags |= flags; + (void) strcpy(job->tfile, TMPPAT); + if ((tfd = mkstemp(job->tfile)) == -1) + Punt("cannot create temp file: %s", strerror(errno)); + else + (void) close(tfd); + /* * Check the commands now so any attributes from .DEFAULT have a chance * to migrate to the node */ *************** *** 1715,1725 **** if (!cmdsOK) { DieHorribly(); } ! job->cmdFILE = fopen(tfile, "w+"); if (job->cmdFILE == NULL) { ! Punt("Could not open %s", tfile); } (void) fcntl(FILENO(job->cmdFILE), F_SETFD, 1); /* * Send the commands to the command file, flush all its buffers then --- 1713,1723 ---- if (!cmdsOK) { DieHorribly(); } ! job->cmdFILE = fopen(job->tfile, "w+"); if (job->cmdFILE == NULL) { ! Punt("Could not open %s", job->tfile); } (void) fcntl(FILENO(job->cmdFILE), F_SETFD, 1); /* * Send the commands to the command file, flush all its buffers then *************** *** 1823,1831 **** /* * Unlink and close the command file if we opened one */ if (job->cmdFILE != stdout) { ! (void) eunlink(tfile); if (job->cmdFILE != NULL) (void) fclose(job->cmdFILE); } else { (void) fflush(stdout); --- 1821,1829 ---- /* * Unlink and close the command file if we opened one */ if (job->cmdFILE != stdout) { ! (void) eunlink(job->tfile); if (job->cmdFILE != NULL) (void) fclose(job->cmdFILE); } else { (void) fflush(stdout); *************** *** 1851,1859 **** return(JOB_ERROR); } } else { (void) fflush(job->cmdFILE); ! (void) eunlink(tfile); } /* * Set up the control arguments to the shell. This is based on the flags --- 1849,1857 ---- return(JOB_ERROR); } } else { (void) fflush(job->cmdFILE); ! (void) eunlink(job->tfile); } /* * Set up the control arguments to the shell. This is based on the flags *************** *** 1878,1886 **** (void) fcntl(job->outPipe, F_SETFD, 1); } else { (void) fprintf(stdout, "Remaking `%s'\n", gn->name); (void) fflush(stdout); ! sprintf(job->outFile, "%s%02d", tfile, jobno); jobno = (jobno + 1) % 100; job->outFd = open(job->outFile,O_WRONLY|O_CREAT|O_APPEND,0600); (void) fcntl(job->outFd, F_SETFD, 1); } --- 1876,1884 ---- (void) fcntl(job->outPipe, F_SETFD, 1); } else { (void) fprintf(stdout, "Remaking `%s'\n", gn->name); (void) fflush(stdout); ! sprintf(job->outFile, "%s%02d", job->tfile, jobno); jobno = (jobno + 1) % 100; job->outFd = open(job->outFile,O_WRONLY|O_CREAT|O_APPEND,0600); (void) fcntl(job->outFd, F_SETFD, 1); } *************** *** 2397,2406 **** * be running at once. */ { GNode *begin; /* node for commands to do at the very start */ - (void) sprintf(tfile, "/tmp/make%05d", getpid()); - jobs = Lst_Init(FALSE); stoppedJobs = Lst_Init(FALSE); maxJobs = maxproc; maxLocal = maxlocal; --- 2395,2402 ---- *************** *** 2902,2910 **** #endif /* RMT_WILL_WATCH */ } } } ! (void) eunlink(tfile); } /* *----------------------------------------------------------------------- --- 2898,2906 ---- #endif /* RMT_WILL_WATCH */ } } } ! (void) eunlink(job->tfile); } /* *----------------------------------------------------------------------- *************** *** 2936,2944 **** #endif /* RMT_WILL_WATCH */ } } } - (void) eunlink(tfile); return(errors); } /*- --- 2932,2939 ---- *************** *** 3012,3028 **** #else KILL(job->pid, SIGINT); KILL(job->pid, SIGKILL); #endif /* RMT_WANTS_SIGNALS */ } } /* * Catch as many children as want to report in at first, then give up */ while (waitpid((pid_t) -1, &foo, WNOHANG) > 0) continue; - (void) eunlink(tfile); } #ifdef REMOTE /*- --- 3007,3023 ---- #else KILL(job->pid, SIGINT); KILL(job->pid, SIGKILL); #endif /* RMT_WANTS_SIGNALS */ + (void) eunlink(job->tfile); } } /* * Catch as many children as want to report in at first, then give up */ while (waitpid((pid_t) -1, &foo, WNOHANG) > 0) continue; } #ifdef REMOTE /*- *** job.h Tue Jan 25 16:38:16 2000 --- job.h.patched Tue Jan 25 16:38:13 2000 *************** *** 92,99 **** --- 92,101 ---- */ #define JOB_BUFSIZE 1024 typedef struct Job { int pid; /* The child's process ID */ + char tfile[sizeof(TMPPAT)]; + /* Temporary file to use for job */ GNode *node; /* The target the child is making */ LstNode tailCmds; /* The node of the first command to be * saved when the job has been run */ FILE *cmdFILE; /* When creating the shell script, this is ----- Michael Oswell Xcert International Inc. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-security" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0001251654410.34816-100000>