diff options
author | Günther Deschner <gd@samba.org> | 2017-01-11 16:57:49 +0100 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2017-01-24 10:53:17 +0100 |
commit | 303ae2a023dda7686cfded36951ec2baad30d9b6 (patch) | |
tree | 2910222ec4f50238b5d8f0c206ed91a6021a3593 /librpc/ndr | |
parent | 9b0fc295eff69120593211863d0253bdd9ecd0fe (diff) | |
download | samba-303ae2a023dda7686cfded36951ec2baad30d9b6.tar.gz |
librpc/ndr: add ndr_push_charset_to_null and increase library version (abi change)
We were crashing earlier when calculating the length of NULL strings in
fixed size arrays (noticed while replying with an empty
spoolss_CorePrinterDriver struct within the spoolss_GetCorePrinterDrivers
call).
Guenther
Signed-off-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'librpc/ndr')
-rw-r--r-- | librpc/ndr/libndr.h | 1 | ||||
-rw-r--r-- | librpc/ndr/ndr_string.c | 16 |
2 files changed, 17 insertions, 0 deletions
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index 0c3c55a9bf2..7337e86df17 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -656,6 +656,7 @@ enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uint32_t cou enum ndr_err_code ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset); enum ndr_err_code ndr_pull_charset_to_null(struct ndr_pull *ndr, int ndr_flags, const char **var, uint32_t length, uint8_t byte_mul, charset_t chset); enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset); +enum ndr_err_code ndr_push_charset_to_null(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset); /* GUIDs */ bool GUID_equal(const struct GUID *u1, const struct GUID *u2); diff --git a/librpc/ndr/ndr_string.c b/librpc/ndr/ndr_string.c index 2229b2e8c03..f9366b494a8 100644 --- a/librpc/ndr/ndr_string.c +++ b/librpc/ndr/ndr_string.c @@ -648,6 +648,11 @@ _PUBLIC_ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, if (required) { size_t size = 0; + + if (var == NULL) { + return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); + } + if (!convert_string(CH_UNIX, chset, var, strlen(var), ndr->data+ndr->offset, required, &size)) { @@ -666,6 +671,17 @@ _PUBLIC_ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, return NDR_ERR_SUCCESS; } +_PUBLIC_ enum ndr_err_code ndr_push_charset_to_null(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, charset_t chset) +{ + const char *str = var; + + if (str == NULL) { + str = ""; + } + + return ndr_push_charset(ndr, ndr_flags, str, length, byte_mul, chset); +} + /* Return number of elements in a string in the specified charset */ _PUBLIC_ uint32_t ndr_charset_length(const void *var, charset_t chset) { |