X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=cups%2Ftempfile.c;h=fb39802955292d6c3860a83633960b9b0fb059c4;hb=87030afb3aa8735848c66a0526d06af69d7010c6;hp=30cbc0cae078fe07cb2b57954faa9eae78a61f9a;hpb=5a738aeaea5c4dd9384a8601cc5c99be683b69ca;p=thirdparty%2Fcups.git diff --git a/cups/tempfile.c b/cups/tempfile.c index 30cbc0cae..fb3980295 100644 --- a/cups/tempfile.c +++ b/cups/tempfile.c @@ -1,41 +1,27 @@ /* - * "$Id: tempfile.c 6649 2007-07-11 21:46:42Z mike $" + * Temp file utilities for CUPS. * - * Temp file utilities for the Common UNIX Printing System (CUPS). + * Copyright © 2007-2018 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * - * Copyright 2007-2008 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * cupsTempFd() - Creates a temporary file. - * cupsTempFile() - Generates a temporary filename. - * cupsTempFile2() - Creates a temporary CUPS file. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* * Include necessary headers... */ -#include "globals.h" -#include "debug.h" +#include "cups-private.h" +#include "debug-internal.h" #include -#include #include #include -#if defined(WIN32) || defined(__EMX__) +#if defined(_WIN32) || defined(__EMX__) # include #else # include -#endif /* WIN32 || __EMX__ */ +#endif /* _WIN32 || __EMX__ */ /* @@ -52,24 +38,46 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ int fd; /* File descriptor for temp file */ int tries; /* Number of tries */ const char *tmpdir; /* TMPDIR environment var */ -#ifdef WIN32 - char tmppath[1024]; /* Windows temporary directory */ +#if defined(__APPLE__) || defined(_WIN32) + char tmppath[1024]; /* Temporary directory */ +#endif /* __APPLE__ || _WIN32 */ +#ifdef _WIN32 DWORD curtime; /* Current time */ #else struct timeval curtime; /* Current time */ -#endif /* WIN32 */ +#endif /* _WIN32 */ /* * See if TMPDIR is defined... */ -#ifdef WIN32 +#ifdef _WIN32 if ((tmpdir = getenv("TEMP")) == NULL) { - GetTempPath(sizeof(tmppath), tmppath); + GetTempPathA(sizeof(tmppath), tmppath); tmpdir = tmppath; } + +#elif defined(__APPLE__) + /* + * On macOS and iOS, the TMPDIR environment variable is not always the best + * location to place temporary files due to sandboxing. Instead, the confstr + * function should be called to get the proper per-user, per-process TMPDIR + * value. + */ + + if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK)) + tmpdir = NULL; + + if (!tmpdir) + { + if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath))) + tmpdir = tmppath; + else + tmpdir = "/private/tmp"; /* This should never happen */ + } + #else /* * Previously we put root temporary files in the default CUPS temporary @@ -79,12 +87,8 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ */ if ((tmpdir = getenv("TMPDIR")) == NULL) -# ifdef __APPLE__ - tmpdir = "/private/tmp"; /* /tmp is a symlink to /private/tmp */ -# else tmpdir = "/tmp"; -# endif /* __APPLE__ */ -#endif /* WIN32 */ +#endif /* _WIN32 */ /* * Make the temporary name using the specified directory... @@ -94,7 +98,7 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ do { -#ifdef WIN32 +#ifdef _WIN32 /* * Get the current time of day... */ @@ -105,8 +109,7 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ * Format a string using the hex time values... */ - snprintf(filename, len - 1, "%s/%05lx%08lx", tmpdir, - GetCurrentProcessId(), curtime); + snprintf(filename, (size_t)len - 1, "%s/%05lx%08lx", tmpdir, GetCurrentProcessId(), curtime); #else /* * Get the current time of day... @@ -118,23 +121,22 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ * Format a string using the hex time values... */ - snprintf(filename, len - 1, "%s/%08lx%05lx", tmpdir, - (unsigned long)curtime.tv_sec, (unsigned long)curtime.tv_usec); -#endif /* WIN32 */ + snprintf(filename, (size_t)len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(), (unsigned)(curtime.tv_sec + curtime.tv_usec + tries)); +#endif /* _WIN32 */ /* * Open the file in "exclusive" mode, making sure that we don't * stomp on an existing file or someone's symlink crack... */ -#ifdef WIN32 +#ifdef _WIN32 fd = open(filename, _O_CREAT | _O_RDWR | _O_TRUNC | _O_BINARY, _S_IREAD | _S_IWRITE); #elif defined(O_NOFOLLOW) fd = open(filename, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); #else fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600); -#endif /* WIN32 */ +#endif /* _WIN32 */ if (fd < 0 && errno != EEXIST) break; @@ -155,48 +157,22 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ * 'cupsTempFile()' - Generates a temporary filename. * * The temporary filename is returned in the filename buffer. - * This function is deprecated - use @link cupsTempFd@ or - * @link cupsTempFile2@ instead. + * This function is deprecated and will no longer generate a temporary + * filename - use @link cupsTempFd@ or @link cupsTempFile2@ instead. * * @deprecated@ */ -char * /* O - Filename or NULL on error */ +char * /* O - Filename or @code NULL@ on error */ cupsTempFile(char *filename, /* I - Pointer to buffer */ int len) /* I - Size of buffer */ { - int fd; /* File descriptor for temp file */ - _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ - - - /* - * See if a filename was specified... - */ - - if (filename == NULL) - { - filename = cg->tempfile; - len = sizeof(cg->tempfile); - } - - /* - * Create the temporary file... - */ - - if ((fd = cupsTempFd(filename, len)) < 0) - return (NULL); - - /* - * Close the temp file - it'll be reopened later as needed... - */ - - close(fd); + (void)len; - /* - * Return the temp filename... - */ + if (filename) + *filename = '\0'; - return (filename); + return (NULL); } @@ -206,10 +182,10 @@ cupsTempFile(char *filename, /* I - Pointer to buffer */ * The temporary filename is returned in the filename buffer. * The temporary file is opened for writing. * - * @since CUPS 1.2@ + * @since CUPS 1.2/macOS 10.5@ */ -cups_file_t * /* O - CUPS file or NULL on error */ +cups_file_t * /* O - CUPS file or @code NULL@ on error */ cupsTempFile2(char *filename, /* I - Pointer to buffer */ int len) /* I - Size of buffer */ { @@ -228,8 +204,3 @@ cupsTempFile2(char *filename, /* I - Pointer to buffer */ else return (file); } - - -/* - * End of "$Id: tempfile.c 6649 2007-07-11 21:46:42Z mike $". - */