chiark / gitweb /
malloc(0)->0 fixes.
[adns.git] / src / query.c
index f8feef7dae6c82171edd0d332ed6b93747459837..7c977bb5a09c071335233ef5088f82b6932074c5 100644 (file)
@@ -73,12 +73,17 @@ int adns__internal_submit(adns_state ads, adns_query *query_r,
   
   *query_r= qu;
 
   
   *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);
   
   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;
 
 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));
   assert(!qu->final_allocspace);
   sz= MEM_ROUND(sz);
   an= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an)) + sz));