From 6b79eb38ba46a7635a635623b91c2e3aa9326c7d Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Wed, 29 Feb 2012 15:58:51 +0100 Subject: [PATCH] lib: add fileutils function collection The fileutils contains xmkstemp function will create temporary file safe and reusable manner. Reference: http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO.html#TEMPORARY-FILES CC: Davidlohr Bueso Signed-off-by: Sami Kerola --- include/Makefile.am | 5 +++-- include/fileutils.h | 6 +++++ lib/Makefile.am | 2 ++ lib/fileutils.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 include/fileutils.h create mode 100644 lib/fileutils.c diff --git a/include/Makefile.am b/include/Makefile.am index 4f5453f66..5e4e54ee8 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -11,6 +11,7 @@ dist_noinst_HEADERS = \ crc32.h \ env.h \ exitcodes.h \ + fileutils.h \ fsprobe.h \ ismounted.h \ linux_reboot.h \ @@ -38,5 +39,5 @@ dist_noinst_HEADERS = \ wholedisk.h \ widechar.h \ writeall.h \ - xgetpass.h \ - xalloc.h + xalloc.h \ + xgetpass.h diff --git a/include/fileutils.h b/include/fileutils.h new file mode 100644 index 000000000..27b566190 --- /dev/null +++ b/include/fileutils.h @@ -0,0 +1,6 @@ +#ifndef UTIL_LINUX_FILEUTILS +#define UTIL_LINUX_FILEUTILS + +extern FILE * xmkstemp(char **tmpname); + +#endif diff --git a/lib/Makefile.am b/lib/Makefile.am index 19a00f5c9..c34481de3 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -6,6 +6,7 @@ noinst_PROGRAMS = \ test_at \ test_blkdev \ test_canonicalize \ + test_fileutils \ test_ismounted \ test_mangle \ test_procutils \ @@ -45,6 +46,7 @@ test_loopdev_SOURCES = \ test_loopdev_CFLAGS = -DTEST_PROGRAM_LOOPDEV endif +test_fileutils_SOURCES = fileutils.c test_tt_SOURCES = tt.c $(top_srcdir)/lib/mbsalign.c test_canonicalize_SOURCES = canonicalize.c diff --git a/lib/fileutils.c b/lib/fileutils.c new file mode 100644 index 000000000..ed97967a3 --- /dev/null +++ b/lib/fileutils.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2012 Sami Kerola + */ + +#include +#include +#include +#include + +#include "c.h" +#include "pathnames.h" + +/* Create open temporary file in safe way. Please notice that the + * file permissions are -rw------- by default. */ +FILE *xmkstemp(char **tmpname) +{ + char *localtmp; + char *tmpenv; + mode_t old_mode; + int fd; + FILE *ret; + + tmpenv = getenv("TMPDIR"); + if (tmpenv) + asprintf(&localtmp, "%s/%s.XXXXXX", tmpenv, + program_invocation_short_name); + else + asprintf(&localtmp, "%s/%s.XXXXXX", _PATH_TMP, + program_invocation_short_name); + old_mode = umask(077); + fd = mkstemp(localtmp); + umask(old_mode); + if (fd == -1) + return NULL; + if (!(ret = fdopen(fd, "w+"))) + goto err; + *tmpname = localtmp; + return ret; + err: + close(fd); + return NULL; +} + +#ifdef TEST_PROGRAM +int main(void) +{ + FILE *f; + char *tmpname; + f = xmkstemp(&tmpname); + unlink(tmpname); + free(tmpname); + fclose(f); + return EXIT_FAILURE; +} +#endif