diff options
author | Andrew Bartlett <abartlet@samba.org> | 2021-05-28 12:18:48 +1200 |
---|---|---|
committer | Douglas Bagnall <dbagnall@samba.org> | 2021-06-02 03:56:36 +0000 |
commit | c35f4180a44eb3caecad0f2daab46574bc52be83 (patch) | |
tree | f15c31a48bb38c5aa23be3a608e3d3f004bc6a2f /librpc/ndr/ndr_basic.c | |
parent | 0cc4478070b9c980d653adf31647dd541cf4be22 (diff) | |
download | samba-c35f4180a44eb3caecad0f2daab46574bc52be83.tar.gz |
libndr: Return error code from ndr_token_peek()
This makes it safer to change our code to remove tokens after use
if failing to obtain a token would result in an error.
This means changing ndr_get_array_size() and ndr_get_array_length()
to also return an error code.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14710
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Diffstat (limited to 'librpc/ndr/ndr_basic.c')
-rw-r--r-- | librpc/ndr/ndr_basic.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c index 82d2f3cfae6..e239cfb27d9 100644 --- a/librpc/ndr/ndr_basic.c +++ b/librpc/ndr/ndr_basic.c @@ -805,18 +805,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_unique_ptr(struct ndr_push *ndr, const void */ _PUBLIC_ enum ndr_err_code ndr_push_full_ptr(struct ndr_push *ndr, const void *p) { + enum ndr_err_code ret = NDR_ERR_SUCCESS; uint32_t ptr = 0; if (p) { /* Check if the pointer already exists and has an id */ - ptr = ndr_token_peek(&ndr->full_ptr_list, p); - if (ptr == 0) { - enum ndr_err_code ret = NDR_ERR_SUCCESS; + ret = ndr_token_peek(&ndr->full_ptr_list, p, &ptr); + if (ret == NDR_ERR_TOKEN) { ndr->ptr_count++; ptr = ndr->ptr_count; ret = ndr_token_store(ndr, &ndr->full_ptr_list, p, ptr); if (ret != NDR_ERR_SUCCESS) { return ret; } + } else if (ret != NDR_ERR_SUCCESS) { + return ret; } } return ndr_push_uint3264(ndr, NDR_SCALARS, ptr); |