p11_mmap *
p11_mmap_open (const char *path,
+ struct stat *sb,
void **data,
size_t *size)
{
- struct stat sb;
+ struct stat stb;
p11_mmap *map;
map = calloc (1, sizeof (p11_mmap));
return NULL;
}
- if (fstat (map->fd, &sb) < 0) {
+ if (sb == NULL) {
+ sb = &stb;
+ if (fstat (map->fd, &stb) < 0) {
+ close (map->fd);
+ free (map);
+ return NULL;
+ }
+ }
+
+ /* Workaround for broken ZFS on Linux */
+ if (S_ISDIR (sb->st_mode)) {
+ errno = EISDIR;
close (map->fd);
free (map);
return NULL;
}
- map->size = sb.st_size;
+ map->size = sb->st_size;
map->data = mmap (NULL, map->size, PROT_READ, MAP_PRIVATE, map->fd, 0);
if (map->data == NULL) {
close (map->fd);
p11_mmap *
p11_mmap_open (const char *path,
+ struct stat *sb,
void **data,
size_t *size)
{
return NULL;
}
- if (!GetFileSizeEx (map->file, &large)) {
- errn = GetLastError ();
- CloseHandle (map->file);
- free (map);
- SetLastError (errn);
- if (errn == ERROR_ACCESS_DENIED)
- errno = EPERM;
- return NULL;
+ if (sb == NULL) {
+ if (!GetFileSizeEx (map->file, &large)) {
+ errn = GetLastError ();
+ CloseHandle (map->file);
+ free (map);
+ SetLastError (errn);
+ if (errn == ERROR_ACCESS_DENIED)
+ errno = EPERM;
+ return NULL;
+ }
+ } else {
+ large.QuadPart = sb->st_size;
}
mapping = CreateFileMapping (map->file, NULL, PAGE_READONLY, 0, 0, NULL);
#include "config.h"
#include <sys/types.h>
+#include <sys/stat.h>
#ifdef _GNU_SOURCE
#error Make the crap stop. _GNU_SOURCE is completely unportable and breaks all sorts of behavior
typedef struct _p11_mmap p11_mmap;
p11_mmap * p11_mmap_open (const char *path,
+ struct stat *sb,
void **data,
size_t *size);
typedef struct _p11_mmap p11_mmap;
p11_mmap * p11_mmap_open (const char *path,
+ struct stat *sb,
void **data,
size_t *size);
ssize_t written;
size_t size;
- mmap = p11_mmap_open (input, (void **)&data, &size);
+ mmap = p11_mmap_open (input, NULL, (void **)&data, &size);
assert (mmap != NULL);
while (size > 0) {
[AC_MSG_ERROR([could not find nanosleep])])
# These are thngs we can work around
- AC_CHECK_MEMBERS([struct dirent.d_type],,,[#include <dirent.h>])
AC_CHECK_FUNCS([getprogname getexecname basename mkstemp mkdtemp])
AC_CHECK_FUNCS([getauxval issetugid getresuid])
AC_CHECK_FUNCS([strnstr memdup strndup strerror_r])
}
p11_dict *
-_p11_conf_parse_file (const char* filename, int flags)
+_p11_conf_parse_file (const char* filename,
+ struct stat *sb,
+ int flags)
{
p11_dict *map = NULL;
void *data;
p11_debug ("reading config file: %s", filename);
- mmap = p11_mmap_open (filename, &data, &length);
+ mmap = p11_mmap_open (filename, sb, &data, &length);
if (mmap == NULL) {
error = errno;
if ((flags & CONF_IGNORE_MISSING) &&
*/
/* Load the main configuration */
- config = _p11_conf_parse_file (system_conf, CONF_IGNORE_MISSING);
+ config = _p11_conf_parse_file (system_conf, NULL, CONF_IGNORE_MISSING);
if (!config)
goto finished;
/* Load up the user configuration, ignore selinux denying us access */
flags = CONF_IGNORE_MISSING | CONF_IGNORE_ACCESS_DENIED;
- uconfig = _p11_conf_parse_file (path, flags);
+ uconfig = _p11_conf_parse_file (path, NULL, flags);
if (!uconfig) {
error = errno;
goto finished;
static bool
load_config_from_file (const char *configfile,
+ struct stat *sb,
const char *name,
p11_dict *configs,
int flags)
return_val_if_fail (key != NULL, false);
}
- config = _p11_conf_parse_file (configfile, flags);
+ config = _p11_conf_parse_file (configfile, sb, flags);
if (!config) {
free (key);
return false;
path = p11_path_build (directory, dp->d_name, NULL);
return_val_if_fail (path != NULL, false);
-#ifdef HAVE_STRUCT_DIRENT_D_TYPE
- if(dp->d_type != DT_UNKNOWN) {
- is_dir = (dp->d_type == DT_DIR);
- } else
-#endif
- {
- if (stat (path, &st) < 0) {
- error = errno;
- p11_message_err (error, "couldn't stat path: %s", path);
- free (path);
- break;
- }
- is_dir = S_ISDIR (st.st_mode);
+ if (stat (path, &st) < 0) {
+ error = errno;
+ p11_message_err (error, "couldn't stat path: %s", path);
+ free (path);
+ break;
}
- if (!is_dir && !load_config_from_file (path, dp->d_name, configs, flags)) {
+ is_dir = S_ISDIR (st.st_mode);
+
+ if (!is_dir && !load_config_from_file (path, &st, dp->d_name, configs, flags)) {
error = errno;
free (path);
break;
p11_dict *defaults);
/* Returns a hash of char *key -> char *value */
-p11_dict * _p11_conf_parse_file (const char *filename,
+p11_dict * _p11_conf_parse_file (const char *filename,
+ struct stat *sb,
int flags);
/* Returns a hash of char *key -> char *value */
p11_dict *map;
const char *value;
- map = _p11_conf_parse_file (SRCDIR "/files/test-1.conf", 0);
+ map = _p11_conf_parse_file (SRCDIR "/files/test-1.conf", NULL, 0);
assert_ptr_not_null (map);
value = p11_dict_get (map, "key1");
{
p11_dict *map;
- map = _p11_conf_parse_file (SRCDIR "/files/non-existant.conf", CONF_IGNORE_MISSING);
+ map = _p11_conf_parse_file (SRCDIR "/files/non-existant.conf", NULL, CONF_IGNORE_MISSING);
assert_ptr_not_null (map);
assert_num_eq (0, p11_dict_size (map));
{
p11_dict *map;
- map = _p11_conf_parse_file (SRCDIR "/files/non-existant.conf", 0);
+ map = _p11_conf_parse_file (SRCDIR "/files/non-existant.conf", NULL, 0);
assert (map == NULL);
assert_ptr_not_null (p11_message_last ());
}
NULL);
for (i = 0; i < nfiles; i++) {
- ret = p11_parse_file (parser, files[i], P11_PARSE_FLAG_ANCHOR);
+ ret = p11_parse_file (parser, files[i], NULL, P11_PARSE_FLAG_ANCHOR);
switch (ret) {
case P11_PARSE_SUCCESS:
break;
int
p11_parse_file (p11_parser *parser,
const char *filename,
+ struct stat *sb,
int flags)
{
p11_mmap *map;
return_val_if_fail (parser != NULL, P11_PARSE_FAILURE);
return_val_if_fail (filename != NULL, P11_PARSE_FAILURE);
- map = p11_mmap_open (filename, &data, &size);
+ map = p11_mmap_open (filename, sb, &data, &size);
if (map == NULL) {
p11_message_err (errno, "couldn't open and map file: %s", filename);
return P11_PARSE_FAILURE;
int p11_parse_file (p11_parser *parser,
const char *filename,
+ struct stat *sb,
int flags);
p11_array * p11_parser_parsed (p11_parser *parser);
p11_dict *cache)
{
struct dirent *dp;
+ struct stat st;
p11_dict *remove;
p11_dictiter iter;
char *path;
DIR *dir;
- int skip;
bool ret;
/* First we load all the modules */
if (asprintf (&path, "%s/%s", directory, dp->d_name) < 0)
return_val_if_reached (false);
-#ifdef HAVE_STRUCT_DIRENT_D_TYPE
- if(dp->d_type != DT_UNKNOWN) {
- skip = (dp->d_type == DT_DIR);
- } else
-#endif
- {
- struct stat st;
-
- skip = (stat (path, &st) < 0) || S_ISDIR (st.st_mode);
- }
- if (!skip) {
+ if (stat (path, &st) >= 0 && !S_ISDIR (st.st_mode)) {
if (!p11_dict_set (remove, path, path))
return_val_if_reached (false);
} else {
ret = asn1_create_element (definitions, argv[1], &cert);
err_if_fail (ret, "Certificate");
- map = p11_mmap_open (argv[3], &data, &size);
+ map = p11_mmap_open (argv[3], NULL, &data, &size);
if (map == NULL) {
fprintf (stderr, "couldn't open file: %s\n", argv[3]);
return 1;
/* The expected file name */
path = p11_path_build (test.directory, "yay.p11-kit", NULL);
p11_parser_formats (test.parser, p11_parser_format_persist, NULL);
- ret = p11_parse_file (test.parser, path, 0);
+ ret = p11_parse_file (test.parser, path, NULL, 0);
assert_num_eq (ret, P11_PARSE_SUCCESS);
free (path);
/* The expected file name */
path = p11_path_build (test.directory, "yay.p11-kit", NULL);
- ret = p11_parse_file (test.parser, path, 0);
+ ret = p11_parse_file (test.parser, path, NULL, 0);
assert_num_eq (ret, P11_PARSE_SUCCESS);
free (path);
};
p11_parser_formats (test.parser, p11_parser_format_x509, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3.der",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3.der", NULL,
P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_SUCCESS, ret);
};
p11_parser_formats (test.parser, p11_parser_format_pem, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3.pem",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3.pem", NULL,
P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_SUCCESS, ret);
};
p11_parser_formats (test.parser, p11_parser_format_persist, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/input/verisign-v1.p11-kit",
+ ret = p11_parse_file (test.parser, SRCDIR "/input/verisign-v1.p11-kit", NULL,
P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_SUCCESS, ret);
int i;
p11_parser_formats (test.parser, p11_parser_format_pem, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3-trusted.pem",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3-trusted.pem", NULL,
P11_PARSE_FLAG_ANCHOR);
assert_num_eq (P11_PARSE_SUCCESS, ret);
* so we parse this as an anchor, but expect it to be blacklisted
*/
p11_parser_formats (test.parser, p11_parser_format_pem, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/distrusted.pem",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/distrusted.pem", NULL,
P11_PARSE_FLAG_ANCHOR);
assert_num_eq (P11_PARSE_SUCCESS, ret);
int ret;
p11_parser_formats (test.parser, p11_parser_format_x509, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3.der",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/cacert3.der", NULL,
P11_PARSE_FLAG_ANCHOR);
assert_num_eq (P11_PARSE_SUCCESS, ret);
};
p11_parser_formats (test.parser, p11_parser_format_pem, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/thawte.pem",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/thawte.pem", NULL,
P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_SUCCESS, ret);
p11_message_quiet ();
p11_parser_formats (test.parser, p11_parser_format_x509, NULL);
- ret = p11_parse_file (test.parser, "/nonexistant",
+ ret = p11_parse_file (test.parser, "/nonexistant", NULL,
P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_FAILURE, ret);
p11_message_quiet ();
p11_parser_formats (test.parser, p11_parser_format_x509, NULL);
- ret = p11_parse_file (test.parser, SRCDIR "/files/unrecognized-file.txt",
+ ret = p11_parse_file (test.parser, SRCDIR "/files/unrecognized-file.txt", NULL,
P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_UNRECOGNIZED, ret);
assert_ptr_not_null (parser);
p11_parser_formats (parser, p11_parser_format_x509, NULL);
- ret = p11_parse_file (parser, SRCDIR "/files/cacert3.der", P11_PARSE_FLAG_NONE);
+ ret = p11_parse_file (parser, SRCDIR "/files/cacert3.der", NULL, P11_PARSE_FLAG_NONE);
assert_num_eq (P11_PARSE_SUCCESS, ret);
/* Should have gotten certificate */
{
p11_token *token;
- token = p11_token_new (333, "/", "Label");
- assert (!p11_token_is_writable (token));
- p11_token_free (token);
+ if (getuid () != 0) {
+ token = p11_token_new (333, "/", "Label");
+ assert (!p11_token_is_writable (token));
+ p11_token_free (token);
+ }
token = p11_token_new (333, "", "Label");
assert (!p11_token_is_writable (token));
/* The expected file name */
path = p11_path_build (test.directory, "Yay_.p11-kit", NULL);
- ret = p11_parse_file (test.parser, path, 0);
+ ret = p11_parse_file (test.parser, path, NULL, 0);
assert_num_eq (ret, P11_PARSE_SUCCESS);
free (path);
/* The expected file name */
path = p11_path_build (test.directory, "data.p11-kit", NULL);
- ret = p11_parse_file (test.parser, path, 0);
+ ret = p11_parse_file (test.parser, path, NULL, 0);
assert_num_eq (ret, P11_PARSE_SUCCESS);
free (path);
else if (strcmp (filename, token->path) == 0 && !S_ISDIR (sb->st_mode))
flags = P11_PARSE_FLAG_ANCHOR;
- ret = p11_parse_file (token->parser, filename, flags);
+ ret = p11_parse_file (token->parser, filename, sb, flags);
switch (ret) {
case P11_PARSE_SUCCESS: