From: ian Date: Sun, 8 Nov 1998 16:23:19 +0000 (+0000) Subject: malloc(0)->0 fixes. X-Git-Tag: abandon.1999-04-10.multithread~48 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=commitdiff_plain;h=a49a6d7b1f7da9722082778d6694ccbc077d262a malloc(0)->0 fixes. --- diff --git a/src/general.c b/src/general.c index 2ced4c0..9db4bb4 100644 --- a/src/general.c +++ b/src/general.c @@ -111,9 +111,10 @@ int adns__vbuf_append(vbuf *vb, const byte *data, int len) { newlen= vb->used+len; if (vb->avail < newlen) { + if (newlen<20) newlen= 20; newlen <<= 1; nb= realloc(vb->buf,newlen); - if (!nb) { newlen >>= 1; nb= realloc(vb->buf,newlen); } + if (!nb) { newlen= vb->used+len; nb= realloc(vb->buf,newlen); } if (!nb) return 0; vb->buf= nb; vb->avail= newlen; @@ -122,6 +123,11 @@ int adns__vbuf_append(vbuf *vb, const byte *data, int len) { return 1; } +void adns__vbuf_free(vbuf *vb) { + free(vb->buf); + adns__vbuf_init(vb); +} + /* Additional diagnostic functions */ const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, vbuf *vb, diff --git a/src/internal.h b/src/internal.h index 24e69a8..a20dd93 100644 --- a/src/internal.h +++ b/src/internal.h @@ -317,6 +317,9 @@ void *adns__alloc_interim(adns_query qu, size_t sz); * * _alloc_interim can fail, in which case it will fail the query too, * so nothing more need be done with it. + * + * adns__alloc_interim(qu,0) will not return 0, but it will not + * necessarily return a distinct pointer each time. */ void *adns__alloc_mine(adns_query qu, size_t sz); @@ -326,7 +329,7 @@ void *adns__alloc_mine(adns_query qu, size_t sz); */ void *adns__alloc_final(adns_query qu, size_t sz); -/* Cannot fail. +/* Cannot fail, and cannot return 0. */ void adns__makefinal_block(adns_query qu, void **blpp, size_t sz); diff --git a/src/query.c b/src/query.c index f8feef7..7c977bb 100644 --- a/src/query.c +++ b/src/query.c @@ -73,12 +73,17 @@ int adns__internal_submit(adns_state ads, adns_query *query_r, *query_r= qu; - qu->query_dgram= malloc(qumsg_vb->used); - if (!qu->query_dgram) { - adns__query_fail(qu,adns_s_nolocalmem); - return adns_s_ok; + qu->query_dglen= qumsg_vb->used; + if (qumsg_vb->used) { + qu->query_dgram= malloc(qumsg_vb->used); + if (!qu->query_dgram) { + adns__query_fail(qu,adns_s_nolocalmem); + return adns_s_ok; + } + memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used); + } else { + qu->query_dgram= 0; } - memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used); qu->vb= *qumsg_vb; adns__vbuf_init(qumsg_vb); @@ -156,6 +161,7 @@ void adns_cancel(adns_query query) { void *adns__alloc_interim(adns_query qu, size_t sz) { allocnode *an; + if (!sz) return qu; /* Any old pointer will do */ assert(!qu->final_allocspace); sz= MEM_ROUND(sz); an= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an)) + sz));