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