1 From d9fee28b67dcee387654151a24ebe2547d18156a Mon Sep 17 00:00:00 2001
2 From: Nick Bowler <nbowler@draconx.ca>
3 Date: Thu, 8 Sep 2022 17:29:28 -0400
4 Subject: [PATCH 2/3] Adapt for NDR API changes in Samba.
7 configure.ac | 38 ++++++++++++++++++++++++++
8 libmapi/socket/interface.c | 4 +++
9 ndr_mapi.c | 55 ++++++++++++++++++++++++++++++++++++++
10 3 files changed, 97 insertions(+)
12 diff --git a/configure.ac b/configure.ac
13 index 65793e9..20fa171 100644
16 @@ -512,6 +512,44 @@ AS_CASE([$oc_cv_samba_cli_credentials_flavour],
17 [*new*], [AC_DEFINE([SAMBA_CRED_NEW_STYLE_SET_STATE], [1],
18 [Define to 1 if Samba cli_credentials_set_kerberos_state take 3 arguments])])
20 +# Probe for samba ndr.h incompatible change
22 +AC_CACHE_CHECK([whether Sabma ndr_token_peek returns error code],
23 +[oc_cv_samba_ndr_token_peek_errors],
24 +[oc_save_CFLAGS=$CFLAGS
25 +CFLAGS="$CFLAGS $SAMBA_CFLAGS"
27 + [AC_LANG_PROGRAM([#include <ndr.h>
28 +enum ndr_err_code ndr_token_peek();],
29 + [return ndr_token_peek(0, 0, 0)])],
30 + [oc_cv_samba_ndr_token_peek_errors=yes],
31 + [oc_cv_samba_ndr_token_peek_errors=no])
32 +CFLAGS=$oc_save_CFLAGS])
34 +AS_CASE([$oc_cv_samba_ndr_token_peek_errors],
35 + [yes], [AC_DEFINE([SAMBA_NDR_TOKEN_PEEK_ERRORS], [1],
36 + [Define to 1 if Samba ndr_token_peek returns an error code])])
38 +AC_CACHE_CHECK([for Samba NDR_ZERO_STRUCT],
39 +[oc_cv_samba_have_ndr_zero_struct],
40 +[oc_save_CFLAGS=$CFLAGS
41 +CFLAGS="$CFLAGS $SAMBA_CFLAGS"
43 + [AC_LANG_PROGRAM([#include <ndr.h>],
44 + [struct foo { int x; } bar; NDR_ZERO_STRUCT(bar);])],
45 + [oc_cv_samba_have_ndr_zero_struct=yes],
46 + [oc_cv_samba_have_ndr_zero_struct=no])
47 +CFLAGS=$oc_save_CFLAGS])
49 +AS_CASE([$oc_cv_samba_have_ndr_zero_struct],
50 + [yes], [AC_DEFINE([SAMBA_HAVE_NDR_ZERO_STRUCT], [1],
51 + [Define to 1 if Samba provides NDR_ZERO_STRUCT(P) macros])])
53 +oc_save_CFLAGS=$CFLAGS
54 +CFLAGS="$CFLAGS $SAMBA_CFLAGS"
55 +AC_CHECK_FUNCS([ndr_push_get_switch_value ndr_pull_get_switch_value ndr_print_get_switch_value])
56 +CFLAGS=$oc_save_CFLAGS
58 dnl ---------------------------------------------------------------------------
59 dnl Finally add libmapi to the library list
60 dnl ---------------------------------------------------------------------------
61 diff --git a/libmapi/socket/interface.c b/libmapi/socket/interface.c
62 index f1b3258..bc0d69a 100644
63 --- a/libmapi/socket/interface.c
64 +++ b/libmapi/socket/interface.c
66 #include "libmapi/libmapi_private.h"
69 +#if SAMBA_HAVE_NDR_ZERO_STRUCT
70 +# define ZERO_STRUCTPN(x) NDR_ZERO_STRUCT(*x)
73 #define ALLONES ((uint32_t)0xFFFFFFFF)
75 address construction based on a patch from fred@datalync.com
76 diff --git a/ndr_mapi.c b/ndr_mapi.c
77 index c177556..1b78c4b 100644
82 #define MIN(a,b) ((a)<(b)?(a):(b))
84 +#if SAMBA_NDR_TOKEN_PEEK_ERRORS
85 +static uint32_t wrap_ndr_token_peek(struct ndr_token_list *list, const void *key)
89 + ndr_token_peek(list, key, &ret);
92 +#define ndr_token_peek(a, b) wrap_ndr_token_peek(a, b)
94 +static uint32_t wrap_ndr_get_array_size(struct ndr_pull *ndr, const void *p)
98 + ndr_get_array_size(ndr, p, &ret);
101 +#define ndr_get_array_size(a, b) wrap_ndr_get_array_size(a, b)
103 +static uint32_t wrap_ndr_get_array_length(struct ndr_pull *ndr, const void *p)
107 + ndr_get_array_length(ndr, p, &ret);
110 +#define ndr_get_array_length(a, b) wrap_ndr_get_array_length(a, b)
113 +#if SAMBA_HAVE_NDR_ZERO_STRUCT
114 +# define ZERO_STRUCT(x) NDR_ZERO_STRUCT(x)
115 +# define ZERO_STRUCTP(x) NDR_ZERO_STRUCTP(x)
118 +#if !HAVE_NDR_PRINT_GET_SWITCH_VALUE
119 +static uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p)
121 + return ndr_token_peek(&ndr->switch_list, p);
125 +#if !HAVE_NDR_PUSH_GET_SWITCH_VALUE
126 +static uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p)
128 + return ndr_token_peek(&ndr->switch_list, p);
132 +#if !HAVE_NDR_PULL_GET_SWITCH_VALUE
133 +static uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p)
135 + return ndr_token_peek(&ndr->switch_list, p);
139 _PUBLIC_ void obfuscate_data(uint8_t *data, uint32_t size, uint8_t salt)