chiark
/
gitweb
/
~ianmdlvl
/
adns.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
3955725
)
malloc(0)->0 fixes.
author
ian
<ian>
Sun, 8 Nov 1998 16:23:19 +0000
(16:23 +0000)
committer
ian
<ian>
Sun, 8 Nov 1998 16:23:19 +0000
(16:23 +0000)
src/general.c
patch
|
blob
|
history
src/internal.h
patch
|
blob
|
history
src/query.c
patch
|
blob
|
history
diff --git
a/src/general.c
b/src/general.c
index 2ced4c06b6c35a390bdc49924613730b58b46664..9db4bb4cbc7b9881755c97694d9d9bdc71236fa4 100644
(file)
--- 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) {
newlen= vb->used+len;
if (vb->avail < newlen) {
+ if (newlen<20) newlen= 20;
newlen <<= 1;
nb= realloc(vb->buf,newlen);
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;
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;
}
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,
/* 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 24e69a8d4cfb1428aa9112a07ab80ac2c46eb574..a20dd932d9b5cbd40299fb288f22086aecce13d1 100644
(file)
--- 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.
*
* _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);
*/
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);
*/
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);
*/
void adns__makefinal_block(adns_query qu, void **blpp, size_t sz);
diff --git
a/src/query.c
b/src/query.c
index f8feef7dae6c82171edd0d332ed6b93747459837..7c977bb5a09c071335233ef5088f82b6932074c5 100644
(file)
--- 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;
*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));