Evil : move mkstemp(s) and mkdtemp in eina_file directly

Summary:
Also replace all mkstemp(s) and mkdtemp with the eina_file functions in
the source

Test Plan: run eina_file test

Reviewers: raster

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D12170
This commit is contained in:
Vincent Torri 2020-10-08 11:58:11 +01:00 committed by Carsten Haitzler (Rasterman)
parent 509e3fcc7a
commit eacee53c2e
18 changed files with 361 additions and 401 deletions

View File

@ -17,46 +17,46 @@ main(void)
const char *key = "This is a crypto key";
const char *key_bad = "This is another crypto key";
char *file = strdup("/tmp/eet_cipher_example_XXXXXX");
Eet_File *ef;
char *test;
int size;
int tmpfd;
Eina_Tmpstr *tmpf = NULL;
eet_init();
if (-1 == (tmpfd = mkstemp(file)) || !!close(tmpfd))
if (-1 == (tmpfd = eina_file_mkstemp("eet_cipher_example_XXXXXX", &tmpf)) || !!close(tmpfd))
{
fprintf(
stderr, "ERROR: could not create temporary file (%s) : %s\n",
file, strerror(errno));
tmpf, strerror(errno));
goto panic;
}
/* Crypt an eet file. */
ef = eet_open(file, EET_FILE_MODE_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_WRITE);
if (!ef)
{
fprintf(
stderr, "ERROR: could not access file (%s).\n", file);
stderr, "ERROR: could not access file (%s).\n", tmpf);
goto error;
}
if (!eet_write_cipher(ef, "keys/tests", buffer, strlen(buffer) + 1, 0, key))
{
fprintf(
stderr, "ERROR: could not access file (%s).\n", file);
stderr, "ERROR: could not access file (%s).\n", tmpf);
goto error;
}
eet_close(ef);
/* Decrypt an eet file. */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
if (!ef)
{
fprintf(
stderr, "ERROR: could not access file (%s).\n", file);
stderr, "ERROR: could not access file (%s).\n", tmpf);
goto error;
}
@ -65,7 +65,7 @@ main(void)
{
fprintf(
stderr, "ERROR: could decript contents on file %s, with key %s.\n",
file, key);
tmpf, key);
goto error;
}
@ -86,11 +86,11 @@ main(void)
eet_close(ef);
/* Decrypt an eet file, now using our BAD key!! */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
if (!ef)
{
fprintf(
stderr, "ERROR: could not access file (%s).\n", file);
stderr, "ERROR: could not access file (%s).\n", tmpf);
goto error;
}
@ -102,18 +102,19 @@ main(void)
fprintf(
stderr, "ERROR: something is wrong with the contents of %s, as"
" we accessed it with a different key and it decripted our"
" information right.\n", file);
" information right.\n", tmpf);
goto error;
}
eet_close(ef);
error:
if (unlink(file) != 0)
if (unlink(tmpf) != 0)
{
fprintf(
stderr, "ERROR: could not unlink file (%s).\n", file);
stderr, "ERROR: could not unlink file (%s)%d.\n", tmpf, errno);
}
eina_tmpstr_del(tmpf);
panic:
eet_shutdown();

View File

@ -310,7 +310,7 @@ class @beta Efl.Net.Dialer_Http extends Efl.Loop_Consumer implements Efl.Net.Dia
If a new, empty session is to be used, start with an
empty or non-existent file such as created with
mkstemp() or tmpfile(). Alternatively use an
eina_file_mkstemp() or tmpfile(). Alternatively use an
empty string ("") to store it in memory.
If you want to start from a pre-existing cookie jar

View File

@ -273,7 +273,7 @@ class @beta Efl.Net.Dialer_Websocket extends Efl.Loop_Consumer implements Efl.Ne
If a new, empty session is to be used, start with an
empty or non-existent file such as one created with
mkstemp() or tmpfile(). Alternatively use an
eina_file_mkstemp() or tmpfile(). Alternatively use an
empty string ("") to keep it in memory.
If you want to start from a pre-existent cookie jar

View File

