diff options
-rw-r--r-- | librpc/ndr/libndr.h | 11 | ||||
-rw-r--r-- | librpc/ndr/ndr.c | 10 |
2 files changed, 20 insertions, 1 deletions
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index 8070c3cb56..bc843c12e2 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -124,6 +124,14 @@ struct ndr_print { #define LIBNDR_STRING_FLAGS (0x7FFC) /* + * don't debug NDR_ERR_BUFSIZE failures, + * as the available buffer might be incomplete. + * + * return NDR_ERR_INCOMPLETE_BUFFER instead. + */ +#define LIBNDR_FLAG_INCOMPLETE_BUFFER (1<<16) + +/* * This lets ndr_pull_subcontext_end() return * NDR_ERR_UNREAD_BYTES. */ @@ -206,7 +214,8 @@ enum ndr_err_code { NDR_ERR_INVALID_POINTER, NDR_ERR_UNREAD_BYTES, NDR_ERR_NDR64, - NDR_ERR_FLAGS + NDR_ERR_FLAGS, + NDR_ERR_INCOMPLETE_BUFFER }; #define NDR_ERR_CODE_IS_SUCCESS(x) (x == NDR_ERR_SUCCESS) diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 3ed0310a63..99e9fe4d8f 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -453,6 +453,15 @@ _PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr, va_list ap; int ret; + if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { + switch (ndr_err) { + case NDR_ERR_BUFSIZE: + return NDR_ERR_INCOMPLETE_BUFFER; + default: + break; + } + } + va_start(ap, format); ret = vasprintf(&s, format, ap); va_end(ap); @@ -1510,6 +1519,7 @@ const static struct { { NDR_ERR_INVALID_POINTER, "Invalid Pointer" }, { NDR_ERR_UNREAD_BYTES, "Unread Bytes" }, { NDR_ERR_NDR64, "NDR64 assertion error" }, + { NDR_ERR_INCOMPLETE_BUFFER, "Incomplete Buffer" }, { 0, NULL } }; |