Fix return value of str_vasprintf().
[pwmd.git] / src / mem.c
bloba2e045fd8c0f782e7a46df58ec6bcc2ceba21b96
1 /*
2 Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,
3 2016, 2017
4 Ben Kibbey <bjk@luxsci.net>
6 This file is part of pwmd.
8 Pwmd is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
13 Pwmd is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with Pwmd. If not, see <http://www.gnu.org/licenses/>.
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <string.h>
29 #include <stddef.h>
31 #include "mem.h"
33 void *
34 xrealloc_gpgrt (void *p, size_t n)
36 if (!n)
38 xfree (p);
39 return NULL;
42 if (!p)
43 return xmalloc (n);
45 return xrealloc (p, n);
48 #ifndef MEM_DEBUG
49 struct memchunk_s
51 size_t size;
52 char data[1];
53 } __attribute ((packed));
55 void
56 xfree (void *ptr)
58 struct memchunk_s *m;
59 void *p;
61 if (!ptr)
62 return;
64 m = (struct memchunk_s *)((char *)ptr-(offsetof (struct memchunk_s, data)));
65 p = (void *)((char *)m+(offsetof (struct memchunk_s, data)));
66 wipememory (p, 0, m->size);
67 free (m);
70 void *
71 xmalloc (size_t size)
73 struct memchunk_s *m;
75 if (!size)
76 return NULL;
78 m = malloc (sizeof (struct memchunk_s)+size);
79 if (!m)
80 return NULL;
82 m->size = size;
83 return (void *)((char *)m+(offsetof (struct memchunk_s, data)));
86 void *
87 xcalloc (size_t nmemb, size_t size)
89 void *p;
90 struct memchunk_s *m;
92 m = malloc (sizeof (struct memchunk_s)+(nmemb*size));
93 if (!m)
94 return NULL;
96 m->size = nmemb*size;
97 p = (void *)((char *)m+(offsetof (struct memchunk_s, data)));
98 memset (p, 0, m->size);
99 return p;
102 void *
103 xrealloc (void *ptr, size_t size)
105 void *p, *np;
106 struct memchunk_s *m, *mp;
107 size_t n;
109 if (!size && ptr)
111 m = (struct memchunk_s *)((char *)ptr-(offsetof (struct memchunk_s, data)));
112 p = (void *)((char *)m+(offsetof (struct memchunk_s, data)));
113 wipememory (p, 0, m->size);
114 free (m);
115 return NULL;
117 else if (!ptr)
118 return xmalloc (size);
120 m = malloc (sizeof (struct memchunk_s)+size);
121 if (!m)
122 return NULL;
124 m->size = size;
125 np = (void *)((char *)m+(offsetof (struct memchunk_s, data)));
127 mp = (struct memchunk_s *)((char *)ptr-(offsetof (struct memchunk_s, data)));
128 p = (void *)((char *)mp+(offsetof (struct memchunk_s, data)));
130 n = size > mp->size ? mp->size : size;
131 memcpy (np, p, n);
132 wipememory (p, 0, mp->size);
134 free (mp);
135 return (void *)((char *)m+(offsetof (struct memchunk_s, data)));
138 #endif