@ -28,7 +28,7 @@
#include <errno.h>
#ifdef _WIN32
# include <evil_private.h> /* windows.h fcntl mkstemps mkdtemp */
# include <evil_private.h> /* windows.h */
#endif
#define COPY_BLOCKSIZE (4 * 1024 * 1024)
@ -993,98 +993,6 @@ eina_file_copy(const char *src, const char *dst, Eina_File_Copy_Flags flags, Ein
return success;
}
EAPI int
eina_file_mkstemp(const char *templatename, Eina_Tmpstr **path)
{
char buffer[PATH_MAX];
const char *XXXXXX = NULL, *sep;
int fd, len;
#ifndef _WIN32
mode_t old_umask;
#endif
EINA_SAFETY_ON_NULL_RETURN_VAL(templatename, -1);
sep = strchr(templatename, '/');
#ifdef _WIN32
if (!sep) sep = strchr(templatename, '\\');
#endif
if (sep)
{
len = eina_strlcpy(buffer, templatename, sizeof(buffer));
}
else
{
len = eina_file_path_join(buffer, sizeof(buffer),
eina_environment_tmp_get(), templatename);
}
/*
* Unix:
* Make sure temp file is created with secure permissions,
* http://man7.org/linux/man-pages/man3/mkstemp.3.html#NOTES
*
* Windows:
* no secure permissions anyway and the umask use below makes
* the file read-only.
*/
#ifndef _WIN32
old_umask = umask(S_IRWXG|S_IRWXO);
#endif
if ((XXXXXX = strstr(buffer, "XXXXXX.")) != NULL)
{
int suffixlen = buffer + len - XXXXXX - 6;
fd = mkstemps(buffer, suffixlen);
}
else
fd = mkstemp(buffer);
#ifndef _WIN32
umask(old_umask);
#endif
if (fd < 0)
{
if (path) *path = NULL;
return -1;
}
if (path) *path = eina_tmpstr_add(buffer);
return fd;
}
EAPI Eina_Bool
eina_file_mkdtemp(const char *templatename, Eina_Tmpstr **path)
{
char buffer[PATH_MAX];
char *tmpdirname, *sep;
EINA_SAFETY_ON_NULL_RETURN_VAL(templatename, EINA_FALSE);
sep = strchr(templatename, '/');
#ifdef _WIN32
if (!sep) sep = strchr(templatename, '\\');
#endif
if (sep)
{
eina_strlcpy(buffer, templatename, sizeof(buffer));
}
else
{
eina_file_path_join(buffer, sizeof(buffer),
eina_environment_tmp_get(), templatename);
}
tmpdirname = mkdtemp(buffer);
if (tmpdirname == NULL)
{
if (path) *path = NULL;
return EINA_FALSE;
}
if (path) *path = eina_tmpstr_add(tmpdirname);
return EINA_TRUE;
}
/*============================================================================*
* Global *
*============================================================================*/

View File

@ -1509,3 +1509,79 @@ skip3:
}
#endif
}
EAPI int
eina_file_mkstemp(const char *templatename, Eina_Tmpstr **path)
{
char buffer[PATH_MAX];
const char *XXXXXX = NULL, *sep;
int fd, len;
mode_t old_umask;
EINA_SAFETY_ON_NULL_RETURN_VAL(templatename, -1);
sep = strchr(templatename, '/');
if (sep)
{
len = eina_strlcpy(buffer, templatename, sizeof(buffer));
}
else
{
len = eina_file_path_join(buffer, sizeof(buffer),
eina_environment_tmp_get(), templatename);
}
/*
* Unix:
* Make sure temp file is created with secure permissions,
* http://man7.org/linux/man-pages/man3/mkstemp.3.html#NOTES
*/
old_umask = umask(S_IRWXG|S_IRWXO);
if ((XXXXXX = strstr(buffer, "XXXXXX.")) != NULL)
{
int suffixlen = buffer + len - XXXXXX - 6;
fd = mkstemps(buffer, suffixlen);
}
else
fd = mkstemp(buffer);
umask(old_umask);
if (fd < 0)
{
if (path) *path = NULL;
return -1;
}
if (path) *path = eina_tmpstr_add(buffer);
return fd;
}
EAPI Eina_Bool
eina_file_mkdtemp(const char *templatename, Eina_Tmpstr **path)
{
char buffer[PATH_MAX];
char *tmpdirname, *sep;
EINA_SAFETY_ON_NULL_RETURN_VAL(templatename, EINA_FALSE);
sep = strchr(templatename, '/');
if (sep)
{
eina_strlcpy(buffer, templatename, sizeof(buffer));
}
else
{
eina_file_path_join(buffer, sizeof(buffer),
eina_environment_tmp_get(), templatename);
}
tmpdirname = mkdtemp(buffer);
if (tmpdirname == NULL)
{
if (path) *path = NULL;
return EINA_FALSE;
}
if (path) *path = eina_tmpstr_add(tmpdirname);
return EINA_TRUE;
}

