summaryrefslogtreecommitdiff
path: root/librpc/ndr/ndr_basic.c
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2021-05-28 12:18:48 +1200
committerDouglas Bagnall <dbagnall@samba.org>2021-06-02 03:56:36 +0000
commitc35f4180a44eb3caecad0f2daab46574bc52be83 (patch)
treef15c31a48bb38c5aa23be3a608e3d3f004bc6a2f /librpc/ndr/ndr_basic.c
parent0cc4478070b9c980d653adf31647dd541cf4be22 (diff)
downloadsamba-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.c8
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);