1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2017 Jason King
  14  */
  15 
  16 #include <sys/debug.h>
  17 #include <stdlib.h>
  18 #include <string.h>
  19 #include "demangle-sys.h"
  20 #include "demangle_int.h"
  21 
  22 void *
  23 zalloc(sysdem_ops_t *ops, size_t len)
  24 {
  25         void *p = ops->alloc(len);
  26 
  27         if (p != NULL)
  28                 (void) memset(p, 0, len);
  29 
  30 #ifdef DEBUG
  31         /*
  32          * In normal operation, we should never exhaust memory.  Either
  33          * something's wrong, or the system is so hosed that aborting
  34          * shouldn't hurt anything, and it gives us a more useful stack
  35          * trace.
  36          */
  37         if (p == NULL)
  38                 abort();
  39 #endif
  40 
  41         return (p);
  42 }
  43 
  44 void
  45 xfree(sysdem_ops_t *ops, void *p, size_t len)
  46 {
  47         if (p == NULL || len == 0)
  48                 return;
  49 
  50         ops->free(p, len);
  51 }
  52 
  53 void *
  54 xrealloc(sysdem_ops_t *ops, void *p, size_t oldsz, size_t newsz)
  55 {
  56         if (newsz == oldsz)
  57                 return (p);
  58 
  59         VERIFY3U(newsz, >, oldsz);
  60 
  61         void *temp = zalloc(ops, newsz);
  62 
  63         if (temp == NULL)
  64                 return (NULL);
  65 
  66         if (oldsz > 0) {
  67                 (void) memcpy(temp, p, oldsz);
  68                 xfree(ops, p, oldsz);
  69         }
  70 
  71         return (temp);
  72 }
  73 
  74 /*ARGSUSED*/
  75 static void
  76 def_free(void *p, size_t len)
  77 {
  78         free(p);
  79 }
  80 
  81 static sysdem_ops_t i_sysdem_ops_default = {
  82         .alloc = malloc,
  83         .free = def_free
  84 };
  85 sysdem_ops_t *sysdem_ops_default = &i_sysdem_ops_default;