/[imapfilter]/imapfilter/memory.c
ViewVC logotype

Annotation of /imapfilter/memory.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.22 - (hide annotations)
Sat Feb 14 19:14:43 2004 UTC (20 years, 1 month ago) by lefcha
Branch: MAIN
CVS Tags: HEAD
Changes since 1.21: +2 -1 lines
File MIME type: text/plain
Indentation.

1 lefcha 1.1 #include <stdlib.h>
2 lefcha 1.17 #include <stdlib.h>
3     #include <unistd.h>
4 lefcha 1.16 #include <string.h>
5 lefcha 1.1 #include <errno.h>
6 lefcha 1.21 #include <sys/types.h> /* For POSIX.1-2001 non-conformant systems. */
7     #include <sys/time.h> /* For POSIX.1-2001 non-conformant systems. */
8 lefcha 1.6 #include <sys/resource.h>
9    
10 lefcha 1.12 #include "config.h"
11 lefcha 1.1 #include "imapfilter.h"
12    
13 lefcha 1.4
14 lefcha 1.16 /* Secure memory information. */
15     typedef struct secmem {
16     void *buf; /* Allocated memory buffer. */
17     size_t size; /* Size of the buffer. */
18     struct secmem *prev, *next; /* Previous/next node of doubly linked
19     * list. */
20     } secmem_t;
21    
22    
23 lefcha 1.11 extern unsigned int options;
24 lefcha 1.13
25 lefcha 1.19 static secmem_t *secmem = NULL; /* First node of secure memory linked list. */
26 lefcha 1.16
27    
28 lefcha 1.19 void secmem_append(secmem_t * sm);
29 lefcha 1.16 secmem_t *secmem_find(void *ptr);
30 lefcha 1.19 void secmem_remove(secmem_t * sm);
31 lefcha 1.7
32 lefcha 1.6
33 lefcha 1.1 /*
34 lefcha 1.3 * A malloc() that checks the results and dies in case of error.
35 lefcha 1.1 */
36 lefcha 1.13 void *
37     xmalloc(size_t size)
38 lefcha 1.1 {
39 lefcha 1.13 void *ptr;
40 lefcha 1.2
41 lefcha 1.13 ptr = (void *)malloc(size);
42 lefcha 1.2
43 lefcha 1.13 if (ptr == NULL)
44 lefcha 1.19 fatal(ERROR_MEMALLOC,
45 lefcha 1.13 "allocating memory; %s\n", strerror(errno));
46 lefcha 1.2
47 lefcha 1.13 return ptr;
48 lefcha 1.1 }
49    
50    
51     /*
52 lefcha 1.3 * A realloc() that checks the results and dies in case of error.
53     */
54 lefcha 1.13 void *
55     xrealloc(void *ptr, size_t size)
56 lefcha 1.3 {
57 lefcha 1.13 ptr = (void *)realloc(ptr, size);
58 lefcha 1.3
59 lefcha 1.13 if (ptr == NULL)
60 lefcha 1.19 fatal(ERROR_MEMALLOC,
61 lefcha 1.13 "allocating memory; %s\n", strerror(errno));
62 lefcha 1.3
63 lefcha 1.13 return ptr;
64 lefcha 1.3 }
65    
66    
67     /*
68 lefcha 1.5 * A free() that dies if fed with NULL pointer.
69     */
70 lefcha 1.13 void
71     xfree(void *ptr)
72 lefcha 1.5 {
73 lefcha 1.20
74 lefcha 1.13 if (ptr == NULL)
75 lefcha 1.19 fatal(ERROR_MEMALLOC,
76 lefcha 1.13 "NULL pointer given as argument");
77     free(ptr);
78 lefcha 1.5 }
79    
80    
81     /*
82 lefcha 1.3 * A strdup() that checks the results and dies in case of error.
83 lefcha 1.1 */
84 lefcha 1.13 char *
85     xstrdup(const char *s)
86 lefcha 1.1 {
87 lefcha 1.13 char *cp;
88 lefcha 1.2
89 lefcha 1.13 cp = strdup(s);
90 lefcha 1.2
91 lefcha 1.13 if (cp == NULL)
92 lefcha 1.22 fatal(ERROR_MEMALLOC, "allocating memory; %s\n",
93     strerror(errno));
94 lefcha 1.2
95 lefcha 1.13 return cp;
96 lefcha 1.6 }
97    
98    
99     /*
100     * Secure memory malloc(). Locks memory and keeps information about the
101     * chunk that was allocated.
102     */
103 lefcha 1.13 void *
104     smalloc(size_t size)
105 lefcha 1.6 {
106 lefcha 1.13 void *ptr;
107 lefcha 1.19 secmem_t *sm;
108 lefcha 1.10
109 lefcha 1.13 ptr = xmalloc(size);
110 lefcha 1.10
111 lefcha 1.19 sm = (secmem_t *) xmalloc(sizeof(secmem_t));
112 lefcha 1.10
113 lefcha 1.19 sm->buf = ptr;
114     sm->size = size;
115     sm->prev = sm->next = NULL;
116 lefcha 1.10
117 lefcha 1.19 secmem_append(sm);
118 lefcha 1.10
119 lefcha 1.13 return ptr;
120 lefcha 1.6 }
121    
122    
123     /*
124     * Secure memory realloc(). Resize memory by allocating a new memory chunk
125     * and NULL fill old memory, in order to protect sensitive data.
126     */
127 lefcha 1.13 void *
128     srealloc(void *ptr, size_t size)
129 lefcha 1.6 {
130 lefcha 1.13 void *p;
131 lefcha 1.19 secmem_t *sm;
132 lefcha 1.10
133 lefcha 1.19 if (!(sm = (secmem_t *) secmem_find(ptr))) {
134 lefcha 1.13 ptr = xrealloc(ptr, size);
135     return ptr;
136     }
137     p = smalloc(size);
138 lefcha 1.19 memcpy(p, sm->buf, min(sm->size, size));
139 lefcha 1.13
140 lefcha 1.19 memset(sm->buf, 0, sm->size);
141     secmem_remove(sm);
142     xfree(sm->buf);
143     xfree(sm);
144 lefcha 1.10
145 lefcha 1.13 return p;
146 lefcha 1.6 }
147    
148    
149     /*
150     * Secure memory free(). NULL fill memory before freeing it.
151     */
152 lefcha 1.13 void
153     sfree(void *ptr)
154 lefcha 1.6 {
155 lefcha 1.19 secmem_t *sm;
156 lefcha 1.10
157 lefcha 1.19 if (!(sm = (secmem_t *) secmem_find(ptr))) {
158 lefcha 1.13 xfree(ptr);
159     return;
160     }
161 lefcha 1.19 memset(sm->buf, 0, sm->size);
162     secmem_remove(sm);
163     xfree(sm->buf);
164     xfree(sm);
165 lefcha 1.6 }
166    
167    
168     /*
169 lefcha 1.9 * Secure memory strdup(). Uses secure memory allocation.
170 lefcha 1.6 */
171 lefcha 1.13 char *
172     sstrdup(const char *s)
173 lefcha 1.6 {
174 lefcha 1.13 char *p;
175 lefcha 1.10
176 lefcha 1.13 p = (char *)smalloc(strlen(s) + 1);
177     xstrncpy(p, s, strlen(s));
178 lefcha 1.10
179 lefcha 1.13 return p;
180 lefcha 1.6 }
181    
182    
183     /*
184     * Append information about the newly allocated memory buffer.
185     */
186 lefcha 1.13 void
187 lefcha 1.19 secmem_append(secmem_t * sm)
188 lefcha 1.6 {
189 lefcha 1.13 secmem_t *pos;
190     secmem_t **app;
191 lefcha 1.10
192 lefcha 1.19 app = &secmem;
193     pos = secmem;
194 lefcha 1.6
195 lefcha 1.13 while (pos) {
196 lefcha 1.19 sm->prev = pos;
197 lefcha 1.13 app = &(pos->next);
198     pos = pos->next;
199     }
200 lefcha 1.10
201 lefcha 1.19 *app = sm;
202 lefcha 1.6 }
203    
204    
205     /*
206     * Find the record of a memory buffer in the secure memory linked list.
207     */
208 lefcha 1.13 secmem_t *
209     secmem_find(void *ptr)
210 lefcha 1.6 {
211 lefcha 1.13 secmem_t *pos;
212 lefcha 1.10
213 lefcha 1.19 pos = secmem;
214 lefcha 1.10
215 lefcha 1.13 while (pos != NULL && pos->buf != ptr)
216     pos = pos->next;
217 lefcha 1.10
218 lefcha 1.13 return pos;
219 lefcha 1.6 }
220 lefcha 1.10
221 lefcha 1.6
222     /*
223     * Remove a record of a secure memory buffer.
224     */
225 lefcha 1.13 void
226 lefcha 1.19 secmem_remove(secmem_t * sm)
227 lefcha 1.6 {
228 lefcha 1.20
229 lefcha 1.19 if (sm->prev != NULL)
230     sm->prev->next = sm->next;
231     if (sm->next != NULL)
232     sm->next->prev = sm->prev;
233     if (secmem == sm)
234     secmem = sm->next;
235 lefcha 1.14
236 lefcha 1.6 }
237    
238    
239     /*
240     * Overwrite/clear all secure memory.
241     */
242 lefcha 1.13 void
243     secmem_clear(void)
244 lefcha 1.6 {
245 lefcha 1.14 secmem_t *p, *t;
246 lefcha 1.10
247 lefcha 1.19 for (p = secmem; p != NULL; p = t) {
248 lefcha 1.14 t = p->next;
249     sfree(p->buf);
250     }
251 lefcha 1.6 }
252 lefcha 1.8
253    
254     /*
255 lefcha 1.9 * Disable core file dumping.
256 lefcha 1.6 */
257 lefcha 1.13 void
258     corefile_disable(void)
259 lefcha 1.6 {
260 lefcha 1.13 struct rlimit rl;
261 lefcha 1.7
262 lefcha 1.13 getrlimit(RLIMIT_CORE, &rl);
263 lefcha 1.10
264 lefcha 1.13 rl.rlim_cur = rl.rlim_max = 0;
265     setrlimit(RLIMIT_CORE, &rl);
266 lefcha 1.2 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26