From d9fee28b67dcee387654151a24ebe2547d18156a Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Thu, 8 Sep 2022 17:29:28 -0400 Subject: [PATCH 2/3] Adapt for NDR API changes in Samba. --- configure.ac | 38 ++++++++++++++++++++++++++ libmapi/socket/interface.c | 4 +++ ndr_mapi.c | 55 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) diff --git a/configure.ac b/configure.ac index 65793e9..20fa171 100644 --- a/configure.ac +++ b/configure.ac @@ -512,6 +512,44 @@ AS_CASE([$oc_cv_samba_cli_credentials_flavour], [*new*], [AC_DEFINE([SAMBA_CRED_NEW_STYLE_SET_STATE], [1], [Define to 1 if Samba cli_credentials_set_kerberos_state take 3 arguments])]) +# Probe for samba ndr.h incompatible change + +AC_CACHE_CHECK([whether Sabma ndr_token_peek returns error code], +[oc_cv_samba_ndr_token_peek_errors], +[oc_save_CFLAGS=$CFLAGS +CFLAGS="$CFLAGS $SAMBA_CFLAGS" +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include +enum ndr_err_code ndr_token_peek();], + [return ndr_token_peek(0, 0, 0)])], + [oc_cv_samba_ndr_token_peek_errors=yes], + [oc_cv_samba_ndr_token_peek_errors=no]) +CFLAGS=$oc_save_CFLAGS]) + +AS_CASE([$oc_cv_samba_ndr_token_peek_errors], + [yes], [AC_DEFINE([SAMBA_NDR_TOKEN_PEEK_ERRORS], [1], + [Define to 1 if Samba ndr_token_peek returns an error code])]) + +AC_CACHE_CHECK([for Samba NDR_ZERO_STRUCT], +[oc_cv_samba_have_ndr_zero_struct], +[oc_save_CFLAGS=$CFLAGS +CFLAGS="$CFLAGS $SAMBA_CFLAGS" +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include ], + [struct foo { int x; } bar; NDR_ZERO_STRUCT(bar);])], + [oc_cv_samba_have_ndr_zero_struct=yes], + [oc_cv_samba_have_ndr_zero_struct=no]) +CFLAGS=$oc_save_CFLAGS]) + +AS_CASE([$oc_cv_samba_have_ndr_zero_struct], + [yes], [AC_DEFINE([SAMBA_HAVE_NDR_ZERO_STRUCT], [1], + [Define to 1 if Samba provides NDR_ZERO_STRUCT(P) macros])]) + +oc_save_CFLAGS=$CFLAGS +CFLAGS="$CFLAGS $SAMBA_CFLAGS" +AC_CHECK_FUNCS([ndr_push_get_switch_value ndr_pull_get_switch_value ndr_print_get_switch_value]) +CFLAGS=$oc_save_CFLAGS + dnl --------------------------------------------------------------------------- dnl Finally add libmapi to the library list dnl --------------------------------------------------------------------------- diff --git a/libmapi/socket/interface.c b/libmapi/socket/interface.c index f1b3258..bc0d69a 100644 --- a/libmapi/socket/interface.c +++ b/libmapi/socket/interface.c @@ -23,6 +23,10 @@ #include "libmapi/libmapi_private.h" #include +#if SAMBA_HAVE_NDR_ZERO_STRUCT +# define ZERO_STRUCTPN(x) NDR_ZERO_STRUCT(*x) +#endif + #define ALLONES ((uint32_t)0xFFFFFFFF) /* address construction based on a patch from fred@datalync.com diff --git a/ndr_mapi.c b/ndr_mapi.c index c177556..1b78c4b 100644 --- a/ndr_mapi.c +++ b/ndr_mapi.c @@ -27,6 +27,61 @@ #define MIN(a,b) ((a)<(b)?(a):(b)) +#if SAMBA_NDR_TOKEN_PEEK_ERRORS +static uint32_t wrap_ndr_token_peek(struct ndr_token_list *list, const void *key) +{ + uint32_t ret; + + ndr_token_peek(list, key, &ret); + return ret; +} +#define ndr_token_peek(a, b) wrap_ndr_token_peek(a, b) + +static uint32_t wrap_ndr_get_array_size(struct ndr_pull *ndr, const void *p) +{ + uint32_t ret; + + ndr_get_array_size(ndr, p, &ret); + return ret; +} +#define ndr_get_array_size(a, b) wrap_ndr_get_array_size(a, b) + +static uint32_t wrap_ndr_get_array_length(struct ndr_pull *ndr, const void *p) +{ + uint32_t ret; + + ndr_get_array_length(ndr, p, &ret); + return ret; +} +#define ndr_get_array_length(a, b) wrap_ndr_get_array_length(a, b) +#endif + +#if SAMBA_HAVE_NDR_ZERO_STRUCT +# define ZERO_STRUCT(x) NDR_ZERO_STRUCT(x) +# define ZERO_STRUCTP(x) NDR_ZERO_STRUCTP(x) +#endif + +#if !HAVE_NDR_PRINT_GET_SWITCH_VALUE +static uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p) +{ + return ndr_token_peek(&ndr->switch_list, p); +} +#endif + +#if !HAVE_NDR_PUSH_GET_SWITCH_VALUE +static uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p) +{ + return ndr_token_peek(&ndr->switch_list, p); +} +#endif + +#if !HAVE_NDR_PULL_GET_SWITCH_VALUE +static uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p) +{ + return ndr_token_peek(&ndr->switch_list, p); +} +#endif + _PUBLIC_ void obfuscate_data(uint8_t *data, uint32_t size, uint8_t salt) { uint32_t i; -- 2.35.1