--- tmpnam.c.orig 2010-07-06 16:02:20.000000000 -0700 +++ tmpnam.c 2010-07-06 16:32:52.000000000 -0700 @@ -40,21 +40,35 @@ __FBSDID("$FreeBSD: src/lib/libc/stdio/t #include <stdio.h> #include <unistd.h> +#include <pthread.h> +#include <stdlib.h> __warn_references(tmpnam, "warning: tmpnam() possibly used unsafely; consider using mkstemp()"); extern char *_mktemp(char *); +static char *tmpnam_buf = NULL; +static pthread_once_t tmpnam_buf_control = PTHREAD_ONCE_INIT; + +static void tmpnam_buf_allocate(void) +{ + tmpnam_buf = malloc(L_tmpnam); +} + char * tmpnam(s) char *s; { static u_long tmpcount; - static char buf[L_tmpnam]; - if (s == NULL) - s = buf; + if (s == NULL) { + if (pthread_once(&tmpnam_buf_control, tmpnam_buf_allocate) + || !tmpnam_buf) { + return NULL; + } + s = tmpnam_buf; + } (void)snprintf(s, L_tmpnam, "%stmp.%lu.XXXXXX", P_tmpdir, tmpcount); ++tmpcount; return (_mktemp(s));