chiark / gitweb /
malloc(0)->0 fixes.
authorian <ian>
Sun, 8 Nov 1998 16:23:19 +0000 (16:23 +0000)
committerian <ian>
Sun, 8 Nov 1998 16:23:19 +0000 (16:23 +0000)
src/general.c
src/internal.h
src/query.c

index 2ced4c0..9db4bb4 100644 (file)
@@ -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,
index 24e69a8..a20dd93 100644 (file)
@@ -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);
index f8feef7..7c977bb 100644 (file)
@@ -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));