|
Message-ID: <51063B33.1010505@barfooze.de> Date: Mon, 28 Jan 2013 09:47:47 +0100 From: John Spencer <maillist-musl@...fooze.de> To: musl@...ts.openwall.com Subject: Re: [PATCH] Add support for mkostemp, mkstemps and mkostemps On 01/28/2013 06:06 AM, Anthony G. Basile wrote: looks better; however i'd prefer if the __randname would get the strlen passed (or even the string pointer directly to the 6 bytes in question) from the caller to save some cpu cycles (and code bytes). btw, are you sure that the declarations in stdlib.h are inside a _GNU_SOURCE block ? haven't checked but it doesnt look like it in your patch. another thing: the strcpy of XXXXXX in __open_tempfile doesnt seem to make much sense to me - why should there be a need to restore the original template ? (at least it is not needed if you pass the pointer to those 6 bytes directly to __randname) > From: "Anthony G. Basile"<basile@...nsource.dyc.edu> > > Signed-off-by: Anthony G. Basile<blueness@...too.org> > --- > include/stdlib.h | 6 ++++++ > src/temp/mkostemp.c | 18 ++++++++++++++++++ > src/temp/mkostemps.c | 18 ++++++++++++++++++ > src/temp/mkstemp.c | 15 ++------------- > src/temp/mkstemps.c | 18 ++++++++++++++++++ > src/temp/mktemp.c | 7 +++---- > src/temp/randname.c | 22 ++++++++++++++++++++++ > src/temp/tempfile.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 8 files changed, 129 insertions(+), 17 deletions(-) > create mode 100644 src/temp/mkostemp.c > create mode 100644 src/temp/mkostemps.c > create mode 100644 src/temp/mkstemps.c > create mode 100644 src/temp/randname.c > create mode 100644 src/temp/tempfile.c > > diff --git a/include/stdlib.h b/include/stdlib.h > index 671d188..4210f40 100644 > --- a/include/stdlib.h > +++ b/include/stdlib.h > @@ -95,6 +95,9 @@ int posix_memalign (void **, size_t, size_t); > int setenv (const char *, const char *, int); > int unsetenv (const char *); > int mkstemp (char *); > +int mkostemp (char *, int); > +int mkstemps (char *, int); > +int mkostemps (char *, int, int); > char *mkdtemp (char *); > int getsubopt (char **, char *const *, char **); > int rand_r (unsigned *); > @@ -150,6 +153,9 @@ char *gcvt(double, int, char *); > > #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE) > #define mkstemp64 mkstemp > +#define mkostemp64 mkostemp > +#define mkstemps64 mkstemps > +#define mkostemps64 mkostemps > #endif > > #ifdef __cplusplus > diff --git a/src/temp/mkostemp.c b/src/temp/mkostemp.c > new file mode 100644 > index 0000000..750d880 > --- /dev/null > +++ b/src/temp/mkostemp.c > @@ -0,0 +1,18 @@ > +#define _GNU_SOURCE > +#include<string.h> > +#include<stdio.h> > +#include<stdlib.h> > +#include<fcntl.h> > +#include<unistd.h> > +#include<limits.h> > +#include<errno.h> > +#include "libc.h" > + > +int __open_tempfile (char *, int, int); > + > +int __mkostemp(char *template, int flags) > +{ > + return __open_tempfile (template, 0, flags); > +} > + > +weak_alias(__mkostemp, mkostemp); > diff --git a/src/temp/mkostemps.c b/src/temp/mkostemps.c > new file mode 100644 > index 0000000..8c810ce > --- /dev/null > +++ b/src/temp/mkostemps.c > @@ -0,0 +1,18 @@ > +#define _GNU_SOURCE > +#include<string.h> > +#include<stdio.h> > +#include<stdlib.h> > +#include<fcntl.h> > +#include<unistd.h> > +#include<limits.h> > +#include<errno.h> > +#include "libc.h" > + > +int __open_tempfile (char *, int, int); > + > +int __mkostemps(char *template, int len, int flags) > +{ > + return __open_tempfile (template, len, flags); > +} > + > +weak_alias(__mkostemps, mkostemps); > diff --git a/src/temp/mkstemp.c b/src/temp/mkstemp.c > index a390d42..ccaf3c6 100644 > --- a/src/temp/mkstemp.c > +++ b/src/temp/mkstemp.c > @@ -7,22 +7,11 @@ > #include<errno.h> > #include "libc.h" > > -char *__mktemp(char *); > +int __open_tempfile (char *, int, int); > > int mkstemp(char *template) > { > - int fd, retries = 100, t0 = *template; > - while (retries--) { > - if (!*__mktemp(template)) return -1; > - if ((fd = open(template, O_RDWR | O_CREAT | O_EXCL, 0600))>=0) > - return fd; > - if (errno != EEXIST) return -1; > - /* this is safe because mktemp verified > - * that we have a valid template string */ > - template[0] = t0; > - strcpy(template+strlen(template)-6, "XXXXXX"); > - } > - return -1; > + return __open_tempfile (template, 0, O_RDWR); > } > > LFS64(mkstemp); > diff --git a/src/temp/mkstemps.c b/src/temp/mkstemps.c > new file mode 100644 > index 0000000..53fea07 > --- /dev/null > +++ b/src/temp/mkstemps.c > @@ -0,0 +1,18 @@ > +#define _GNU_SOURCE > +#include<string.h> > +#include<stdio.h> > +#include<stdlib.h> > +#include<fcntl.h> > +#include<unistd.h> > +#include<limits.h> > +#include<errno.h> > +#include "libc.h" > + > +int __open_tempfile (char *, int, int); > + > +int __mkstemps(char *template, int len) > +{ > + return __open_tempfile (template, len, O_RDWR); > +} > + > +weak_alias(__mkstemps, mkstemps); > diff --git a/src/temp/mktemp.c b/src/temp/mktemp.c > index c0e06f5..de1afb4 100644 > --- a/src/temp/mktemp.c > +++ b/src/temp/mktemp.c > @@ -8,6 +8,8 @@ > #include<stdint.h> > #include "libc.h" > > +char *__randname(char *); > + > char *__mktemp(char *template) > { > struct timespec ts; > @@ -21,10 +23,7 @@ char *__mktemp(char *template) > return template; > } > while (retries--) { > - clock_gettime(CLOCK_REALTIME,&ts); > - r = ts.tv_nsec + (uintptr_t)&ts / 16 + (uintptr_t)template; > - for (i=1; i<=6; i++, r>>=4) > - template[l-i] = 'A'+(r&15); > + __randname(template); > if (access(template, F_OK)< 0) return template; > } > *template = 0; > diff --git a/src/temp/randname.c b/src/temp/randname.c > new file mode 100644 > index 0000000..4d3476f > --- /dev/null > +++ b/src/temp/randname.c > @@ -0,0 +1,22 @@ > +#include<string.h> > +#include<unistd.h> > +#include<errno.h> > +#include<time.h> > +#include<stdint.h> > +#include "libc.h" > + > +char *__randname(char *template) > +{ > + struct timespec ts; > + size_t i, l = strlen(template); > + unsigned long r; > + > + /* This assumes that a check for the template > + size has alrady been made */ > + clock_gettime(CLOCK_REALTIME,&ts); > + r = ts.tv_nsec + (uintptr_t)&ts / 16 + (uintptr_t)template; > + for (i=1; i<=6; i++, r>>=4) > + template[l-i] = 'A'+(r&15); > + > + return template; > +} > diff --git a/src/temp/tempfile.c b/src/temp/tempfile.c > new file mode 100644 > index 0000000..93808a6 > --- /dev/null > +++ b/src/temp/tempfile.c > @@ -0,0 +1,42 @@ > +#include<string.h> > +#include<stdio.h> > +#include<stdlib.h> > +#include<fcntl.h> > +#include<unistd.h> > +#include<limits.h> > +#include<errno.h> > +#include "libc.h" > + > +char *__randname(char *); > + > +int __open_tempfile (char *template, int len, int flags) > +{ > + if (len< 0) return EINVAL; > + > + int l = strlen(template)-len; > + if (l< 6 || strncmp(template+l-6, "XXXXXX",6)) { > + errno = EINVAL; > + *template = 0; > + return -1; > + } > + > + /* Null terminate the template before the suffix, > + and save the char for adding back the suffix */ > + char suffix = template[l]; > + template[l] = '\0'; > + > + int fd, retries = 100, t0 = *template; > + while (retries--) { > + if (!*__randname(template)) return -1; > + /* Add back the suffix */ > + template[l] = suffix; > + if ((fd = open(template, flags | O_CREAT | O_EXCL, 0600))>=0) > + return fd; > + if (errno != EEXIST) return -1; > + /* this is safe because mktemp verified > + * that we have a valid template string */ > + template[0] = t0; > + strcpy(template+l-6, "XXXXXX"); > + } > + return -1; > +}
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.