1: /* alloc.c
2:
3: Memory allocation... */
4:
5: /*
6: * Copyright (c) 2004-2007,2009 by Internet Systems Consortium, Inc. ("ISC")
7: * Copyright (c) 1996-2003 by Internet Software Consortium
8: *
9: * Permission to use, copy, modify, and distribute this software for any
10: * purpose with or without fee is hereby granted, provided that the above
11: * copyright notice and this permission notice appear in all copies.
12: *
13: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
14: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
16: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
19: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20: *
21: * Internet Systems Consortium, Inc.
22: * 950 Charter Street
23: * Redwood City, CA 94063
24: * <info@isc.org>
25: * https://www.isc.org/
26: *
27: * This software has been written for Internet Systems Consortium
28: * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
29: * To learn more about Internet Systems Consortium, see
30: * ``https://www.isc.org/''. To learn more about Vixie Enterprises,
31: * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
32: * ``http://www.nominum.com''.
33: */
34:
35: #include "dhcpd.h"
36: #include <omapip/omapip_p.h>
37:
38: struct dhcp_packet *dhcp_free_list;
39: struct packet *packet_free_list;
40:
41: int option_chain_head_allocate (ptr, file, line)
42: struct option_chain_head **ptr;
43: const char *file;
44: int line;
45: {
46: struct option_chain_head *h;
47:
48: if (!ptr) {
49: log_error ("%s(%d): null pointer", file, line);
50: #if defined (POINTER_DEBUG)
51: abort ();
52: #else
53: return 0;
54: #endif
55: }
56: if (*ptr) {
57: log_error ("%s(%d): non-null pointer", file, line);
58: #if defined (POINTER_DEBUG)
59: abort ();
60: #else
61: *ptr = (struct option_chain_head *)0;
62: #endif
63: }
64:
65: h = dmalloc (sizeof *h, file, line);
66: if (h) {
67: memset (h, 0, sizeof *h);
68: return option_chain_head_reference (ptr, h, file, line);
69: }
70: return 0;
71: }
72:
73: int option_chain_head_reference (ptr, bp, file, line)
74: struct option_chain_head **ptr;
75: struct option_chain_head *bp;
76: const char *file;
77: int line;
78: {
79: if (!ptr) {
80: log_error ("%s(%d): null pointer", file, line);
81: #if defined (POINTER_DEBUG)
82: abort ();
83: #else
84: return 0;
85: #endif
86: }
87: if (*ptr) {
88: log_error ("%s(%d): non-null pointer", file, line);
89: #if defined (POINTER_DEBUG)
90: abort ();
91: #else
92: *ptr = (struct option_chain_head *)0;
93: #endif
94: }
95: *ptr = bp;
96: bp -> refcnt++;
97: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
98: return 1;
99: }
100:
101: int option_chain_head_dereference (ptr, file, line)
102: struct option_chain_head **ptr;
103: const char *file;
104: int line;
105: {
106: struct option_chain_head *option_chain_head;
107: pair car, cdr;
108:
109: if (!ptr || !*ptr) {
110: log_error ("%s(%d): null pointer", file, line);
111: #if defined (POINTER_DEBUG)
112: abort ();
113: #else
114: return 0;
115: #endif
116: }
117:
118: option_chain_head = *ptr;
119: *ptr = (struct option_chain_head *)0;
120: --option_chain_head -> refcnt;
121: rc_register (file, line, ptr, option_chain_head,
122: option_chain_head -> refcnt, 1, RC_MISC);
123: if (option_chain_head -> refcnt > 0)
124: return 1;
125:
126: if (option_chain_head -> refcnt < 0) {
127: log_error ("%s(%d): negative refcnt!", file, line);
128: #if defined (DEBUG_RC_HISTORY)
129: dump_rc_history (option_chain_head);
130: #endif
131: #if defined (POINTER_DEBUG)
132: abort ();
133: #else
134: return 0;
135: #endif
136: }
137:
138: /* If there are any options on this head, free them. */
139: for (car = option_chain_head -> first; car; car = cdr) {
140: cdr = car -> cdr;
141: if (car -> car)
142: option_cache_dereference ((struct option_cache **)
143: (&car -> car), MDL);
144: dfree (car, MDL);
145: car = cdr;
146: }
147:
148: dfree (option_chain_head, file, line);
149: return 1;
150: }
151:
152: int group_allocate (ptr, file, line)
153: struct group **ptr;
154: const char *file;
155: int line;
156: {
157: struct group *g;
158:
159: if (!ptr) {
160: log_error ("%s(%d): null pointer", file, line);
161: #if defined (POINTER_DEBUG)
162: abort ();
163: #else
164: return 0;
165: #endif
166: }
167: if (*ptr) {
168: log_error ("%s(%d): non-null pointer", file, line);
169: #if defined (POINTER_DEBUG)
170: abort ();
171: #else
172: *ptr = (struct group *)0;
173: #endif
174: }
175:
176: g = dmalloc (sizeof *g, file, line);
177: if (g) {
178: memset (g, 0, sizeof *g);
179: return group_reference (ptr, g, file, line);
180: }
181: return 0;
182: }
183:
184: int group_reference (ptr, bp, file, line)
185: struct group **ptr;
186: struct group *bp;
187: const char *file;
188: int line;
189: {
190: if (!ptr) {
191: log_error ("%s(%d): null pointer", file, line);
192: #if defined (POINTER_DEBUG)
193: abort ();
194: #else
195: return 0;
196: #endif
197: }
198: if (*ptr) {
199: log_error ("%s(%d): non-null pointer", file, line);
200: #if defined (POINTER_DEBUG)
201: abort ();
202: #else
203: *ptr = (struct group *)0;
204: #endif
205: }
206: *ptr = bp;
207: bp -> refcnt++;
208: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
209: return 1;
210: }
211:
212: int group_dereference (ptr, file, line)
213: struct group **ptr;
214: const char *file;
215: int line;
216: {
217: struct group *group;
218:
219: if (!ptr || !*ptr) {
220: log_error ("%s(%d): null pointer", file, line);
221: #if defined (POINTER_DEBUG)
222: abort ();
223: #else
224: return 0;
225: #endif
226: }
227:
228: group = *ptr;
229: *ptr = (struct group *)0;
230: --group -> refcnt;
231: rc_register (file, line, ptr, group, group -> refcnt, 1, RC_MISC);
232: if (group -> refcnt > 0)
233: return 1;
234:
235: if (group -> refcnt < 0) {
236: log_error ("%s(%d): negative refcnt!", file, line);
237: #if defined (DEBUG_RC_HISTORY)
238: dump_rc_history (group);
239: #endif
240: #if defined (POINTER_DEBUG)
241: abort ();
242: #else
243: return 0;
244: #endif
245: }
246:
247: if (group -> object)
248: group_object_dereference (&group -> object, file, line);
249: if (group -> subnet)
250: subnet_dereference (&group -> subnet, file, line);
251: if (group -> shared_network)
252: shared_network_dereference (&group -> shared_network,
253: file, line);
254: if (group -> statements)
255: executable_statement_dereference (&group -> statements,
256: file, line);
257: if (group -> next)
258: group_dereference (&group -> next, file, line);
259: dfree (group, file, line);
260: return 1;
261: }
262:
263: struct dhcp_packet *new_dhcp_packet (file, line)
264: const char *file;
265: int line;
266: {
267: struct dhcp_packet *rval;
268: rval = (struct dhcp_packet *)dmalloc (sizeof (struct dhcp_packet),
269: file, line);
270: return rval;
271: }
272:
273: struct protocol *new_protocol (file, line)
274: const char *file;
275: int line;
276: {
277: struct protocol *rval = dmalloc (sizeof (struct protocol), file, line);
278: return rval;
279: }
280:
281: struct domain_search_list *new_domain_search_list (file, line)
282: const char *file;
283: int line;
284: {
285: struct domain_search_list *rval =
286: dmalloc (sizeof (struct domain_search_list), file, line);
287: return rval;
288: }
289:
290: struct name_server *new_name_server (file, line)
291: const char *file;
292: int line;
293: {
294: struct name_server *rval =
295: dmalloc (sizeof (struct name_server), file, line);
296: return rval;
297: }
298:
299: void free_name_server (ptr, file, line)
300: struct name_server *ptr;
301: const char *file;
302: int line;
303: {
304: dfree ((void *)ptr, file, line);
305: }
306:
307: struct option *new_option (name, file, line)
308: const char *name;
309: const char *file;
310: int line;
311: {
312: struct option *rval;
313: int len;
314:
315: len = strlen(name);
316:
317: rval = dmalloc(sizeof(struct option) + len + 1, file, line);
318:
319: if(rval) {
320: memcpy(rval + 1, name, len);
321: rval->name = (char *)(rval + 1);
322: }
323:
324: return rval;
325: }
326:
327: struct universe *new_universe (file, line)
328: const char *file;
329: int line;
330: {
331: struct universe *rval =
332: dmalloc (sizeof (struct universe), file, line);
333: return rval;
334: }
335:
336: void free_universe (ptr, file, line)
337: struct universe *ptr;
338: const char *file;
339: int line;
340: {
341: dfree ((void *)ptr, file, line);
342: }
343:
344: void free_domain_search_list (ptr, file, line)
345: struct domain_search_list *ptr;
346: const char *file;
347: int line;
348: {
349: dfree ((void *)ptr, file, line);
350: }
351:
352: void free_protocol (ptr, file, line)
353: struct protocol *ptr;
354: const char *file;
355: int line;
356: {
357: dfree ((void *)ptr, file, line);
358: }
359:
360: void free_dhcp_packet (ptr, file, line)
361: struct dhcp_packet *ptr;
362: const char *file;
363: int line;
364: {
365: dfree ((void *)ptr, file, line);
366: }
367:
368: struct client_lease *new_client_lease (file, line)
369: const char *file;
370: int line;
371: {
372: return (struct client_lease *)dmalloc (sizeof (struct client_lease),
373: file, line);
374: }
375:
376: void free_client_lease (lease, file, line)
377: struct client_lease *lease;
378: const char *file;
379: int line;
380: {
381: dfree (lease, file, line);
382: }
383:
384: pair free_pairs;
385:
386: pair new_pair (file, line)
387: const char *file;
388: int line;
389: {
390: pair foo;
391:
392: if (free_pairs) {
393: foo = free_pairs;
394: free_pairs = foo -> cdr;
395: memset (foo, 0, sizeof *foo);
396: dmalloc_reuse (foo, file, line, 0);
397: return foo;
398: }
399:
400: foo = dmalloc (sizeof *foo, file, line);
401: if (!foo)
402: return foo;
403: memset (foo, 0, sizeof *foo);
404: return foo;
405: }
406:
407: void free_pair (foo, file, line)
408: pair foo;
409: const char *file;
410: int line;
411: {
412: foo -> cdr = free_pairs;
413: free_pairs = foo;
414: dmalloc_reuse (free_pairs, __FILE__, __LINE__, 0);
415: }
416:
417: #if defined (DEBUG_MEMORY_LEAKAGE) || \
418: defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
419: void relinquish_free_pairs ()
420: {
421: pair pf, pc;
422:
423: for (pf = free_pairs; pf; pf = pc) {
424: pc = pf -> cdr;
425: dfree (pf, MDL);
426: }
427: free_pairs = (pair)0;
428: }
429: #endif
430:
431: struct expression *free_expressions;
432:
433: int expression_allocate (cptr, file, line)
434: struct expression **cptr;
435: const char *file;
436: int line;
437: {
438: struct expression *rval;
439:
440: if (free_expressions) {
441: rval = free_expressions;
442: free_expressions = rval -> data.not;
443: dmalloc_reuse (rval, file, line, 1);
444: } else {
445: rval = dmalloc (sizeof (struct expression), file, line);
446: if (!rval)
447: return 0;
448: }
449: memset (rval, 0, sizeof *rval);
450: return expression_reference (cptr, rval, file, line);
451: }
452:
453: int expression_reference (ptr, src, file, line)
454: struct expression **ptr;
455: struct expression *src;
456: const char *file;
457: int line;
458: {
459: if (!ptr) {
460: log_error ("%s(%d): null pointer", file, line);
461: #if defined (POINTER_DEBUG)
462: abort ();
463: #else
464: return 0;
465: #endif
466: }
467: if (*ptr) {
468: log_error ("%s(%d): non-null pointer", file, line);
469: #if defined (POINTER_DEBUG)
470: abort ();
471: #else
472: *ptr = (struct expression *)0;
473: #endif
474: }
475: *ptr = src;
476: src -> refcnt++;
477: rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC);
478: return 1;
479: }
480:
481: void free_expression (expr, file, line)
482: struct expression *expr;
483: const char *file;
484: int line;
485: {
486: expr -> data.not = free_expressions;
487: free_expressions = expr;
488: dmalloc_reuse (free_expressions, __FILE__, __LINE__, 0);
489: }
490:
491: #if defined (DEBUG_MEMORY_LEAKAGE) || \
492: defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
493: void relinquish_free_expressions ()
494: {
495: struct expression *e, *n;
496:
497: for (e = free_expressions; e; e = n) {
498: n = e -> data.not;
499: dfree (e, MDL);
500: }
501: free_expressions = (struct expression *)0;
502: }
503: #endif
504:
505: struct binding_value *free_binding_values;
506:
507: int binding_value_allocate (cptr, file, line)
508: struct binding_value **cptr;
509: const char *file;
510: int line;
511: {
512: struct binding_value *rval;
513:
514: if (free_binding_values) {
515: rval = free_binding_values;
516: free_binding_values = rval -> value.bv;
517: dmalloc_reuse (rval, file, line, 1);
518: } else {
519: rval = dmalloc (sizeof (struct binding_value), file, line);
520: if (!rval)
521: return 0;
522: }
523: memset (rval, 0, sizeof *rval);
524: return binding_value_reference (cptr, rval, file, line);
525: }
526:
527: int binding_value_reference (ptr, src, file, line)
528: struct binding_value **ptr;
529: struct binding_value *src;
530: const char *file;
531: int line;
532: {
533: if (!ptr) {
534: log_error ("%s(%d): null pointer", file, line);
535: #if defined (POINTER_DEBUG)
536: abort ();
537: #else
538: return 0;
539: #endif
540: }
541: if (*ptr) {
542: log_error ("%s(%d): non-null pointer", file, line);
543: #if defined (POINTER_DEBUG)
544: abort ();
545: #else
546: *ptr = (struct binding_value *)0;
547: #endif
548: }
549: *ptr = src;
550: src -> refcnt++;
551: rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC);
552: return 1;
553: }
554:
555: void free_binding_value (bv, file, line)
556: struct binding_value *bv;
557: const char *file;
558: int line;
559: {
560: bv -> value.bv = free_binding_values;
561: free_binding_values = bv;
562: dmalloc_reuse (free_binding_values, (char *)0, 0, 0);
563: }
564:
565: #if defined (DEBUG_MEMORY_LEAKAGE) || \
566: defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
567: void relinquish_free_binding_values ()
568: {
569: struct binding_value *b, *n;
570:
571: for (b = free_binding_values; b; b = n) {
572: n = b -> value.bv;
573: dfree (b, MDL);
574: }
575: free_binding_values = (struct binding_value *)0;
576: }
577: #endif
578:
579: int fundef_allocate (cptr, file, line)
580: struct fundef **cptr;
581: const char *file;
582: int line;
583: {
584: struct fundef *rval;
585:
586: rval = dmalloc (sizeof (struct fundef), file, line);
587: if (!rval)
588: return 0;
589: memset (rval, 0, sizeof *rval);
590: return fundef_reference (cptr, rval, file, line);
591: }
592:
593: int fundef_reference (ptr, src, file, line)
594: struct fundef **ptr;
595: struct fundef *src;
596: const char *file;
597: int line;
598: {
599: if (!ptr) {
600: log_error ("%s(%d): null pointer", file, line);
601: #if defined (POINTER_DEBUG)
602: abort ();
603: #else
604: return 0;
605: #endif
606: }
607: if (*ptr) {
608: log_error ("%s(%d): non-null pointer", file, line);
609: #if defined (POINTER_DEBUG)
610: abort ();
611: #else
612: *ptr = (struct fundef *)0;
613: #endif
614: }
615: *ptr = src;
616: src -> refcnt++;
617: rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC);
618: return 1;
619: }
620:
621: struct option_cache *free_option_caches;
622:
623: #if defined (DEBUG_MEMORY_LEAKAGE) || \
624: defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
625: void relinquish_free_option_caches ()
626: {
627: struct option_cache *o, *n;
628:
629: for (o = free_option_caches; o; o = n) {
630: n = (struct option_cache *)(o -> expression);
631: dfree (o, MDL);
632: }
633: free_option_caches = (struct option_cache *)0;
634: }
635: #endif
636:
637: int option_cache_allocate (cptr, file, line)
638: struct option_cache **cptr;
639: const char *file;
640: int line;
641: {
642: struct option_cache *rval;
643:
644: if (free_option_caches) {
645: rval = free_option_caches;
646: free_option_caches =
647: (struct option_cache *)(rval -> expression);
648: dmalloc_reuse (rval, file, line, 0);
649: } else {
650: rval = dmalloc (sizeof (struct option_cache), file, line);
651: if (!rval)
652: return 0;
653: }
654: memset (rval, 0, sizeof *rval);
655: return option_cache_reference (cptr, rval, file, line);
656: }
657:
658: int option_cache_reference (ptr, src, file, line)
659: struct option_cache **ptr;
660: struct option_cache *src;
661: const char *file;
662: int line;
663: {
664: if (!ptr) {
665: log_error ("%s(%d): null pointer", file, line);
666: #if defined (POINTER_DEBUG)
667: abort ();
668: #else
669: return 0;
670: #endif
671: }
672: if (*ptr) {
673: log_error ("%s(%d): non-null pointer", file, line);
674: #if defined (POINTER_DEBUG)
675: abort ();
676: #else
677: *ptr = (struct option_cache *)0;
678: #endif
679: }
680: *ptr = src;
681: src -> refcnt++;
682: rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC);
683: return 1;
684: }
685:
686: int buffer_allocate (ptr, len, file, line)
687: struct buffer **ptr;
688: unsigned len;
689: const char *file;
690: int line;
691: {
692: struct buffer *bp;
693:
694: /* XXXSK: should check for bad ptr values, otherwise we
695: leak memory if they are wrong */
696: bp = dmalloc (len + sizeof *bp, file, line);
697: if (!bp)
698: return 0;
699: /* XXXSK: both of these initializations are unnecessary */
700: memset (bp, 0, sizeof *bp);
701: bp -> refcnt = 0;
702: return buffer_reference (ptr, bp, file, line);
703: }
704:
705: int buffer_reference (ptr, bp, file, line)
706: struct buffer **ptr;
707: struct buffer *bp;
708: const char *file;
709: int line;
710: {
711: if (!ptr) {
712: log_error ("%s(%d): null pointer", file, line);
713: #if defined (POINTER_DEBUG)
714: abort ();
715: #else
716: return 0;
717: #endif
718: }
719: if (*ptr) {
720: log_error ("%s(%d): non-null pointer", file, line);
721: #if defined (POINTER_DEBUG)
722: abort ();
723: #else
724: *ptr = (struct buffer *)0;
725: #endif
726: }
727: *ptr = bp;
728: bp -> refcnt++;
729: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
730: return 1;
731: }
732:
733: int buffer_dereference (ptr, file, line)
734: struct buffer **ptr;
735: const char *file;
736: int line;
737: {
738: if (!ptr) {
739: log_error ("%s(%d): null pointer", file, line);
740: #if defined (POINTER_DEBUG)
741: abort ();
742: #else
743: return 0;
744: #endif
745: }
746:
747: if (!*ptr) {
748: log_error ("%s(%d): null pointer", file, line);
749: #if defined (POINTER_DEBUG)
750: abort ();
751: #else
752: return 0;
753: #endif
754: }
755:
756: (*ptr) -> refcnt--;
757: rc_register (file, line, ptr, *ptr, (*ptr) -> refcnt, 1, RC_MISC);
758: if (!(*ptr) -> refcnt) {
759: dfree ((*ptr), file, line);
760: } else if ((*ptr) -> refcnt < 0) {
761: log_error ("%s(%d): negative refcnt!", file, line);
762: #if defined (DEBUG_RC_HISTORY)
763: dump_rc_history (*ptr);
764: #endif
765: #if defined (POINTER_DEBUG)
766: abort ();
767: #else
768: return 0;
769: #endif
770: }
771: *ptr = (struct buffer *)0;
772: return 1;
773: }
774:
775: int dns_host_entry_allocate (ptr, hostname, file, line)
776: struct dns_host_entry **ptr;
777: const char *hostname;
778: const char *file;
779: int line;
780: {
781: struct dns_host_entry *bp;
782:
783: bp = dmalloc (strlen (hostname) + sizeof *bp, file, line);
784: if (!bp)
785: return 0;
786: memset (bp, 0, sizeof *bp);
787: bp -> refcnt = 0;
788: strcpy (bp -> hostname, hostname);
789: return dns_host_entry_reference (ptr, bp, file, line);
790: }
791:
792: int dns_host_entry_reference (ptr, bp, file, line)
793: struct dns_host_entry **ptr;
794: struct dns_host_entry *bp;
795: const char *file;
796: int line;
797: {
798: if (!ptr) {
799: log_error ("%s(%d): null pointer", file, line);
800: #if defined (POINTER_DEBUG)
801: abort ();
802: #else
803: return 0;
804: #endif
805: }
806: if (*ptr) {
807: log_error ("%s(%d): non-null pointer", file, line);
808: #if defined (POINTER_DEBUG)
809: abort ();
810: #else
811: *ptr = (struct dns_host_entry *)0;
812: #endif
813: }
814: *ptr = bp;
815: bp -> refcnt++;
816: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
817: return 1;
818: }
819:
820: int dns_host_entry_dereference (ptr, file, line)
821: struct dns_host_entry **ptr;
822: const char *file;
823: int line;
824: {
825: if (!ptr || !*ptr) {
826: log_error ("%s(%d): null pointer", file, line);
827: #if defined (POINTER_DEBUG)
828: abort ();
829: #else
830: return 0;
831: #endif
832: }
833:
834: (*ptr) -> refcnt--;
835: rc_register (file, line, ptr, *ptr, (*ptr) -> refcnt, 1, RC_MISC);
836: if (!(*ptr) -> refcnt)
837: dfree ((*ptr), file, line);
838: if ((*ptr) -> refcnt < 0) {
839: log_error ("%s(%d): negative refcnt!", file, line);
840: #if defined (DEBUG_RC_HISTORY)
841: dump_rc_history (*ptr);
842: #endif
843: #if defined (POINTER_DEBUG)
844: abort ();
845: #else
846: return 0;
847: #endif
848: }
849: *ptr = (struct dns_host_entry *)0;
850: return 1;
851: }
852:
853: int option_state_allocate (ptr, file, line)
854: struct option_state **ptr;
855: const char *file;
856: int line;
857: {
858: unsigned size;
859:
860: if (!ptr) {
861: log_error ("%s(%d): null pointer", file, line);
862: #if defined (POINTER_DEBUG)
863: abort ();
864: #else
865: return 0;
866: #endif
867: }
868: if (*ptr) {
869: log_error ("%s(%d): non-null pointer", file, line);
870: #if defined (POINTER_DEBUG)
871: abort ();
872: #else
873: *ptr = (struct option_state *)0;
874: #endif
875: }
876:
877: size = sizeof **ptr + (universe_count - 1) * sizeof (void *);
878: *ptr = dmalloc (size, file, line);
879: if (*ptr) {
880: memset (*ptr, 0, size);
881: (*ptr) -> universe_count = universe_count;
882: (*ptr) -> refcnt = 1;
883: rc_register (file, line,
884: ptr, *ptr, (*ptr) -> refcnt, 0, RC_MISC);
885: return 1;
886: }
887: return 0;
888: }
889:
890: int option_state_reference (ptr, bp, file, line)
891: struct option_state **ptr;
892: struct option_state *bp;
893: const char *file;
894: int line;
895: {
896: if (!ptr) {
897: log_error ("%s(%d): null pointer", file, line);
898: #if defined (POINTER_DEBUG)
899: abort ();
900: #else
901: return 0;
902: #endif
903: }
904: if (*ptr) {
905: log_error ("%s(%d): non-null pointer", file, line);
906: #if defined (POINTER_DEBUG)
907: abort ();
908: #else
909: *ptr = (struct option_state *)0;
910: #endif
911: }
912: *ptr = bp;
913: bp -> refcnt++;
914: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
915: return 1;
916: }
917:
918: int option_state_dereference (ptr, file, line)
919: struct option_state **ptr;
920: const char *file;
921: int line;
922: {
923: int i;
924: struct option_state *options;
925:
926: if (!ptr || !*ptr) {
927: log_error ("%s(%d): null pointer", file, line);
928: #if defined (POINTER_DEBUG)
929: abort ();
930: #else
931: return 0;
932: #endif
933: }
934:
935: options = *ptr;
936: *ptr = (struct option_state *)0;
937: --options -> refcnt;
938: rc_register (file, line, ptr, options, options -> refcnt, 1, RC_MISC);
939: if (options -> refcnt > 0)
940: return 1;
941:
942: if (options -> refcnt < 0) {
943: log_error ("%s(%d): negative refcnt!", file, line);
944: #if defined (DEBUG_RC_HISTORY)
945: dump_rc_history (options);
946: #endif
947: #if defined (POINTER_DEBUG)
948: abort ();
949: #else
950: return 0;
951: #endif
952: }
953:
954: /* Loop through the per-universe state. */
955: for (i = 0; i < options -> universe_count; i++)
956: if (options -> universes [i] &&
957: universes [i] -> option_state_dereference)
958: ((*(universes [i] -> option_state_dereference))
959: (universes [i], options, file, line));
960:
961: dfree (options, file, line);
962: return 1;
963: }
964:
965: int executable_statement_allocate (ptr, file, line)
966: struct executable_statement **ptr;
967: const char *file;
968: int line;
969: {
970: struct executable_statement *bp;
971:
972: bp = dmalloc (sizeof *bp, file, line);
973: if (!bp)
974: return 0;
975: memset (bp, 0, sizeof *bp);
976: return executable_statement_reference (ptr, bp, file, line);
977: }
978:
979: int executable_statement_reference (ptr, bp, file, line)
980: struct executable_statement **ptr;
981: struct executable_statement *bp;
982: const char *file;
983: int line;
984: {
985: if (!ptr) {
986: log_error ("%s(%d): null pointer", file, line);
987: #if defined (POINTER_DEBUG)
988: abort ();
989: #else
990: return 0;
991: #endif
992: }
993: if (*ptr) {
994: log_error ("%s(%d): non-null pointer", file, line);
995: #if defined (POINTER_DEBUG)
996: abort ();
997: #else
998: *ptr = (struct executable_statement *)0;
999: #endif
1000: }
1001: *ptr = bp;
1002: bp -> refcnt++;
1003: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
1004: return 1;
1005: }
1006:
1007: static struct packet *free_packets;
1008:
1009: #if defined (DEBUG_MEMORY_LEAKAGE) || \
1010: defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
1011: void relinquish_free_packets ()
1012: {
1013: struct packet *p, *n;
1014: for (p = free_packets; p; p = n) {
1015: n = (struct packet *)(p -> raw);
1016: dfree (p, MDL);
1017: }
1018: free_packets = (struct packet *)0;
1019: }
1020: #endif
1021:
1022: int packet_allocate (ptr, file, line)
1023: struct packet **ptr;
1024: const char *file;
1025: int line;
1026: {
1027: struct packet *p;
1028:
1029: if (!ptr) {
1030: log_error ("%s(%d): null pointer", file, line);
1031: #if defined (POINTER_DEBUG)
1032: abort ();
1033: #else
1034: return 0;
1035: #endif
1036: }
1037: if (*ptr) {
1038: log_error ("%s(%d): non-null pointer", file, line);
1039: #if defined (POINTER_DEBUG)
1040: abort ();
1041: #else
1042: *ptr = (struct packet *)0;
1043: #endif
1044: }
1045:
1046: if (free_packets) {
1047: p = free_packets;
1048: free_packets = (struct packet *)(p -> raw);
1049: dmalloc_reuse (p, file, line, 1);
1050: } else {
1051: p = dmalloc (sizeof *p, file, line);
1052: }
1053: if (p) {
1054: memset (p, 0, sizeof *p);
1055: return packet_reference (ptr, p, file, line);
1056: }
1057: return 0;
1058: }
1059:
1060: int packet_reference (ptr, bp, file, line)
1061: struct packet **ptr;
1062: struct packet *bp;
1063: const char *file;
1064: int line;
1065: {
1066: if (!ptr) {
1067: log_error ("%s(%d): null pointer", file, line);
1068: #if defined (POINTER_DEBUG)
1069: abort ();
1070: #else
1071: return 0;
1072: #endif
1073: }
1074: if (*ptr) {
1075: log_error ("%s(%d): non-null pointer", file, line);
1076: #if defined (POINTER_DEBUG)
1077: abort ();
1078: #else
1079: *ptr = (struct packet *)0;
1080: #endif
1081: }
1082: *ptr = bp;
1083: bp -> refcnt++;
1084: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
1085: return 1;
1086: }
1087:
1088: int packet_dereference (ptr, file, line)
1089: struct packet **ptr;
1090: const char *file;
1091: int line;
1092: {
1093: int i;
1094: struct packet *packet;
1095:
1096: if (!ptr || !*ptr) {
1097: log_error ("%s(%d): null pointer", file, line);
1098: #if defined (POINTER_DEBUG)
1099: abort ();
1100: #else
1101: return 0;
1102: #endif
1103: }
1104:
1105: packet = *ptr;
1106: *ptr = (struct packet *)0;
1107: --packet -> refcnt;
1108: rc_register (file, line, ptr, packet, packet -> refcnt, 1, RC_MISC);
1109: if (packet -> refcnt > 0)
1110: return 1;
1111:
1112: if (packet -> refcnt < 0) {
1113: log_error ("%s(%d): negative refcnt!", file, line);
1114: #if defined (DEBUG_RC_HISTORY)
1115: dump_rc_history (packet);
1116: #endif
1117: #if defined (POINTER_DEBUG)
1118: abort ();
1119: #else
1120: return 0;
1121: #endif
1122: }
1123:
1124: if (packet -> options)
1125: option_state_dereference (&packet -> options, file, line);
1126: if (packet -> interface)
1127: interface_dereference (&packet -> interface, MDL);
1128: if (packet -> shared_network)
1129: shared_network_dereference (&packet -> shared_network, MDL);
1130: for (i = 0; i < packet -> class_count && i < PACKET_MAX_CLASSES; i++) {
1131: if (packet -> classes [i])
1132: omapi_object_dereference ((omapi_object_t **)
1133: &packet -> classes [i], MDL);
1134: }
1135: packet -> raw = (struct dhcp_packet *)free_packets;
1136: free_packets = packet;
1137: dmalloc_reuse (free_packets, __FILE__, __LINE__, 0);
1138: return 1;
1139: }
1140:
1141: int dns_zone_allocate (ptr, file, line)
1142: struct dns_zone **ptr;
1143: const char *file;
1144: int line;
1145: {
1146: struct dns_zone *d;
1147:
1148: if (!ptr) {
1149: log_error ("%s(%d): null pointer", file, line);
1150: #if defined (POINTER_DEBUG)
1151: abort ();
1152: #else
1153: return 0;
1154: #endif
1155: }
1156: if (*ptr) {
1157: log_error ("%s(%d): non-null pointer", file, line);
1158: #if defined (POINTER_DEBUG)
1159: abort ();
1160: #else
1161: *ptr = (struct dns_zone *)0;
1162: #endif
1163: }
1164:
1165: d = dmalloc (sizeof *d, file, line);
1166: if (d) {
1167: memset (d, 0, sizeof *d);
1168: return dns_zone_reference (ptr, d, file, line);
1169: }
1170: return 0;
1171: }
1172:
1173: int dns_zone_reference (ptr, bp, file, line)
1174: struct dns_zone **ptr;
1175: struct dns_zone *bp;
1176: const char *file;
1177: int line;
1178: {
1179: if (!ptr) {
1180: log_error ("%s(%d): null pointer", file, line);
1181: #if defined (POINTER_DEBUG)
1182: abort ();
1183: #else
1184: return 0;
1185: #endif
1186: }
1187: if (*ptr) {
1188: log_error ("%s(%d): non-null pointer", file, line);
1189: #if defined (POINTER_DEBUG)
1190: abort ();
1191: #else
1192: *ptr = (struct dns_zone *)0;
1193: #endif
1194: }
1195: *ptr = bp;
1196: bp -> refcnt++;
1197: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
1198: return 1;
1199: }
1200:
1201: int binding_scope_allocate (ptr, file, line)
1202: struct binding_scope **ptr;
1203: const char *file;
1204: int line;
1205: {
1206: struct binding_scope *bp;
1207:
1208: if (!ptr) {
1209: log_error ("%s(%d): null pointer", file, line);
1210: #if defined (POINTER_DEBUG)
1211: abort ();
1212: #else
1213: return 0;
1214: #endif
1215: }
1216:
1217: if (*ptr) {
1218: log_error ("%s(%d): non-null pointer", file, line);
1219: #if defined (POINTER_DEBUG)
1220: abort ();
1221: #else
1222: return 0;
1223: #endif
1224: }
1225:
1226: bp = dmalloc (sizeof *bp, file, line);
1227: if (!bp)
1228: return 0;
1229: memset (bp, 0, sizeof *bp);
1230: binding_scope_reference (ptr, bp, file, line);
1231: return 1;
1232: }
1233:
1234: int binding_scope_reference (ptr, bp, file, line)
1235: struct binding_scope **ptr;
1236: struct binding_scope *bp;
1237: const char *file;
1238: int line;
1239: {
1240: if (!ptr) {
1241: log_error ("%s(%d): null pointer", file, line);
1242: #if defined (POINTER_DEBUG)
1243: abort ();
1244: #else
1245: return 0;
1246: #endif
1247: }
1248: if (*ptr) {
1249: log_error ("%s(%d): non-null pointer", file, line);
1250: #if defined (POINTER_DEBUG)
1251: abort ();
1252: #else
1253: *ptr = (struct binding_scope *)0;
1254: #endif
1255: }
1256: *ptr = bp;
1257: bp -> refcnt++;
1258: rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC);
1259: return 1;
1260: }
1261:
1262: /* Make a copy of the data in data_string, upping the buffer reference
1263: count if there's a buffer. */
1264:
1265: void
1266: data_string_copy(struct data_string *dest, const struct data_string *src,
1267: const char *file, int line)
1268: {
1269: if (src -> buffer) {
1270: buffer_reference (&dest -> buffer, src -> buffer, file, line);
1271: } else {
1272: dest->buffer = NULL;
1273: }
1274: dest -> data = src -> data;
1275: dest -> terminated = src -> terminated;
1276: dest -> len = src -> len;
1277: }
1278:
1279: /* Release the reference count to a data string's buffer (if any) and
1280: zero out the other information, yielding the null data string. */
1281:
1282: void data_string_forget (data, file, line)
1283: struct data_string *data;
1284: const char *file;
1285: int line;
1286: {
1287: if (data -> buffer)
1288: buffer_dereference (&data -> buffer, file, line);
1289: memset (data, 0, sizeof *data);
1290: }
1291:
1292: /* If the data_string is larger than the specified length, reduce
1293: the data_string to the specified size. */
1294:
1295: void data_string_truncate (dp, len)
1296: struct data_string *dp;
1297: int len;
1298: {
1299: /* XXX: do we need to consider the "terminated" flag in the check? */
1300: if (len < dp -> len) {
1301: dp -> terminated = 0;
1302: dp -> len = len;
1303: }
1304: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>