summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcli/util/tstream.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/libcli/util/tstream.c b/libcli/util/tstream.c
index 5d0e561193..b287597c62 100644
--- a/libcli/util/tstream.c
+++ b/libcli/util/tstream.c
@@ -97,7 +97,9 @@ static void tstream_read_pdu_blob_done(struct tevent_req *subreq)
struct tstream_read_pdu_blob_state);
ssize_t ret;
int sys_errno;
- size_t pdu_size;
+ size_t old_buf_size = state->pdu_blob.length;
+ size_t new_buf_size = 0;
+ size_t pdu_size = 0;
NTSTATUS status;
uint8_t *buf;
@@ -116,20 +118,26 @@ static void tstream_read_pdu_blob_done(struct tevent_req *subreq)
return;
} else if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
/* more to get */
+ if (pdu_size > 0) {
+ new_buf_size = pdu_size;
+ } else {
+ /* we don't know the size yet, so get one more byte */
+ new_buf_size = old_buf_size + 1;
+ }
} else if (!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
return;
}
- buf = talloc_realloc(state, state->pdu_blob.data, uint8_t, pdu_size);
+ buf = talloc_realloc(state, state->pdu_blob.data, uint8_t, new_buf_size);
if (tevent_req_nomem(buf, req)) {
return;
}
state->pdu_blob.data = buf;
- state->pdu_blob.length = pdu_size;
+ state->pdu_blob.length = new_buf_size;
- state->tmp_vector.iov_base = (char *) (buf + state->tmp_vector.iov_len);
- state->tmp_vector.iov_len = pdu_size - state->tmp_vector.iov_len;
+ state->tmp_vector.iov_base = (char *) (buf + old_buf_size);
+ state->tmp_vector.iov_len = new_buf_size - old_buf_size;
subreq = tstream_readv_send(state,
state->caller.ev,