Return to BSD News archive
Newsgroups: comp.os.386bsd.bugs Path: sserve!newshost.anu.edu.au!munnari.oz.au!spool.mu.edu!cass.ma02.bull.com!syd.bull.oz.au!melb.bull.oz.au!zen!sjg From: sjg@zen.void.oz.au (Simon J. Gerraty) Subject: Re: mktemp() crashes Organization: Zen programming... References: <CF7snJ.ID9@dvorak.amd.com> <1993Oct21.093717.2658@zen.void.oz.au> Message-ID: <1993Oct21.120854.2900@zen.void.oz.au> Date: Thu, 21 Oct 1993 12:08:54 GMT Lines: 149 helgren@dvorak.amd.com (Matt Helgren) writes: > Im trying to use mkmf to get an application compiled but mkmf keeps >crashing when envoked. Using gdb I find that its dying in the routine >mktemp() which is in one of the system libs. Is there a known bug with mktemp? sjg@zen.void.oz.au (Simon J. Gerraty) writes: >There is an incompatability between mktemp()'s implementation, many >programs use of mktemp() and ANSI-C. >Solutions: >2/ fix mktemp() to use a private static array. Here is a patch to implement option 2. Fix: The following patch modifes mktemp() to use a private (static) buffer which it can safely modify. *** lib/libc/stdio/mktemp.c~ Wed May 8 06:43:49 1991 --- lib/libc/stdio/mktemp.c Thu Oct 21 21:50:55 1993 *************** *** 40,47 **** #include <fcntl.h> #include <errno.h> #include <stdio.h> ! static int _gettemp(); mkstemp(path) char *path; --- 40,48 ---- #include <fcntl.h> #include <errno.h> #include <stdio.h> + #include <string.h> ! static char * _gettemp(); mkstemp(path) char *path; *************** *** 55,73 **** mktemp(path) char *path; { ! return(_gettemp(path, (int *)NULL) ? path : (char *)NULL); } ! static _gettemp(path, doopen) char *path; register int *doopen; { extern int errno; register char *start, *trv; struct stat sbuf; u_int pid; pid = getpid(); for (trv = path; *trv; ++trv); /* extra X's get set to 0's */ while (*--trv == 'X') { --- 56,78 ---- mktemp(path) char *path; { ! return _gettemp(path, (int *)NULL); } ! static char * _gettemp(path, doopen) char *path; register int *doopen; { extern int errno; + static char temp_path[256]; register char *start, *trv; struct stat sbuf; u_int pid; + path = strncpy(temp_path, path, sizeof (temp_path) - 1); + temp_path[sizeof (temp_path) - 1] = '\0'; + pid = getpid(); for (trv = path; *trv; ++trv); /* extra X's get set to 0's */ while (*--trv == 'X') { *************** *** 85,94 **** if (*trv == '/') { *trv = '\0'; if (stat(path, &sbuf)) ! return(0); if (!S_ISDIR(sbuf.st_mode)) { errno = ENOTDIR; ! return(0); } *trv = '/'; break; --- 90,99 ---- if (*trv == '/') { *trv = '\0'; if (stat(path, &sbuf)) ! return((char *) 0); if (!S_ISDIR(sbuf.st_mode)) { errno = ENOTDIR; ! return((char *) 0); } *trv = '/'; break; *************** *** 99,115 **** if (doopen) { if ((*doopen = open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) ! return(1); if (errno != EEXIST) ! return(0); } else if (stat(path, &sbuf)) ! return(errno == ENOENT ? 1 : 0); /* tricky little algorithm for backward compatibility */ for (trv = start;;) { if (!*trv) ! return(0); if (*trv == 'z') *trv++ = 'a'; else { --- 104,120 ---- if (doopen) { if ((*doopen = open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) ! return(path); if (errno != EEXIST) ! return((char *) 0); } else if (stat(path, &sbuf)) ! return(errno == ENOENT ? path : (char *) 0); /* tricky little algorithm for backward compatibility */ for (trv = start;;) { if (!*trv) ! return((char *) 0); if (*trv == 'z') *trv++ = 'a'; else { -- Simon J. Gerraty <sjg@zen.void.oz.au> #include <disclaimer> /* imagine something _very_ witty here */