Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright 2011 Tresys Technology, LLC. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are met:
      6  *
      7  *    1. Redistributions of source code must retain the above copyright notice,
      8  *       this list of conditions and the following disclaimer.
      9  *
     10  *    2. Redistributions in binary form must reproduce the above copyright notice,
     11  *       this list of conditions and the following disclaimer in the documentation
     12  *       and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
     15  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     16  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     17  * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     18  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     21  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     22  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  *
     25  * The views and conclusions contained in the software and documentation are those
     26  * of the authors and should not be interpreted as representing official policies,
     27  * either expressed or implied, of Tresys Technology, LLC.
     28  */
     29 
     30 #include <stdlib.h>
     31 #include <stdio.h>
     32 #include <string.h>
     33 
     34 #include "cil_log.h"
     35 
     36 __attribute__((noreturn)) void cil_default_mem_error_handler(void)
     37 {
     38 	cil_log(CIL_ERR, "Failed to allocate memory\n");
     39 	exit(1);
     40 }
     41 
     42 void (*cil_mem_error_handler)(void) = &cil_default_mem_error_handler;
     43 
     44 void cil_set_mem_error_handler(void (*handler)(void))
     45 {
     46 	cil_mem_error_handler = handler;
     47 }
     48 
     49 void *cil_malloc(size_t size)
     50 {
     51 	void *mem = malloc(size);
     52 	if (mem == NULL){
     53 		if (size == 0) {
     54 			return NULL;
     55 		}
     56 		(*cil_mem_error_handler)();
     57 	}
     58 
     59 	return mem;
     60 }
     61 
     62 void *cil_calloc(size_t num_elements, size_t element_size)
     63 {
     64 	void *mem = calloc(num_elements, element_size);
     65 	if (mem == NULL){
     66 		(*cil_mem_error_handler)();
     67 	}
     68 
     69 	return mem;
     70 }
     71 
     72 void *cil_realloc(void *ptr, size_t size)
     73 {
     74 	void *mem = realloc(ptr, size);
     75 	if (mem == NULL){
     76 		if (size == 0) {
     77 			return NULL;
     78 		}
     79 		(*cil_mem_error_handler)();
     80 	}
     81 
     82 	return mem;
     83 }
     84 
     85 
     86 char *cil_strdup(const char *str)
     87 {
     88 	char *mem = NULL;
     89 
     90 	if (str == NULL) {
     91 		return NULL;
     92 	}
     93 
     94 	mem = strdup(str);
     95 	if (mem == NULL) {
     96 		(*cil_mem_error_handler)();
     97 	}
     98 
     99 	return mem;
    100 }
    101