View File

@ -24,6 +24,7 @@
#include <sys/stat.h>
#include <evil_private.h>
#include <fcntl.h>
#include "eina_config.h"
#include "eina_private.h"
@ -397,6 +398,114 @@ _eina_file_sep_find(char *s)
return NULL;
}
static unsigned char _eina_file_random_uchar(unsigned char *c)
{
/*
* Helper function for mktemp.
*
* Only characters from 'a' to 'z' and '0' to '9' are considered
* because on Windows, file system is case insensitive. That means
* 36 possible values.
* To increase randomness, we consider the greatest multiple of 36
* within 255 : 7*36 = 252, that is, values from 0 to 251 and choose
* a random value in this interval.
*/
do {
BCryptGenRandom(_eina_bcrypt_provider, c, sizeof(UCHAR), 0);
} while (*c > 251);
*c = '0' + *c % 36;
if (*c > '9')
*c += 'a' - '9' - 1;
return *c;
}
static int
_eina_file_mkstemp_init(char *__template, size_t *length, int suffixlen)
{
if (!__template || (suffixlen < 0))
{
errno = EINVAL;
return 0;
}
*length = strlen(__template);
if ((*length < (6 + (size_t)suffixlen))
|| (strncmp(__template + *length - 6 - suffixlen, "XXXXXX", 6) != 0))
{
errno = EINVAL;
return 0;
}
return 1;
}
static void
_eina_file_tmpname(char *__template, size_t length, int suffixlen)
{
unsigned char *suffix;
suffix = (unsigned char *)(__template + length - 6 - suffixlen);
*suffix = _eina_file_random_uchar(suffix);
suffix++;
*suffix = _eina_file_random_uchar(suffix);
suffix++;
*suffix = _eina_file_random_uchar(suffix);
suffix++;
*suffix = _eina_file_random_uchar(suffix);
suffix++;
*suffix = _eina_file_random_uchar(suffix);
suffix++;
*suffix = _eina_file_random_uchar(suffix);
suffix++;
}
static int
_eina_file_mkstemps(char *__template, int suffixlen)
{
size_t length;
int i;
if (!_eina_file_mkstemp_init(__template, &length, suffixlen))
return -1;
for (i = 0; i < 32768; i++)
{
int fd;
_eina_file_tmpname(__template, length, suffixlen);
fd = _open(__template,
_O_RDWR | _O_BINARY | _O_CREAT | _O_EXCL,
_S_IREAD | _S_IWRITE);
if (fd >= 0)
return fd;
}
errno = EEXIST;
return -1;
}
static char *
_eina_file_mkdtemp(char *__template)
{
size_t length;
int i;
if (!_eina_file_mkstemp_init(__template, &length, 0))
return NULL;
for (i = 0; i < 32768; i++)
{
_eina_file_tmpname(__template, length, 0);
if (CreateDirectory(__template, NULL) == TRUE)
return __template;
}
return NULL;
}
/**
* @endcond
*/
@ -1093,3 +1202,70 @@ eina_file_statat(void *container EINA_UNUSED, Eina_File_Direct_Info *info, Eina_
return 0;
}
EAPI int
eina_file_mkstemp(const char *templatename, Eina_Tmpstr **path)
{
char buffer[PATH_MAX];
const char *XXXXXX = NULL, *sep;
int fd, len;
EINA_SAFETY_ON_NULL_RETURN_VAL(templatename, -1);
sep = strchr(templatename, '/');
if (!sep) sep = strchr(templatename, '\\');
if (sep)
{
len = eina_strlcpy(buffer, templatename, sizeof(buffer));
}
else
{
len = eina_file_path_join(buffer, sizeof(buffer),
eina_environment_tmp_get(), templatename);
}
if ((XXXXXX = strstr(buffer, "XXXXXX.")) != NULL)
fd = _eina_file_mkstemps(buffer, buffer + len - XXXXXX - 6);
else
fd = _eina_file_mkstemps(buffer, 0);
if (fd < 0)
{
if (path) *path = NULL;
return -1;
}
if (path) *path = eina_tmpstr_add(buffer);
return fd;
}
EAPI Eina_Bool
eina_file_mkdtemp(const char *templatename, Eina_Tmpstr **path)
{
char buffer[PATH_MAX];
char *tmpdirname, *sep;
EINA_SAFETY_ON_NULL_RETURN_VAL(templatename, EINA_FALSE);
sep = strchr(templatename, '/');
if (!sep) sep = strchr(templatename, '\\');
if (sep)
{
eina_strlcpy(buffer, templatename, sizeof(buffer));
}
else
{
eina_file_path_join(buffer, sizeof(buffer),
eina_environment_tmp_get(), templatename);
}
tmpdirname = _eina_file_mkdtemp(buffer);
if (tmpdirname == NULL)
{
if (path) *path = NULL;
return EINA_FALSE;
}
if (path) *path = eina_tmpstr_add(tmpdirname);
return EINA_TRUE;
}

