1.1 --- a/librazor/util.c Thu Feb 09 20:42:08 2012 +0000
1.2 +++ b/librazor/util.c Wed Aug 20 18:57:52 2014 +0100
1.3 @@ -1,7 +1,7 @@
1.4 /*
1.5 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
1.6 * Copyright (C) 2008 Red Hat, Inc
1.7 - * Copyright (C) 2009, 2011 J. Ali Harlow <ali@juiblex.co.uk>
1.8 + * Copyright (C) 2009, 2011, 2012 J. Ali Harlow <ali@juiblex.co.uk>
1.9 *
1.10 * This program is free software; you can redistribute it and/or modify
1.11 * it under the terms of the GNU General Public License as published by
1.12 @@ -52,54 +52,70 @@
1.13 char *program_name = "librazor";
1.14
1.15 void *
1.16 -razor_file_get_contents(const char *filename, size_t *length)
1.17 +zalloc(size_t size)
1.18 +{
1.19 + void *p;
1.20 +
1.21 + p = malloc(size);
1.22 + memset(p, 0, size);
1.23 +
1.24 + return p;
1.25 +}
1.26 +
1.27 +void *
1.28 +razor_file_get_contents(const char *filename, size_t *length, int private,
1.29 + struct razor_error **error)
1.30 {
1.31 int fd;
1.32 struct stat st;
1.33 - void *addr;
1.34 -#if !HAVE_SYS_MMAN_H
1.35 + void *addr = NULL;
1.36 size_t nb;
1.37 ssize_t res;
1.38 -#endif
1.39
1.40 fd = open(filename, O_RDONLY | O_BINARY);
1.41 - if (fd < 0)
1.42 + if (fd < 0) {
1.43 + razor_set_error(error, filename, strerror(errno));
1.44 return NULL;
1.45 + }
1.46
1.47 if (fstat(fd, &st) < 0) {
1.48 + razor_set_error(error, filename, strerror(errno));
1.49 close(fd);
1.50 return NULL;
1.51 }
1.52
1.53 *length = st.st_size;
1.54 #if HAVE_SYS_MMAN_H
1.55 - addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
1.56 -#else
1.57 - addr = malloc(st.st_size);
1.58 - if (addr) {
1.59 - nb = 0;
1.60 - while(nb < st.st_size) {
1.61 - res = read(fd, addr + nb, st.st_size - nb);
1.62 - if (res <= 0) {
1.63 - free(addr);
1.64 - addr = NULL;
1.65 - break;
1.66 - }
1.67 - nb += res;
1.68 - }
1.69 + if (!private) {
1.70 + addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
1.71 + if (addr == MAP_FAILED)
1.72 + addr = NULL;
1.73 }
1.74 #endif
1.75 + if (!addr) {
1.76 + addr = malloc(st.st_size);
1.77 + if (addr) {
1.78 + nb = 0;
1.79 + while(nb < st.st_size) {
1.80 + res = read(fd, addr + nb, st.st_size - nb);
1.81 + if (res <= 0) {
1.82 + razor_set_error(error, filename,
1.83 + strerror(errno));
1.84 + free(addr);
1.85 + addr = NULL;
1.86 + break;
1.87 + }
1.88 + nb += res;
1.89 + }
1.90 + } else
1.91 + razor_set_error(error, NULL, "Not enough memory");
1.92 + }
1.93 close(fd);
1.94
1.95 -#if HAVE_SYS_MMAN_H
1.96 - if (addr == MAP_FAILED)
1.97 - addr = NULL;
1.98 -#endif
1.99 -
1.100 return addr;
1.101 }
1.102
1.103 -razor_file_free_contents(void *addr, size_t length)
1.104 +int razor_file_free_contents(void *addr, size_t length)
1.105 {
1.106 #if HAVE_SYS_MMAN_H
1.107 return munmap(addr, length);