Annotation of embedaddon/dhcp/common/alloc.c, revision 1.1
1.1 ! misho 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>