View File

@ -120,6 +120,10 @@ EAPI Eina_Inlist *_eina_tracking = NULL;
extern Eina_Lock _sysmon_lock;
#endif
#ifdef _WIN32
BCRYPT_ALG_HANDLE _eina_bcrypt_provider;
#endif
/* place module init/shutdown functions here to avoid other modules
* calling them by mistake.
*/
@ -292,6 +296,10 @@ eina_init(void)
return ++_eina_main_count;
#ifdef _WIN32
if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&_eina_bcrypt_provider,
BCRYPT_RNG_ALGORITHM,
NULL, 0)))
return 0;
#else
int fd = open("/dev/urandom", O_RDONLY);
if (fd >= 0)
@ -397,6 +405,10 @@ eina_shutdown(void)
_mt_enabled = 0;
}
#endif
#ifdef _WIN32
BCryptCloseAlgorithmProvider(_eina_bcrypt_provider, 0);
#endif
}
return _eina_main_count;

View File

@ -25,6 +25,11 @@
#include <xlocale.h>
#endif
#ifdef _WIN32
# include <windows.h>
# include <bcrypt.h>
#endif
#include "eina_magic.h"
#include "eina_iterator.h"
#include "eina_accessor.h"
@ -152,6 +157,7 @@ Eina_Stringshare *eina_file_sanitize(const char *path);
void eina_freeq_main_set(Eina_FreeQ *fq);
#ifdef _WIN32
extern BCRYPT_ALG_HANDLE _eina_bcrypt_provider;
typedef _locale_t locale_t;
#endif
locale_t _eina_c_locale_get(void);
@ -159,4 +165,3 @@ locale_t _eina_c_locale_get(void);
#include "eina_inline_private.h"
#endif /* EINA_PRIVATE_H_ */

View File

@ -369,6 +369,11 @@ eina_ext_deps += [iconv]
execinfo = cc.find_library('execinfo', required: false)
eina_ext_deps += [execinfo]
if sys_windows == true
bcrypt = cc.find_library('bcrypt', required: true)
eina_ext_deps += [bcrypt]
endif
eina_lib = library('eina', eina_src,
c_args : package_c_args,
include_directories : config_dir,

View File

@ -76,115 +76,6 @@ unsetenv(const char *name)
* Files related functions
*
*/
static int
_mkstemp_init(char *__template, char **suffix, size_t *length, DWORD *val,
size_t suffixlen)
{
*length = strlen(__template);
if ((*length < (6 + suffixlen))
|| (strncmp(__template + *length - 6 - suffixlen, "XXXXXX", 6) != 0))
{
errno = EINVAL;
return 0;
}
*suffix = __template + *length - 6 - suffixlen;
*val = GetTickCount();
*val += GetCurrentProcessId();
return 1;
}
static int
_mkstemp(char *suffix, int val)
{
const char lookup[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
DWORD v = val;
suffix[0] = lookup[v % 62];
v /= 62;
suffix[1] = lookup[v % 62];
v /= 62;
suffix[2] = lookup[v % 62];
v /= 62;
suffix[3] = lookup[v % 62];
v /= 62;
suffix[4] = lookup[v % 62];
v /= 62;
suffix[5] = lookup[v % 62];
val += 7777;
return val;
}
EAPI char *
mkdtemp(char *__template)
{
char *suffix;
DWORD val;
size_t length;
int i;
if (!__template)
{
errno = EINVAL;
return NULL;
}
if (!_mkstemp_init(__template, &suffix, &length, &val, 0))
return NULL;
for (i = 0; i < 32768; i++)
{
val = _mkstemp(suffix, val);
if (_mkdir(__template) == 0)
return __template;
if (errno == EFAULT ||
errno == ENOSPC ||
errno == ENOMEM ||
errno == ENOENT ||
errno == ENOTDIR ||
errno == EPERM ||
errno == EROFS)
return NULL;
}
errno = EEXIST;
return NULL;
}
int
mkstemps(char *__template, int suffixlen)
{
char *suffix;
DWORD val;
size_t length;
int i;
if (!__template || (suffixlen < 0))
return 0;
if (!_mkstemp_init(__template, &suffix, &length, &val, (size_t) suffixlen))
return -1;
for (i = 0; i < 32768; i++)
{
int fd;
val = _mkstemp(suffix, val);
fd = _open(__template, _O_RDWR | _O_BINARY | _O_CREAT | _O_EXCL, _S_IREAD | _S_IWRITE);
if (fd >= 0)
return fd;
}
errno = EEXIST;
return -1;
}
char *
realpath(const char *file_name, char *resolved_name)

View File

@ -67,24 +67,6 @@ EAPI int unsetenv(const char *name);
*
*/
/**
* @brief create an unique temporary directory
*
* @since 1.8.0
*/
EAPI char *mkdtemp(char *__template);
/**
* @brief Create a unique temporary file name with a suffix.
*
* @param __template Template of the file to create.
* @param suffixlen Length of the suffix following the 'XXXXXX' placeholder.
* @return A file descriptor on success, -1 otherwise.
*
* @since 1.10.0
*/
EAPI int mkstemps(char *__template, int suffixlen);
/**
* @brief Return an absolute or full path name for a specified relative path name.
*

View File

@ -19,7 +19,7 @@ static void (*cb_func) (void *data);
static void *cb_data;
static Ecore_Exe *espeak = NULL;
static Ecore_Event_Handler *exe_exit_handler = NULL;
static char *tmpf = NULL;
static Eina_Tmpstr *tmpf = NULL;
static int tmpfd = -1;
static Eina_Bool
@ -32,7 +32,7 @@ _exe_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
if (tmpf)
{
unlink(tmpf);
free(tmpf);
eina_tmpstr_del(tmpf);
tmpf = NULL;
close(tmpfd);
tmpfd = -1;
@ -70,15 +70,12 @@ out_read(const char *txt)
{
if (!tmpf)
{
char buf[PATH_MAX];
mode_t cur_umask;
snprintf(buf, sizeof(buf), "/tmp/.elm-speak-XXXXXX");
cur_umask = umask(S_IRWXO | S_IRWXG);
tmpfd = mkstemp(buf);
tmpfd = eina_file_mkstemp("elm-speak-XXXXXX", &tmpf);
umask(cur_umask);
if (tmpfd >= 0) tmpf = strdup(buf);
else return;
if (tmpfd < 0) return;
}
if (write(tmpfd, txt, strlen(txt)) < 0) perror("write to tmpfile (espeak)");
}
@ -117,7 +114,7 @@ out_cancel(void)
if (tmpf)
{
unlink(tmpf);
free(tmpf);
eina_tmpstr_del(tmpf);
tmpf = NULL;
close(tmpfd);
tmpfd = -1;

View File

@ -19,15 +19,15 @@ EFL_START_TEST(eet_test_cipher_decipher_simple)
const char *key_bad = "This is another crypto key";
Eet_File *ef;
char *test;
char *file = strdup("/tmp/eet_suite_testXXXXXX");
Eina_Tmpstr *tmpf = NULL;
int size;
int tmpfd;
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
/* Crypt an eet file. */
ef = eet_open(file, EET_FILE_MODE_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_WRITE);
fail_if(!ef);
fail_if(!eet_write_cipher(ef, "keys/tests", buffer, strlen(buffer) + 1, 0,
@ -36,7 +36,7 @@ EFL_START_TEST(eet_test_cipher_decipher_simple)
eet_close(ef);
/* Decrypt an eet file. */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
test = eet_read_cipher(ef, "keys/tests", &size, key);
@ -48,7 +48,7 @@ EFL_START_TEST(eet_test_cipher_decipher_simple)
eet_close(ef);
/* Decrypt an eet file. */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
test = eet_read_cipher(ef, "keys/tests", &size, key_bad);
@ -58,7 +58,9 @@ EFL_START_TEST(eet_test_cipher_decipher_simple)
eet_close(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST

View File

@ -19,19 +19,17 @@ EFL_START_TEST(eet_test_file_simple_write)
Eet_Entry *entry;
Eet_File *ef;
char *test;
char *file;
void *m;
int size;
int tmpfd;
Eina_Tmpstr *tmpf = NULL;
file = strdup("/tmp/eet_suite_testXXXXXX");
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
fail_if(eet_mode_get(NULL) != EET_FILE_MODE_INVALID);
ef = eet_open(file, EET_FILE_MODE_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_WRITE);
fail_if(!ef);
fail_if(!eet_write(ef, "keys/tests", buffer, strlen(buffer) + 1, 1));
@ -46,7 +44,7 @@ EFL_START_TEST(eet_test_file_simple_write)
eet_close(ef);
/* Test read from buffer */
f = eina_file_open(file, EINA_FALSE);
f = eina_file_open(tmpf, EINA_FALSE);
fail_if(!f);
m = eina_file_map_all(f, EINA_FILE_WILLNEED);
@ -83,7 +81,7 @@ EFL_START_TEST(eet_test_file_simple_write)
eina_file_close(f);
/* Test read of simple file */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
test = eet_read(ef, "keys/tests", &size);
@ -105,7 +103,7 @@ EFL_START_TEST(eet_test_file_simple_write)
eet_close(ef);
/* Test eet cache system */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
test = eet_read(ef, "keys/tests", &size);
@ -116,8 +114,9 @@ EFL_START_TEST(eet_test_file_simple_write)
eet_close(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST
@ -128,14 +127,12 @@ EFL_START_TEST(eet_test_file_data)
Eet_Dictionary *ed;
Eet_File *ef;
char **list;
char *file;
Eet_Data_Descriptor_Class eddc;
Eet_Test_Ex_Type etbt;
int size;
int test;
int tmpfd;
file = strdup("/tmp/eet_suite_testXXXXXX");
Eina_Tmpstr *tmpf = NULL;
eet_test_ex_set(&etbt, 0);
etbt.list = eina_list_prepend(etbt.list, eet_test_ex_set(NULL, 1));
@ -165,14 +162,14 @@ EFL_START_TEST(eet_test_file_data)
eet_build_ex_descriptor(edd, EINA_FALSE);
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
/* Insert an error in etbt. */
etbt.i = 0;
/* Save the encoded data in a file. */
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_READ_WRITE);
fail_if(!ef);
fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
@ -193,7 +190,7 @@ EFL_START_TEST(eet_test_file_data)
/* Attempt to replace etbt by the correct one. */
etbt.i = EET_TEST_INT;
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_READ_WRITE);
fail_if(!ef);
fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
@ -207,7 +204,7 @@ EFL_START_TEST(eet_test_file_data)
eet_close(ef);
/* Read back the data. */
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_READ_WRITE);
fail_if(!ef);
fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY2, &etbt, 0));
@ -273,8 +270,9 @@ EFL_START_TEST(eet_test_file_data)
eet_close(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST
@ -286,11 +284,9 @@ EFL_START_TEST(eet_test_file_data_dump)
Eet_Test_Ex_Type etbt;
Eet_File *ef;
char *string1;
char *file;
int test;
int tmpfd;
file = strdup("/tmp/eet_suite_testXXXXXX");
Eina_Tmpstr *tmpf = NULL;
eet_test_ex_set(&etbt, 0);
etbt.list = eina_list_prepend(etbt.list, eet_test_ex_set(NULL, 1));
@ -318,11 +314,11 @@ EFL_START_TEST(eet_test_file_data_dump)
eet_build_ex_descriptor(edd, EINA_FALSE);
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
/* Save the encoded data in a file. */
ef = eet_open(file, EET_FILE_MODE_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_WRITE);
fail_if(!ef);
fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
@ -330,7 +326,7 @@ EFL_START_TEST(eet_test_file_data_dump)
eet_close(ef);
/* Use dump/undump in the middle */
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_READ_WRITE);
fail_if(!ef);
string1 = NULL;
@ -341,7 +337,7 @@ EFL_START_TEST(eet_test_file_data_dump)
eet_close(ef);
/* Test the correctness of the reinsertion. */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
result = eet_data_read(ef, edd, EET_TEST_FILE_KEY1);
@ -372,14 +368,14 @@ EFL_START_TEST(eet_test_file_data_dump)
fail_if(test != 0);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST
EFL_START_TEST(eet_test_file_fp)
{
char *file;
Eet_Data_Descriptor_Class eddc;
Eet_Data_Descriptor *edd_5FP;
Eet_Data_Descriptor *edd_5DBL;
@ -388,8 +384,7 @@ EFL_START_TEST(eet_test_file_fp)
Eet_5DBL *convert;
Eet_5FP *build;
int tmpfd;
file = strdup("/tmp/eet_suite_testXXXXXX");
Eina_Tmpstr *tmpf = NULL;
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_5FP);
edd_5FP = eet_data_descriptor_file_new(&eddc);
@ -415,10 +410,10 @@ EFL_START_TEST(eet_test_file_fp)
origin.f1 = eina_f32p32_int_from(1);
origin.f0 = 0;
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_READ_WRITE);
fail_if(!ef);
fail_if(!eet_data_write(ef, edd_5FP, EET_TEST_FILE_KEY1, &origin, 1));
@ -443,8 +438,9 @@ EFL_START_TEST(eet_test_file_fp)
eet_close(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST

View File

@ -60,18 +60,16 @@ EFL_START_TEST(eet_test_identity_simple)
Eet_Key *k;
FILE *noread;
char *test;
char *file;
int size;
int fd;
Eina_Tmpstr *tmpf = NULL;
file = strdup("/tmp/eet_suite_testXXXXXX");
fail_if(-1 == (fd = mkstemp(file)));
fail_if(-1 == (fd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(fd));
fail_if(!(noread = fopen("/dev/null", "wb")));
/* Sign an eet file. */
ef = eet_open(file, EET_FILE_MODE_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_WRITE);
fail_if(!ef);
fail_if(!eet_write(ef, "keys/tests", buffer, strlen(buffer) + 1, 0));
@ -85,7 +83,7 @@ EFL_START_TEST(eet_test_identity_simple)
eet_close(ef);
/* Open a signed file. */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
/* check that the certificates match */
@ -109,7 +107,7 @@ EFL_START_TEST(eet_test_identity_simple)
eet_clearcache();
/* Corrupting the file. */
fd = open(file, O_WRONLY | O_BINARY);
fd = open(tmpf, O_WRONLY | O_BINARY);
fail_if(fd < 0);
fail_if(lseek(fd, 200, SEEK_SET) != 200);
@ -122,11 +120,12 @@ EFL_START_TEST(eet_test_identity_simple)
close(fd);
/* Attempt to open a modified file. */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST

View File

@ -72,7 +72,6 @@ static const Eet_Test_Image test_alpha = {
EFL_START_TEST(eet_test_image_normal)
{
Eet_File *ef;
char *file;
unsigned int *data;
int compress;
int quality;
@ -82,14 +81,13 @@ EFL_START_TEST(eet_test_image_normal)
unsigned int w;
unsigned int h;
int tmpfd;
Eina_Tmpstr *tmpf = NULL;
file = strdup("/tmp/eet_suite_testXXXXXX");
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
/* Save the encoded data in a file. */
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_READ_WRITE);
fail_if(!ef);
result = eet_data_image_write(ef,
@ -219,7 +217,7 @@ EFL_START_TEST(eet_test_image_normal)
eet_close(ef);
/* Test read of image */
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
result = eet_data_image_header_read(ef,
@ -424,14 +422,14 @@ EFL_START_TEST(eet_test_image_normal)
eet_close(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST
EFL_START_TEST(eet_test_image_small)
{
char *file;
unsigned int image[4];
unsigned int *data;
Eet_File *ef;
@ -443,18 +441,17 @@ EFL_START_TEST(eet_test_image_small)
Eet_Image_Encoding lossy;
int result;
int tmpfd;
file = strdup("/tmp/eet_suite_testXXXXXX");
Eina_Tmpstr *tmpf = NULL;
image[0] = IM0;
image[1] = IM1;
image[2] = IM2;
image[3] = IM3;
fail_if(-1 == (tmpfd = mkstemp(file)));
fail_if(-1 == (tmpfd = eina_file_mkstemp("/tmp/eet_suite_testXXXXXX", &tmpf)));
fail_if(!!close(tmpfd));
ef = eet_open(file, EET_FILE_MODE_WRITE);
ef = eet_open(tmpf, EET_FILE_MODE_WRITE);
fail_if(!ef);
result = eet_data_image_write(ef, "/images/test", image, 2, 2, 1, 9, 100, 0);
@ -462,7 +459,7 @@ EFL_START_TEST(eet_test_image_small)
eet_close(ef);
ef = eet_open(file, EET_FILE_MODE_READ);
ef = eet_open(tmpf, EET_FILE_MODE_READ);
fail_if(!ef);
data = (unsigned int *)eet_data_image_read(ef,
@ -477,7 +474,7 @@ EFL_START_TEST(eet_test_image_small)
eet_close(ef);
fail_if(unlink(file) != 0);
fail_if(unlink(tmpf) != 0);
fail_if(data[0] != IM0);
fail_if(data[1] != IM1);
@ -486,6 +483,7 @@ EFL_START_TEST(eet_test_image_small)
free(data);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST

View File

@ -19,7 +19,6 @@ EFL_START_TEST(elua_api)
{
Elua_State *st;
lua_State *lst;
char buf[] = "tmpXXXXXX";
FILE *f;
int fd;
char *cargv[2];
@ -84,16 +83,16 @@ EFL_START_TEST(elua_api)
fail_if(lua_type(lst, -1) != LUA_TFUNCTION);
lua_pop(lst, 1);
fd = mkstemp(buf);
fd = eina_file_mkstemp("tmpXXXXXX", &tmpf);
fail_if(fd < 0);
f = fdopen(fd, "wb");
fail_if(!f);
fprintf(f, "return 5\n");
fclose(f);
fail_if(!elua_util_file_run(st, buf));
fail_if(!elua_util_file_run(st, tmpf));
fail_if(lua_tointeger(lst, -1) != 5);
lua_pop(lst, 1);
fail_if(remove(buf));
fail_if(remove(tmpf));
/* halfassed testing here, but not possible otherwise */
fail_if(elua_util_error_report(st, 0));
@ -101,21 +100,21 @@ EFL_START_TEST(elua_api)
fail_if(!elua_util_error_report(st, 5));
fail_if(lua_gettop(lst) > 0);
f = fopen(buf, "wb");
f = fopen(tmpf, "wb");
fail_if(!f);
fprintf(f, "return true");
fclose(f);
cargv[1] = buf;
cargv[1] = tmpf;
fail_if(!elua_util_script_run(st, 2, cargv, 1, &quit));
fail_if(quit != 1);
f = fopen(buf, "wb");
f = fopen(tmpf, "wb");
fail_if(!f);
fprintf(f, "return false");
fclose(f);
fail_if(!elua_util_script_run(st, 2, cargv, 1, &quit));
fail_if(quit != 0);
fail_if(remove(buf));
fail_if(remove(tmpf));
/* elua API here tries accessing files by relative path,
* prevent any unintentional file accesses in cwd
@ -139,6 +138,7 @@ EFL_START_TEST(elua_api)
lua_pop(lst, 1);
elua_state_free(st);
eina_tmpstr_del(tmpf);
}
EFL_END_TEST

View File

@ -169,86 +169,6 @@ EFL_START_TEST(evil_stdlib_unsetenv)
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkdtemp)
{
char template[] = "file_XXXXXX";
char *res;
res = mkdtemp(template);
fail_if(res == NULL);
fail_if(rmdir(res) < 0);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkdtemp_fail)
{
char template[] = "file_XXX";
char *res;
res = mkdtemp(template);
fail_if(res != NULL);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkstemp)
{
char template[] = "file_XXXXXX";
int fd;
fd = mkstemp(template);
fail_if(fd < 0);
fail_if(close(fd) == -1);
fail_if(unlink(template) == -1);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkstemp_fail)
{
char template[] = "file_XXX";
int fd;
fd = mkstemp(template);
fail_if(fd >= 0);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkstemps)
{
char template[] = "file_XXXXXX.ext";
int fd;
fd = mkstemps(template, 4);
fail_if(fd < 0);
fail_if(close(fd) == -1);
fail_if(unlink(template) == -1);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkstemps_fail_1)
{
char template[] = "file_XXX.ext";
int fd;
fd = mkstemps(template, 4);
fail_if(fd >= 0);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_mkstemps_fail_2)
{
char template[] = "file_XXX";
int fd;
fd = mkstemps(template, 4);
fail_if(fd >= 0);
}
EFL_END_TEST
EFL_START_TEST(evil_stdlib_realpath_1)
{
char buf[PATH_MAX];
@ -302,14 +222,6 @@ void evil_test_stdlib(TCase *tc)
tcase_add_test(tc, evil_stdlib_getenv_two_swapped);
tcase_add_test(tc, evil_stdlib_unsetenv);
tcase_add_test(tc, evil_stdlib_mkdtemp);
tcase_add_test(tc, evil_stdlib_mkdtemp_fail);
tcase_add_test(tc, evil_stdlib_mkstemp);
tcase_add_test(tc, evil_stdlib_mkstemp_fail);
tcase_add_test(tc, evil_stdlib_mkstemps);
tcase_add_test(tc, evil_stdlib_mkstemps_fail_1);
tcase_add_test(tc, evil_stdlib_mkstemps_fail_2);
tcase_add_test(tc, evil_stdlib_realpath_1);
tcase_add_test(tc, evil_stdlib_realpath_2);
tcase_add_test(tc, evil_stdlib_realpath_3);