Ignore:
Timestamp:
Nov 24, 2016, 1:14:11 PM (9 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to version 4.4.3

Location:
vendor/current/librpc/ndr
Files:
14 added
21 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/librpc/ndr/libndr.h

    r919 r988  
    2727
    2828#include <talloc.h>
    29 #include <sys/time.h>
    30 #if _SAMBA_BUILD_ == 4
    31 #include "../lib/util/util.h" /* for discard_const */
     29#include "../lib/util/memory.h" /* for discard_const */
     30#include "../lib/util/byteorder.h"
     31#include "../lib/util/data_blob.h"
     32#include "../lib/util/time.h"
    3233#include "../lib/util/charset/charset.h"
    33 #endif
    3434
    3535/*
     
    123123#define LIBNDR_FLAG_STR_CHARLEN         (1<<11)
    124124#define LIBNDR_FLAG_STR_UTF8            (1<<12)
     125#define LIBNDR_FLAG_STR_RAW8            (1<<13)
    125126#define LIBNDR_STRING_FLAGS             (0x7FFC)
    126127
     
    386387#include "librpc/gen_ndr/misc.h"
    387388
    388 extern const struct ndr_syntax_id ndr_transfer_syntax;
    389 extern const struct ndr_syntax_id ndr64_transfer_syntax;
    390 extern const struct ndr_syntax_id null_ndr_syntax_id;
     389extern const struct ndr_syntax_id ndr_transfer_syntax_ndr;
     390extern const struct ndr_syntax_id ndr_transfer_syntax_ndr64;
     391extern const struct ndr_syntax_id ndr_syntax_id_null;
    391392
    392393struct ndr_interface_call_pipe {
     
    434435};
    435436
     437struct sockaddr_storage;
     438
    436439/*********************************************************************
    437440 Map an NT error code from a NDR error code.
    438441*********************************************************************/
    439442NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err);
     443int ndr_map_error2errno(enum ndr_err_code ndr_err);
    440444const char *ndr_map_error2string(enum ndr_err_code ndr_err);
    441445#define ndr_errstr ndr_map_error2string
     
    455459size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags);
    456460void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid);
     461void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss);
    457462bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2);
    458463char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id);
     
    554559void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v);
    555560
     561#define NDR_SCALAR_PTR_PROTO(name, type) \
     562enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, const type *v); \
     563enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type **v); \
     564void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v);
     565
    556566#define NDR_BUFFER_PROTO(name, type) \
    557567enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, const type *v); \
     
    578588NDR_SCALAR_PROTO(NTSTATUS, NTSTATUS)
    579589NDR_SCALAR_PROTO(WERROR, WERROR)
     590NDR_SCALAR_PROTO(HRESULT, HRESULT)
    580591NDR_SCALAR_PROTO(NTTIME, NTTIME)
    581592NDR_SCALAR_PROTO(NTTIME_1sec, NTTIME)
     
    590601enum ndr_err_code ndr_push_policy_handle(struct ndr_push *ndr, int ndr_flags, const struct policy_handle *r);
    591602void ndr_print_policy_handle(struct ndr_print *ndr, const char *name, const struct policy_handle *r);
    592 bool policy_handle_empty(const struct policy_handle *h);
    593 bool is_valid_policy_hnd(const struct policy_handle *hnd);
    594 bool policy_handle_equal(const struct policy_handle *hnd1,
     603bool ndr_policy_handle_empty(const struct policy_handle *h);
     604#define is_valid_policy_hnd(hnd) (!ndr_policy_handle_empty(hnd))
     605bool ndr_policy_handle_equal(const struct policy_handle *hnd1,
    595606                         const struct policy_handle *hnd2);
    596607
     
    643654NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid);
    644655NTSTATUS GUID_from_string(const char *s, struct GUID *guid);
    645 NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid);
    646656struct GUID GUID_zero(void);
    647657bool GUID_all_zero(const struct GUID *u);
     
    650660char *GUID_string2(TALLOC_CTX *mem_ctx, const struct GUID *guid);
    651661char *GUID_hexstring(TALLOC_CTX *mem_ctx, const struct GUID *guid);
    652 char *NS_GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid);
    653662struct GUID GUID_random(void);
     663
     664/* Format is "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" */
     665 /* 32 chars + 4 ' ' + \0 + 2 for adding {}  */
     666struct GUID_txt_buf { char buf[39]; };
     667_PUBLIC_ char* GUID_buf_string(const struct GUID *guid,
     668                               struct GUID_txt_buf *dst);
    654669
    655670_PUBLIC_ enum ndr_err_code ndr_pull_enum_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v);
     
    664679_PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b);
    665680
     681_PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
     682                                             int ndr_flags,
     683                                             const struct timespec *t);
     684_PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
     685                                             int ndr_flags,
     686                                             struct timespec *t);
     687_PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
     688                                 const struct timespec *t);
     689
     690_PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
     691                                            int ndr_flags,
     692                                            const struct timeval *t);
     693_PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
     694                                            int ndr_flags,
     695                                            struct timeval *t);
     696_PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
     697                                const struct timeval *t);
     698
     699
     700
    666701#endif /* __LIBNDR_H__ */
  • vendor/current/librpc/ndr/ndr.c

    r919 r988  
    1 /* 
     1/*
    22   Unix SMB/CIFS implementation.
    33
     
    55
    66   Copyright (C) Andrew Tridgell 2003
    7    
     7   Copyright (C) Jelmer Vernooij 2005-2008
     8
    89   This program is free software; you can redistribute it and/or modify
    910   it under the terms of the GNU General Public License as published by
    1011   the Free Software Foundation; either version 3 of the License, or
    1112   (at your option) any later version.
    12    
     13
    1314   This program is distributed in the hope that it will be useful,
    1415   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1516   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1617   GNU General Public License for more details.
    17    
     18
    1819   You should have received a copy of the GNU General Public License
    1920   along with this program.  If not, see <http://www.gnu.org/licenses/>.
     
    3031#include "librpc/ndr/libndr.h"
    3132#include "../lib/util/dlinklist.h"
    32 #if _SAMBA_BUILD_ == 4
    33 #include "param/param.h"
    34 #endif
    3533
    3634#define NDR_BASE_MARSHALL_SIZE 1024
    3735
    3836/* this guid indicates NDR encoding in a protocol tower */
    39 const struct ndr_syntax_id ndr_transfer_syntax = {
     37const struct ndr_syntax_id ndr_transfer_syntax_ndr = {
    4038  { 0x8a885d04, 0x1ceb, 0x11c9, {0x9f, 0xe8}, {0x08,0x00,0x2b,0x10,0x48,0x60} },
    4139  2
    4240};
    4341
    44 const struct ndr_syntax_id ndr64_transfer_syntax = {
     42const struct ndr_syntax_id ndr_transfer_syntax_ndr64 = {
    4543  { 0x71710533, 0xbeba, 0x4937, {0x83, 0x19}, {0xb5,0xdb,0xef,0x9c,0xcc,0x36} },
    4644  1
    4745};
    4846
    49 const struct ndr_syntax_id null_ndr_syntax_id = {
     47const struct ndr_syntax_id ndr_syntax_id_null = {
    5048  { 0, 0, 0, { 0, 0 }, { 0, 0, 0, 0, 0, 0 } },
    5149  0
     
    225223        ndr->data = talloc_array(ndr, uint8_t, ndr->alloc_size);
    226224        if (!ndr->data) {
     225                talloc_free(ndr);
    227226                return NULL;
    228227        }
     
    638637                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &content_size));
    639638                if (size_is >= 0 && size_is != content_size) {
    640                         return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d",
    641                                                 (int)size_is, (int)content_size);
     639                        return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) (0x%04x) mismatch content_size %d (0x%04x)",
     640                                                (int)size_is, (int)size_is,
     641                                                (int)content_size,
     642                                                (int)content_size);
    642643                }
    643644                r_content_size = content_size;
     
    649650                NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &content_size));
    650651                if (size_is >= 0 && size_is != content_size) {
    651                         return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d",
    652                                                 (int)size_is, (int)content_size);
     652                        return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) (0x%08x) mismatch content_size %d (0x%08x)",
     653                                                (int)size_is, (int)size_is,
     654                                                (int)content_size,
     655                                                (int)content_size);
    653656                }
    654657                r_content_size = content_size;
  • vendor/current/librpc/ndr/ndr_backupkey.c

    r740 r988  
    7272
    7373                level = backupkeyguid_to_uint(r->in.guidActionAgent);
     74                ndr_err = ndr_print_set_switch_value(ndr, &inblob, level);
     75                if (unlikely(!NDR_ERR_CODE_IS_SUCCESS(ndr_err))) {      \
     76                        DEBUG(0,("ERROR: ndr_print_bkrp_BackupKey ndr_print_set_switch_value failed: %d\n", ndr_err));
     77                        return;
     78                }
    7479                blob.data = r->in.data_in;
    7580                blob.length = r->in.data_in_len;
  • vendor/current/librpc/ndr/ndr_basic.c

    r919 r988  
    1 /* 
     1/*
    22   Unix SMB/CIFS implementation.
    33
     
    55
    66   Copyright (C) Andrew Tridgell 2003
    7    
     7
    88   This program is free software; you can redistribute it and/or modify
    99   it under the terms of the GNU General Public License as published by
    1010   the Free Software Foundation; either version 3 of the License, or
    1111   (at your option) any later version.
    12    
     12
    1313   This program is distributed in the hope that it will be useful,
    1414   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1515   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1616   GNU General Public License for more details.
    17    
     17
    1818   You should have received a copy of the GNU General Public License
    1919   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    2020*/
    2121
    22 #include "includes.h"
     22#include "replace.h"
    2323#include "system/network.h"
    2424#include "librpc/ndr/libndr.h"
    2525#include "lib/util/util_net.h"
     26#include "lib/util/debug.h"
     27#include "lib/util/util.h"
    2628
    2729#define NDR_SVAL(ndr, ofs) (NDR_BE(ndr)?RSVAL(ndr->data,ofs):SVAL(ndr->data,ofs))
     
    3234#define NDR_SIVALS(ndr, ofs, v) do { if (NDR_BE(ndr))  { RSIVALS(ndr->data,ofs,v); } else SIVALS(ndr->data,ofs,v); } while (0)
    3335
     36
     37static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len);
    3438
    3539/*
     
    168172                DEBUG(0,(__location__ ": non-zero upper 32 bits 0x%016llx\n",
    169173                         (unsigned long long)v64));
    170                 return NDR_ERR_NDR64;
     174                return ndr_pull_error(ndr, NDR_ERR_NDR64, __location__ ": non-zero upper 32 bits 0x%016llx\n",
     175                         (unsigned long long)v64);
    171176        }
    172177        return err;
     
    322327}
    323328
     329/*
     330  pull a HRESULT
     331*/
     332_PUBLIC_ enum ndr_err_code ndr_pull_HRESULT(struct ndr_pull *ndr, int ndr_flags, HRESULT *status)
     333{
     334        uint32_t v;
     335        NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     336        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
     337        *status = HRES_ERROR(v);
     338        return NDR_ERR_SUCCESS;
     339}
    324340
    325341/*
     
    412428        ndr->print(ndr, "%-25s: %s", name, win_errstr(r));
    413429}
     430
     431/*
     432  push a HRESULT
     433*/
     434_PUBLIC_ enum ndr_err_code ndr_push_HRESULT(struct ndr_push *ndr, int ndr_flags, HRESULT status)
     435{
     436        return ndr_push_uint32(ndr, NDR_SCALARS, HRES_ERROR_V(status));
     437}
     438
     439_PUBLIC_ void ndr_print_HRESULT(struct ndr_print *ndr, const char *name, HRESULT r)
     440{
     441        ndr->print(ndr, "%-25s: %s", name, hresult_errstr(r));
     442}
     443
    414444
    415445/*
     
    10031033}
    10041034
    1005 _PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type, 
     1035_PUBLIC_ void ndr_print_enum(struct ndr_print *ndr, const char *name, const char *type,
    10061036                    const char *val, uint32_t value)
    10071037{
     
    10151045_PUBLIC_ void ndr_print_bitmap_flag(struct ndr_print *ndr, size_t size, const char *flag_name, uint32_t flag, uint32_t value)
    10161046{
     1047        if (flag == 0) {
     1048                return;
     1049        }
     1050
    10171051        /* this is an attempt to support multi-bit bitmap masks */
    10181052        value &= flag;
     
    10211055                flag >>= 1;
    10221056                value >>= 1;
    1023         }       
     1057        }
    10241058        if (flag == 1) {
    10251059                ndr->print(ndr, "   %d: %-25s", value, flag_name);
     
    11591193}
    11601194
    1161 _PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, 
     1195_PUBLIC_ void ndr_print_array_uint8(struct ndr_print *ndr, const char *name,
    11621196                           const uint8_t *data, uint32_t count)
    11631197{
    11641198        int i;
     1199#define _ONELINE_LIMIT 32
    11651200
    11661201        if (data == NULL) {
     
    11691204        }
    11701205
    1171         if (count <= 600 && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
    1172                 char s[1202];
     1206        if (count <= _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
     1207                char s[(_ONELINE_LIMIT + 1) * 2];
    11731208                for (i=0;i<count;i++) {
    11741209                        snprintf(&s[i*2], 3, "%02x", data[i]);
     
    11801215
    11811216        ndr->print(ndr, "%s: ARRAY(%d)", name, count);
     1217        if (count > _ONELINE_LIMIT && (ndr->flags & LIBNDR_PRINT_ARRAY_HEX)) {
     1218                ndr_dump_data(ndr, data, count);
     1219                return;
     1220        }
     1221
    11821222        ndr->depth++;
    11831223        for (i=0;i<count;i++) {
     
    11881228                }
    11891229        }
    1190         ndr->depth--;   
    1191 }
    1192 
    1193 static void ndr_print_asc(struct ndr_print *ndr, const uint8_t *buf, int len)
    1194 {
    1195         int i;
    1196         for (i=0;i<len;i++)
    1197                 ndr->print(ndr, "%c", isprint(buf[i])?buf[i]:'.');
     1230        ndr->depth--;
     1231#undef _ONELINE_LIMIT
     1232}
     1233
     1234static void ndr_print_dump_data_cb(const char *buf, void *private_data)
     1235{
     1236        struct ndr_print *ndr = (struct ndr_print *)private_data;
     1237
     1238        ndr->print(ndr, "%s", buf);
    11981239}
    11991240
     
    12031244static void ndr_dump_data(struct ndr_print *ndr, const uint8_t *buf, int len)
    12041245{
    1205         int i=0;
    1206 
    12071246        ndr->no_newline = true;
    1208 
    1209         for (i=0;i<len;) {
    1210                 if (i%16 == 0 && i<len) {
    1211                         ndr->print(ndr, "[%04X] ",i);
    1212                 }
    1213 
    1214                 ndr->print(ndr, "%02X ",(int)buf[i]);
    1215                 i++;
    1216                 if (i%8 == 0) ndr->print(ndr,"  ");
    1217                 if (i%16 == 0) {
    1218                         ndr_print_asc(ndr,&buf[i-16],8); ndr->print(ndr," ");
    1219                         ndr_print_asc(ndr,&buf[i-8],8); ndr->print(ndr, "\n");
    1220                 }
    1221         }
    1222 
    1223         if (i%16) {
    1224                 int n;
    1225                 n = 16 - (i%16);
    1226                 ndr->print(ndr, " ");
    1227                 if (n>8) ndr->print(ndr," ");
    1228                 while (n--) ndr->print(ndr,"   ");
    1229                 n = MIN(8,i%16);
    1230                 ndr_print_asc(ndr,&buf[i-(i%16)],n); ndr->print(ndr, " ");
    1231                 n = (i%16) - n;
    1232                 if (n>0) ndr_print_asc(ndr,&buf[i-n],n);
    1233                 ndr->print(ndr,"\n");
    1234         }
    1235 
     1247        dump_data_cb(buf, len, true, ndr_print_dump_data_cb, ndr);
    12361248        ndr->no_newline = false;
    12371249}
     
    12541266 * 2) When called with the LIBNDR_FLAG_REMAINING flag, push the byte array to
    12551267 *    the ndr buffer.
    1256  * 3) Otherwise, push a uint32 length _and_ a corresponding byte array to the
     1268 * 3) Otherwise, push a uint3264 length _and_ a corresponding byte array to the
    12571269 *    ndr buffer.
    12581270 */
     
    12721284                data_blob_clear(&blob);
    12731285        } else {
    1274                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length));
     1286                NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, blob.length));
    12751287        }
    12761288        NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length));
     
    12851297 * 2) When called with the LIBNDR_FLAG_REMAINING flag, pull all remaining bytes
    12861298 *    from the ndr buffer.
    1287  * 3) Otherwise, pull a uint32 length _and_ a corresponding byte array from the
     1299 * 3) Otherwise, pull a uint3264 length _and_ a corresponding byte array from the
    12881300 *    ndr buffer.
    12891301 */
     
    13061318                }
    13071319        } else {
    1308                 NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length));
     1320                NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &length));
    13091321        }
    13101322        NDR_PULL_NEED_BYTES(ndr, length);
     
    13491361        return NT_STATUS_INVALID_PARAMETER;
    13501362}
     1363
     1364_PUBLIC_ int ndr_map_error2errno(enum ndr_err_code ndr_err)
     1365{
     1366        switch (ndr_err) {
     1367        case NDR_ERR_SUCCESS:
     1368                return 0;
     1369        case NDR_ERR_BUFSIZE:
     1370                return ENOSPC;
     1371        case NDR_ERR_TOKEN:
     1372                return EINVAL;
     1373        case NDR_ERR_ALLOC:
     1374                return ENOMEM;
     1375        case NDR_ERR_ARRAY_SIZE:
     1376                return EMSGSIZE;
     1377        case NDR_ERR_INVALID_POINTER:
     1378                return EINVAL;
     1379        case NDR_ERR_UNREAD_BYTES:
     1380                return EOVERFLOW;
     1381        default:
     1382                break;
     1383        }
     1384
     1385        /* we should map all error codes to different status codes */
     1386        return EINVAL;
     1387}
     1388
     1389_PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
     1390                                             int ndr_flags,
     1391                                             const struct timespec *t)
     1392{
     1393        NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     1394        NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
     1395        NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec));
     1396        return NDR_ERR_SUCCESS;
     1397}
     1398
     1399_PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
     1400                                             int ndr_flags,
     1401                                             struct timespec *t)
     1402{
     1403        uint64_t secs;
     1404        uint32_t nsecs;
     1405        NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     1406        NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
     1407        NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs));
     1408        t->tv_sec = secs;
     1409        t->tv_nsec = nsecs;
     1410        return NDR_ERR_SUCCESS;
     1411}
     1412
     1413_PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
     1414                                 const struct timespec *t)
     1415{
     1416        ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
     1417                   (long)t->tv_nsec);
     1418}
     1419
     1420_PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
     1421                                            int ndr_flags,
     1422                                            const struct timeval *t)
     1423{
     1424        NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     1425        NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
     1426        NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec));
     1427        return NDR_ERR_SUCCESS;
     1428}
     1429
     1430_PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
     1431                                            int ndr_flags,
     1432                                            struct timeval *t)
     1433{
     1434        uint64_t secs;
     1435        uint32_t usecs;
     1436        NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     1437        NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
     1438        NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs));
     1439        t->tv_sec = secs;
     1440        t->tv_usec = usecs;
     1441        return NDR_ERR_SUCCESS;
     1442}
     1443
     1444_PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
     1445                                const struct timeval *t)
     1446{
     1447        ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
     1448                   (long)t->tv_usec);
     1449}
  • vendor/current/librpc/ndr/ndr_dcerpc.c

    r919 r988  
    2323#include "includes.h"
    2424#include "librpc/gen_ndr/ndr_dcerpc.h"
    25 
    2625#include "librpc/gen_ndr/ndr_misc.h"
    27 #include "lib/util/bitmap.h"
     26
     27/*
     28 * This function was generated by pidl and
     29 * has been extended by the (_available == 0) check.
     30 *
     31 * That's why we ignore the 80 char per line limit.
     32 */
     33enum ndr_err_code ndr_pull_dcerpc_bind_nak(struct ndr_pull *ndr, int ndr_flags, struct dcerpc_bind_nak *r)
     34{
     35        uint32_t size_versions_0 = 0;
     36        uint32_t cntr_versions_0;
     37        TALLOC_CTX *_mem_save_versions_0 = NULL;
     38        NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     39        if (ndr_flags & NDR_SCALARS) {
     40                uint32_t _available;
     41                NDR_CHECK(ndr_pull_align(ndr, 4));
     42                NDR_CHECK(ndr_pull_dcerpc_bind_nak_reason(ndr, NDR_SCALARS, &r->reject_reason));
     43                _available = ndr->data_size - ndr->offset;
     44                if (_available == 0) {
     45                        /*
     46                         * This works around a bug in older
     47                         * Samba (<= 4.1) releases.
     48                         *
     49                         * See bug #11327.
     50                         */
     51                        r->num_versions = 0;
     52                } else {
     53                        NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &r->num_versions));
     54                }
     55                size_versions_0 = r->num_versions;
     56                NDR_PULL_ALLOC_N(ndr, r->versions, size_versions_0);
     57                _mem_save_versions_0 = NDR_PULL_GET_MEM_CTX(ndr);
     58                NDR_PULL_SET_MEM_CTX(ndr, r->versions, 0);
     59                for (cntr_versions_0 = 0; cntr_versions_0 < (size_versions_0); cntr_versions_0++) {
     60                        NDR_CHECK(ndr_pull_dcerpc_bind_nak_version(ndr, NDR_SCALARS, &r->versions[cntr_versions_0]));
     61                }
     62                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_versions_0, 0);
     63                {
     64                        uint32_t _flags_save_DATA_BLOB = ndr->flags;
     65                        ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING);
     66                        NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->_pad));
     67                        ndr->flags = _flags_save_DATA_BLOB;
     68                }
     69                NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
     70        }
     71        if (ndr_flags & NDR_BUFFERS) {
     72        }
     73        return NDR_ERR_SUCCESS;
     74}
    2875
    2976const uint8_t DCERPC_SEC_VT_MAGIC[] = {0x8a,0xe3,0x13,0x71,0x02,0xf4,0x36,0x71};
  • vendor/current/librpc/ndr/ndr_dcerpc.h

    r919 r988  
    2424        struct ndr_pull *ndr, TALLOC_CTX *mem_ctx,
    2525        struct dcerpc_sec_verification_trailer **_r);
     26
     27#ifndef NDR_DCERPC_REQUEST_OBJECT_PRESENT
     28#define NDR_DCERPC_REQUEST_OBJECT_PRESENT (ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT)
     29#endif /* NDR_DCERPC_REQUEST_OBJECT_PRESENT */
  • vendor/current/librpc/ndr/ndr_dns.c

    r740 r988  
    3131#include "librpc/gen_ndr/ndr_dns.h"
    3232#include "librpc/gen_ndr/ndr_misc.h"
     33#include "librpc/gen_ndr/ndr_dnsp.h"
    3334#include "system/locale.h"
    3435#include "lib/util/util_net.h"
     
    8687                        return ndr_pull_error(ndr, NDR_ERR_STRING,
    8788                                              "BAD DNS NAME component, " \
    88                                               "reserved lenght field: 0x%02x",
     89                                              "reserved length field: 0x%02x",
    8990                                              (len &0xC));
    9091                }
    91                 if (*offset + len + 2 > ndr->data_size) {
     92                if (*offset + len + 1 > ndr->data_size) {
    9293                        return ndr_pull_error(ndr, NDR_ERR_STRING,
    9394                                              "BAD DNS NAME component, "\
     
    169170                uint32_t offset;
    170171
    171                 /* see if we have pushed the remaing string allready,
     172                /* see if we have pushed the remaining string already,
    172173                 * if so we use a label pointer to this string
    173174                 */
     
    229230         */
    230231        return ndr_push_bytes(ndr, (const uint8_t *)"", 1);
     232}
     233
     234_PUBLIC_ enum ndr_err_code ndr_pull_dns_txt_record(struct ndr_pull *ndr, int ndr_flags, struct dns_txt_record *r)
     235{
     236        NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     237        if (ndr_flags & NDR_SCALARS) {
     238                enum ndr_err_code ndr_err;
     239                uint32_t data_size = ndr->data_size;
     240                uint32_t record_size = 0;
     241                ndr_err = ndr_token_retrieve(&ndr->array_size_list, r,
     242                                             &record_size);
     243                if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     244                        NDR_PULL_NEED_BYTES(ndr, record_size);
     245                        ndr->data_size = ndr->offset + record_size;
     246                }
     247                NDR_CHECK(ndr_pull_align(ndr, 1));
     248                NDR_CHECK(ndr_pull_dnsp_string_list(ndr, NDR_SCALARS, &r->txt));
     249                NDR_CHECK(ndr_pull_trailer_align(ndr, 1));
     250                ndr->data_size = data_size;
     251        }
     252        if (ndr_flags & NDR_BUFFERS) {
     253        }
     254        return NDR_ERR_SUCCESS;
    231255}
    232256
     
    257281                                                      NDR_ERR_LENGTH,
    258282                                                      "Invalid...Unexpected " \
    259                                                       "blob lenght is too " \
     283                                                      "blob length is too " \
    260284                                                      "large");
    261285                        }
     
    263287                if (r->unexpected.length > UINT16_MAX) {
    264288                        return ndr_push_error(ndr, NDR_ERR_LENGTH,
    265                                               "Unexpected blob lenght "\
     289                                              "Unexpected blob length "\
    266290                                              "is too large");
    267291                }
     
    303327                _saved_offset1 = ndr->offset;
    304328                if (r->length > 0) {
     329                        NDR_CHECK(ndr_token_store(ndr, &ndr->array_size_list,
     330                                                  &r->rdata,
     331                                                  r->length));
    305332                        NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->rdata,
    306333                                                            r->rr_type));
  • vendor/current/librpc/ndr/ndr_dnsp.c

    r740 r988  
    4949        ret = talloc_strdup(ndr->current_mem_ctx, "");
    5050        if (!ret) {
    51                 return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
     51                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name");
    5252        }
    5353        total_len = 1;
     
    6262                ret = talloc_realloc(ndr->current_mem_ctx, ret, char, newlen);
    6363                if (!ret) {
    64                         return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
     64                        return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name");
    6565                }
    6666                NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)&ret[total_len-1], sublen));
     
    7373        NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &termination));
    7474        if (termination != 0) {
    75                 return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp - not NUL terminated");
     75                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name - not NUL terminated");
    7676        }
    7777        if (ndr->offset > raw_offset + len) {
    78                 return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp - overrun by %u bytes",
     78                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_name - overrun by %u bytes",
    7979                                      ndr->offset - (raw_offset + len));
    8080        }
     
    136136{
    137137        uint8_t len;
    138         uint32_t total_len;
    139138        char *ret;
    140139
     
    143142        ret = talloc_strdup(ndr->current_mem_ctx, "");
    144143        if (!ret) {
    145                 return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
    146         }
    147         total_len = 1;
    148         ret = talloc_zero_array(ndr->current_mem_ctx, char, len+1);
     144                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string");
     145        }
     146        ret = talloc_zero_array(ndr->current_mem_ctx, char, len + 1);
    149147        if (!ret) {
    150                 return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp");
    151         }
    152         NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)&ret[total_len-1], len));
    153         total_len = len;
     148                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string");
     149        }
     150        NDR_CHECK(ndr_pull_bytes(ndr, (uint8_t *)ret, len));
    154151
    155152        (*string) = ret;
     
    161158{
    162159        int total_len;
    163         total_len = strlen(string) + 1;
     160        total_len = strlen(string);
    164161        if (total_len > 255) {
    165162                return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
     
    167164        }
    168165        NDR_CHECK(ndr_push_uint8(ndr, ndr_flags, (uint8_t)total_len));
    169         NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)string, total_len - 1));
    170         NDR_PUSH_ALIGN(ndr, 1);
    171 
    172         return NDR_ERR_SUCCESS;
    173 }
     166        NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)string, total_len));
     167
     168        return NDR_ERR_SUCCESS;
     169}
     170
     171/*
     172 * print a dnsp_string_list
     173 */
     174_PUBLIC_ void ndr_print_dnsp_string_list(struct ndr_print *ndr, const char *name,
     175                                         const struct dnsp_string_list *list)
     176{
     177        uint32_t i;
     178
     179        ndr->no_newline = true;
     180        for (i=0; i<ndr->depth; i++) {
     181                ndr->print(ndr, "    ");
     182        }
     183        ndr->print(ndr, "%-25s:", name);
     184        for (i=0; i<list->count; i++) {
     185                ndr->print(ndr, " \"%s\"", list->str[i]);
     186        }
     187        ndr->print(ndr, "\n");
     188        ndr->no_newline = false;
     189}
     190
     191/*
     192 * pull a dnsp_string_list
     193 */
     194_PUBLIC_ enum ndr_err_code ndr_pull_dnsp_string_list(struct ndr_pull *ndr, int ndr_flags, struct dnsp_string_list *list)
     195{
     196        list->count = 0;
     197        list->str = talloc_array(ndr->current_mem_ctx, const char *,
     198                                 list->count);
     199        if (! list->str) {
     200                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string_list");
     201        }
     202
     203        while (ndr->offset < ndr->data_size) {
     204                list->str = talloc_realloc(ndr->current_mem_ctx, list->str,
     205                                           const char *, list->count+1);
     206                if (! list->str) {
     207                        return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp_string_list");
     208                }
     209                NDR_CHECK(ndr_pull_dnsp_string(ndr, ndr_flags, &list->str[list->count]));
     210                list->count++;
     211        }
     212
     213        return NDR_ERR_SUCCESS;
     214}
     215
     216enum ndr_err_code ndr_push_dnsp_string_list(struct ndr_push *ndr, int ndr_flags, const struct dnsp_string_list *list)
     217{
     218        uint8_t i;
     219
     220        for (i=0; i<list->count; i++) {
     221                NDR_CHECK(ndr_push_dnsp_string(ndr, ndr_flags, list->str[i]));
     222        }
     223        return NDR_ERR_SUCCESS;
     224}
     225
     226enum ndr_err_code ndr_dnsp_string_list_copy(TALLOC_CTX *mem_ctx,
     227                                            const struct dnsp_string_list *src,
     228                                            struct dnsp_string_list *dst)
     229{
     230        size_t i;
     231
     232        dst->count = 0;
     233        dst->str = talloc_zero_array(mem_ctx, const char *, src->count);
     234        if (dst->str == NULL) {
     235                return NDR_ERR_ALLOC;
     236        }
     237
     238        for (i = 0; i < src->count; i++) {
     239                dst->str[i] = talloc_strdup(dst->str, src->str[i]);
     240                if (dst->str[i] == NULL) {
     241                        TALLOC_FREE(dst->str);
     242                        return NDR_ERR_ALLOC;
     243                }
     244        }
     245
     246        dst->count = src->count;
     247        return NDR_ERR_SUCCESS;
     248}
  • vendor/current/librpc/ndr/ndr_dnsp.h

    r740 r988  
    2828enum ndr_err_code ndr_pull_dnsp_string(struct ndr_pull *ndr, int ndr_flags, const char **string);
    2929enum ndr_err_code ndr_push_dnsp_string(struct ndr_push *ndr, int ndr_flags, const char *string);
     30
     31enum ndr_err_code ndr_dnsp_string_list_copy(TALLOC_CTX *mem_ctx,
     32                                            const struct dnsp_string_list *src,
     33                                            struct dnsp_string_list *dst);
  • vendor/current/librpc/ndr/ndr_drsblobs.c

    r740 r988  
    3333                        NDR_CHECK(ndr_push_AuthenticationInformation(ndr, NDR_SCALARS, &r->array[cntr_array_0]));
    3434                }
    35                 NDR_CHECK(ndr_push_trailer_align(ndr, 4));
     35                NDR_CHECK(ndr_push_align(ndr, 4));
    3636        }
    3737        if (ndr_flags & NDR_BUFFERS) {
     
    5252                        r->count++;
    5353                }
    54                 NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
     54                NDR_CHECK(ndr_pull_align(ndr, 4));
    5555        }
    5656        if (ndr_flags & NDR_BUFFERS) {
     
    6565                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
    6666                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (r->count > 0)?12:0));
    67                 NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (r->count > 0)?12 + ndr_size_AuthenticationInformationArray(&r->current, ndr_flags):0));
     67                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (r->count > 0)?12 + ndr_size_AuthenticationInformationArray(&r->current, 0):0));
    6868                {
    6969                        struct ndr_push *_ndr_current;
    70                         NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_current, 0, ((r->count > 0)?12 + ndr_size_AuthenticationInformationArray(&r->current, ndr_flags):0) - ((r->count > 0)?12:0)));
     70                        NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_current, 0, ((r->count > 0)?12 + ndr_size_AuthenticationInformationArray(&r->current, 0):0) - ((r->count > 0)?12:0)));
    7171                        NDR_CHECK(ndr_push_AuthenticationInformationArray(_ndr_current, NDR_SCALARS, &r->current));
    72                         NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_current, 0, ((r->count > 0)?12 + ndr_size_AuthenticationInformationArray(&r->current, ndr_flags):0) - ((r->count > 0)?12:0)));
     72                        NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_current, 0, ((r->count > 0)?12 + ndr_size_AuthenticationInformationArray(&r->current, 0):0) - ((r->count > 0)?12:0)));
    7373                }
    7474                {
  • vendor/current/librpc/ndr/ndr_drsuapi.c

    r740 r988  
    55
    66   Copyright (C) Stefan (metze) Metzmacher 2005
     7   Copyright (C) Matthieu Patou 2013
    78
    89   This program is free software; you can redistribute it and/or modify
     
    102103                                                const struct drsuapi_DsAttributeValue *r)
    103104{
    104         char *str;
     105        void *p;
     106        size_t converted_size = 0;
    105107
    106108        ndr_print_struct(ndr, name, "drsuapi_DsAttributeValue");
     
    110112                                   r->blob->data,
    111113                                   r->blob->length,
    112                                    (void **)&str, NULL, false)) {
     114                                   &p, &converted_size)) {
    113115                ndr_print_string(ndr, "string", "INVALID CONVERSION");
    114116        } else {
     117                char *str = (char *)p;
    115118                ndr_print_string(ndr, "string", str);
    116119                talloc_free(str);
     
    405408        }
    406409}
     410
     411enum ndr_err_code ndr_push_drsuapi_DsBindInfo(struct ndr_push *ndr, int ndr_flags, const union drsuapi_DsBindInfo *r)
     412{
     413        uint32_t _flags_save = ndr->flags;
     414        ndr->flags = ndr->flags & ~LIBNDR_FLAG_NDR64;
     415        NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
     416        if (ndr_flags & NDR_SCALARS) {
     417                uint32_t level = ndr_push_get_switch_value(ndr, r);
     418                NDR_CHECK(ndr_push_union_align(ndr, 4));
     419                switch (level) {
     420                        case 24: {
     421                                {
     422                                        struct ndr_push *_ndr_info24;
     423                                        NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info24, 0, 24));
     424                                        NDR_CHECK(ndr_push_drsuapi_DsBindInfo24(_ndr_info24, NDR_SCALARS, &r->info24));
     425                                        NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info24, 0, 24));
     426                                }
     427                        break; }
     428
     429                        case 28: {
     430                                {
     431                                        struct ndr_push *_ndr_info28;
     432                                        NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info28, 0, 28));
     433                                        NDR_CHECK(ndr_push_drsuapi_DsBindInfo28(_ndr_info28, NDR_SCALARS, &r->info28));
     434                                        NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info28, 0, 28));
     435                                }
     436                        break; }
     437
     438                        case 48: {
     439                                {
     440                                        struct ndr_push *_ndr_info48;
     441                                        NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info48, 0, 48));
     442                                        NDR_CHECK(ndr_push_drsuapi_DsBindInfo48(_ndr_info48, NDR_SCALARS, &r->info48));
     443                                        NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info48, 0, 48));
     444                                }
     445                        break; }
     446
     447                        case 52: {
     448                                {
     449                                        struct ndr_push *_ndr_info52;
     450                                        NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info52, 0, 52));
     451                                        NDR_CHECK(ndr_push_drsuapi_DsBindInfo52(_ndr_info52, NDR_SCALARS, &r->info52));
     452                                        NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info52, 0, 52));
     453                                }
     454                        break; }
     455
     456                        default: {
     457                                {
     458                                        struct ndr_push *_ndr_Fallback;
     459                                        NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_Fallback, 0, level));
     460                                        NDR_CHECK(ndr_push_drsuapi_DsBindInfoFallBack(_ndr_Fallback, NDR_SCALARS, &r->Fallback));
     461                                        NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_Fallback, 0, level));
     462                                }
     463                        break; }
     464
     465                }
     466        }
     467        if (ndr_flags & NDR_BUFFERS) {
     468                uint32_t level = ndr_push_get_switch_value(ndr, r);
     469                switch (level) {
     470                        case 24:
     471                        break;
     472
     473                        case 28:
     474                        break;
     475
     476                        case 48:
     477                        break;
     478
     479                        case 52:
     480                        break;
     481
     482                        default:
     483                        break;
     484
     485                }
     486        }
     487        ndr->flags = _flags_save;
     488        return NDR_ERR_SUCCESS;
     489}
     490
     491enum ndr_err_code ndr_pull_drsuapi_DsBindInfo(struct ndr_pull *ndr, int ndr_flags, union drsuapi_DsBindInfo *r)
     492{
     493        uint32_t level;
     494        uint32_t _flags_save = ndr->flags;
     495        ndr->flags = ndr->flags & ~LIBNDR_FLAG_NDR64;
     496        level = ndr_pull_get_switch_value(ndr, r);
     497        NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
     498        if (ndr_flags & NDR_SCALARS) {
     499                NDR_CHECK(ndr_pull_union_align(ndr, 4));
     500                switch (level) {
     501                        case 24: {
     502                                {
     503                                        struct ndr_pull *_ndr_info24;
     504                                        NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info24, 0, 24));
     505                                        NDR_CHECK(ndr_pull_drsuapi_DsBindInfo24(_ndr_info24, NDR_SCALARS, &r->info24));
     506                                        NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info24, 0, 24));
     507                                }
     508                        break; }
     509
     510                        case 28: {
     511                                {
     512                                        struct ndr_pull *_ndr_info28;
     513                                        NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info28, 0, 28));
     514                                        NDR_CHECK(ndr_pull_drsuapi_DsBindInfo28(_ndr_info28, NDR_SCALARS, &r->info28));
     515                                        NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info28, 0, 28));
     516                                }
     517                        break; }
     518
     519                        case 48: {
     520                                {
     521                                        struct ndr_pull *_ndr_info48;
     522                                        NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info48, 0, 48));
     523                                        NDR_CHECK(ndr_pull_drsuapi_DsBindInfo48(_ndr_info48, NDR_SCALARS, &r->info48));
     524                                        NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info48, 0, 48));
     525                                }
     526                        break; }
     527
     528                        case 52: {
     529                                {
     530                                        struct ndr_pull *_ndr_info52;
     531                                        NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info52, 0, 52));
     532                                        NDR_CHECK(ndr_pull_drsuapi_DsBindInfo52(_ndr_info52, NDR_SCALARS, &r->info52));
     533                                        NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info52, 0, 52));
     534                                }
     535                        break; }
     536
     537                        default: {
     538                                {
     539                                        struct ndr_pull *_ndr_Fallback;
     540                                        NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_Fallback, 0, level));
     541                                        NDR_CHECK(ndr_pull_drsuapi_DsBindInfoFallBack(_ndr_Fallback, NDR_SCALARS, &r->Fallback));
     542                                        NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_Fallback, 0, level));
     543                                }
     544                        break; }
     545
     546                }
     547        }
     548        if (ndr_flags & NDR_BUFFERS) {
     549                switch (level) {
     550                        case 24:
     551                        break;
     552
     553                        case 28:
     554                        break;
     555
     556                        case 48:
     557                        break;
     558
     559                        case 52:
     560                        break;
     561
     562                        default:
     563                        break;
     564
     565                }
     566        }
     567        ndr->flags = _flags_save;
     568        return NDR_ERR_SUCCESS;
     569}
     570
     571_PUBLIC_ void ndr_print_drsuapi_DsBindInfo(struct ndr_print *ndr, const char *name, const union drsuapi_DsBindInfo *r)
     572{
     573        uint32_t level;
     574        level = ndr_print_get_switch_value(ndr, r);
     575        ndr_print_union(ndr, name, level, "drsuapi_DsBindInfo");
     576        switch (level) {
     577                case 24:
     578                        ndr_print_drsuapi_DsBindInfo24(ndr, "info24", &r->info24);
     579                break;
     580
     581                case 28:
     582                        ndr_print_drsuapi_DsBindInfo28(ndr, "info28", &r->info28);
     583                break;
     584
     585                case 48:
     586                        ndr_print_drsuapi_DsBindInfo48(ndr, "info48", &r->info48);
     587                break;
     588
     589                case 52:
     590                        ndr_print_drsuapi_DsBindInfo52(ndr, "info52", &r->info52);
     591                break;
     592
     593                default:
     594                        ndr_print_drsuapi_DsBindInfoFallBack(ndr, "Fallback", &r->Fallback);
     595                break;
     596
     597        }
     598}
  • vendor/current/librpc/ndr/ndr_krb5pac.c

    r740 r988  
    116116                                }
    117117                                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
     118                                if (ndr->offset > ndr->relative_highest_offset) {
     119                                        ndr->relative_highest_offset = ndr->offset;
     120                                }
    118121                                ndr->offset = _relative_save_offset;
    119122                        }
  • vendor/current/librpc/ndr/ndr_ntprinting.c

    r860 r988  
    2929        if (string_flags & LIBNDR_FLAG_STR_ASCII) {
    3030                flags |= LIBNDR_FLAG_STR_ASCII;
     31        } else if (string_flags & LIBNDR_FLAG_STR_RAW8) {
     32                flags |= LIBNDR_FLAG_STR_RAW8;
    3133        } else {
    3234                flags |= LIBNDR_FLAG_STR_UTF8;
  • vendor/current/librpc/ndr/ndr_orpc.c

    r414 r988  
    9494        ndr->depth++;
    9595        for (i=0;ar->stringbindings[i];i++)     {
    96                 char *idx = NULL;
    97                 asprintf(&idx, "[%d]", i);
    98                 if (idx) {
    99                         ndr_print_STRINGBINDING(ndr, idx, ar->stringbindings[i]);
    100                         free(idx);
    101                 }
     96                char idx[13];   /* 2^32 has 10 digits */
     97                snprintf(idx, sizeof(idx), "[%d]", i);
     98                ndr_print_STRINGBINDING(ndr, idx, ar->stringbindings[i]);
    10299        }
    103100        ndr->depth--;
     
    105102        ndr->depth++;
    106103        for (i=0;ar->securitybindings[i];i++)   {
    107                 char *idx = NULL;
    108                 asprintf(&idx, "[%d]", i);
    109                 if (idx) {
    110                         ndr_print_SECURITYBINDING(ndr, idx, ar->securitybindings[i]);
    111                         free(idx);
    112                 }
     104                char idx[13];   /* 2^32 has 10 digits */
     105                snprintf(idx, sizeof(idx), "[%d]", i);
     106                ndr_print_SECURITYBINDING(ndr, idx, ar->securitybindings[i]);
    113107        }
    114108        ndr->depth--;
     
    163157        ndr->depth++;
    164158        for (i=0;ar->stringbindings[i];i++)     {
    165                 char *idx = NULL;
    166                 asprintf(&idx, "[%d]", i);
    167                 if (idx) {
    168                         ndr_print_STRINGBINDING(ndr, idx, ar->stringbindings[i]);
    169                         free(idx);
    170                 }
     159                char idx[13];   /* 2^32 has 10 digits */
     160                snprintf(idx, sizeof(idx), "[%d]", i);
     161                ndr_print_STRINGBINDING(ndr, idx, ar->stringbindings[i]);
    171162        }
    172163        ndr->depth--;
  • vendor/current/librpc/ndr/ndr_sec_helper.c

    r740 r988  
    229229                /* handle a w2k bug which send random data in the buffer */
    230230                ZERO_STRUCTP(sid);
    231         } else if (sid->num_auths == 0 && sid->sub_auths) {
     231        } else if (sid->num_auths == 0) {
    232232                ZERO_STRUCT(sid->sub_auths);
    233233        }
     
    315315                NDR_CHECK(ndr_push_int8(ndr, NDR_SCALARS, r->num_auths));
    316316                NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6));
     317                if (r->num_auths < 0 || r->num_auths > ARRAY_SIZE(r->sub_auths)) {
     318                        return ndr_push_error(ndr, NDR_ERR_RANGE, "value out of range");
     319                }
    317320                for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) {
    318321                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sub_auths[cntr_sub_auths_0]));
     
    329332                NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &r->sid_rev_num));
    330333                NDR_CHECK(ndr_pull_int8(ndr, NDR_SCALARS, &r->num_auths));
    331                 if (r->num_auths < 0 || r->num_auths > 15) {
     334                if (r->num_auths < 0 || r->num_auths > ARRAY_SIZE(r->sub_auths)) {
    332335                        return ndr_pull_error(ndr, NDR_ERR_RANGE, "value out of range");
    333336                }
    334337                NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6));
     338                ZERO_STRUCT(r->sub_auths);
    335339                for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) {
    336340                        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sub_auths[cntr_sub_auths_0]));
  • vendor/current/librpc/ndr/ndr_spoolss_buf.c

    r740 r988  
    2626#include "librpc/gen_ndr/ndr_spoolss.h"
    2727#include "librpc/gen_ndr/ndr_security.h"
    28 #if (_SAMBA_BUILD_ >= 4)
    29 #include "param/param.h"
    30 #endif
    3128
    3229#define NDR_SPOOLSS_PUSH_ENUM_IN(fn) do { \
  • vendor/current/librpc/ndr/ndr_string.c

    r746 r988  
    3131        uint32_t len1, ofs, len2;
    3232        uint16_t len3;
    33         size_t converted_size;
    34         int chset = CH_UTF16;
     33        size_t conv_src_len = 0, converted_size;
     34        int do_convert = 1, chset = CH_UTF16;
    3535        unsigned byte_mul = 2;
    3636        unsigned flags = ndr->flags;
     
    5555                byte_mul = 1;
    5656                flags &= ~LIBNDR_FLAG_STR_UTF8;
     57        }
     58
     59        if (flags & LIBNDR_FLAG_STR_RAW8) {
     60                do_convert = 0;
     61                byte_mul = 1;
     62                flags &= ~LIBNDR_FLAG_STR_RAW8;
    5763        }
    5864
     
    7480                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &len2));
    7581                if (len2 > len1) {
    76                         return ndr_pull_error(ndr, NDR_ERR_STRING, 
    77                                               "Bad string lengths len1=%u ofs=%u len2=%u\n", 
     82                        return ndr_pull_error(ndr, NDR_ERR_STRING,
     83                                              "Bad string lengths len1=%u ofs=%u len2=%u\n",
    7884                                              len1, ofs, len2);
    79                 }
    80                 NDR_PULL_NEED_BYTES(ndr, (len2 + c_len_term)*byte_mul);
    81                 if (len2 == 0) {
    82                         as = talloc_strdup(ndr->current_mem_ctx, "");
    83                 } else {
    84                         if (!convert_string_talloc(ndr->current_mem_ctx, chset,
    85                                                    CH_UNIX,
    86                                                    ndr->data+ndr->offset,
    87                                                    (len2 + c_len_term)*byte_mul,
    88                                                    (void **)(void *)&as,
    89                                                    &converted_size, false))
    90                         {
    91                                 return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    92                                                       "Bad character conversion with flags 0x%x", flags);
    93                         }
    94                 }
    95                 NDR_CHECK(ndr_pull_advance(ndr, (len2 + c_len_term)*byte_mul));
    96 
    97                 if (len1 != len2) {
     85                } else if (len1 != len2) {
    9886                        DEBUG(6,("len1[%u] != len2[%u] '%s'\n", len1, len2, as));
    9987                }
    100 
    101                 /* this is a way of detecting if a string is sent with the wrong
    102                    termination */
    103                 if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) {
    104                         if (strlen(as) < (len2 + c_len_term)) {
    105                                 DEBUG(6,("short string '%s'\n", as));
    106                         }
    107                 } else {
    108                         if (strlen(as) == (len2 + c_len_term)) {
    109                                 DEBUG(6,("long string '%s'\n", as));
    110                         }
    111                 }
    112                 *s = as;
     88                conv_src_len = len2 + c_len_term;
    11389                break;
    11490
     
    11692        case LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM:
    11793                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &len1));
    118                 NDR_PULL_NEED_BYTES(ndr, (len1 + c_len_term)*byte_mul);
    119                 if (len1 == 0) {
    120                         as = talloc_strdup(ndr->current_mem_ctx, "");
    121                 } else {
    122                         if (!convert_string_talloc(ndr->current_mem_ctx, chset,
    123                                                    CH_UNIX,
    124                                                    ndr->data+ndr->offset,
    125                                                    (len1 + c_len_term)*byte_mul,
    126                                                    (void **)(void *)&as,
    127                                                    &converted_size, false))
    128                         {
    129                                 return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    130                                                       "Bad character conversion with flags 0x%x", flags);
    131                         }
    132                 }
    133                 NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
    134 
    135                 /* this is a way of detecting if a string is sent with the wrong
    136                    termination */
    137                 if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) {
    138                         if (strlen(as) < (len1 + c_len_term)) {
    139                                 DEBUG(6,("short string '%s'\n", as));
    140                         }
    141                 } else {
    142                         if (strlen(as) == (len1 + c_len_term)) {
    143                                 DEBUG(6,("long string '%s'\n", as));
    144                         }
    145                 }
    146                 *s = as;
     94                conv_src_len = len1 + c_len_term;
    14795                break;
    14896
     
    155103                }
    156104                NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &len1));
    157                 NDR_PULL_NEED_BYTES(ndr, (len1 + c_len_term)*byte_mul);
    158                 if (len1 == 0) {
    159                         as = talloc_strdup(ndr->current_mem_ctx, "");
    160                 } else {
    161                         if (!convert_string_talloc(ndr->current_mem_ctx, chset,
    162                                                    CH_UNIX,
    163                                                    ndr->data+ndr->offset,
    164                                                    (len1 + c_len_term)*byte_mul,
    165                                                    (void **)(void *)&as,
    166                                                    &converted_size, false))
    167                         {
    168                                 return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    169                                                       "Bad character conversion with flags 0x%x", flags);
    170                         }
    171                 }
    172                 NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
    173 
    174                 /* this is a way of detecting if a string is sent with the wrong
    175                    termination */
    176                 if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) {
    177                         if (strlen(as) < (len1 + c_len_term)) {
    178                                 DEBUG(6,("short string '%s'\n", as));
    179                         }
    180                 } else {
    181                         if (strlen(as) == (len1 + c_len_term)) {
    182                                 DEBUG(6,("long string '%s'\n", as));
    183                         }
    184                 }
    185                 *s = as;
    186                 break;
    187 
     105                conv_src_len = len1 + c_len_term;
     106                break;
    188107
    189108        case LIBNDR_FLAG_STR_SIZE2:
    190109        case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM:
    191110                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &len3));
    192                 NDR_PULL_NEED_BYTES(ndr, (len3 + c_len_term)*byte_mul);
    193                 if (len3 == 0) {
    194                         as = talloc_strdup(ndr->current_mem_ctx, "");
    195                 } else {
    196                         if (!convert_string_talloc(ndr->current_mem_ctx, chset,
    197                                                    CH_UNIX,
    198                                                    ndr->data+ndr->offset,
    199                                                    (len3 + c_len_term)*byte_mul,
    200                                                    (void **)(void *)&as,
    201                                                    &converted_size, false))
    202                         {
    203                                 return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    204                                                       "Bad character conversion with flags 0x%x", flags);
    205                         }
    206                 }
    207                 NDR_CHECK(ndr_pull_advance(ndr, (len3 + c_len_term)*byte_mul));
    208 
    209                 /* this is a way of detecting if a string is sent with the wrong
    210                    termination */
    211                 if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) {
    212                         if (strlen(as) < (len3 + c_len_term)) {
    213                                 DEBUG(6,("short string '%s'\n", as));
    214                         }
    215                 } else {
    216                         if (strlen(as) == (len3 + c_len_term)) {
    217                                 DEBUG(6,("long string '%s'\n", as));
    218                         }
    219                 }
    220                 *s = as;
     111                conv_src_len = len3 + c_len_term;
    221112                break;
    222113
    223114        case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM|LIBNDR_FLAG_STR_BYTESIZE:
    224115                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &len3));
    225                 NDR_PULL_NEED_BYTES(ndr, len3);
    226                 if (len3 == 0) {
    227                         as = talloc_strdup(ndr->current_mem_ctx, "");
    228                 } else {
    229                         if (!convert_string_talloc(ndr->current_mem_ctx, chset,
    230                                                    CH_UNIX,
    231                                                    ndr->data+ndr->offset, len3,
    232                                                    (void **)(void *)&as,
    233                                                    &converted_size, false))
    234                         {
    235                                 return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    236                                                       "Bad character conversion with flags 0x%x", flags);
    237                         }
    238                 }
    239                 NDR_CHECK(ndr_pull_advance(ndr, len3));
    240                 *s = as;
     116                conv_src_len = len3;
     117                byte_mul = 1; /* the length is now absolute */
    241118                break;
    242119
    243120        case LIBNDR_FLAG_STR_NULLTERM:
    244121                if (byte_mul == 1) {
    245                         len1 = ascii_len_n((const char *)(ndr->data+ndr->offset), ndr->data_size - ndr->offset);
     122                        conv_src_len = ascii_len_n((const char *)(ndr->data+ndr->offset), ndr->data_size - ndr->offset);
    246123                } else {
    247                         len1 = utf16_len_n(ndr->data+ndr->offset, ndr->data_size - ndr->offset);
    248                 }
    249                 if (!convert_string_talloc(ndr->current_mem_ctx, chset, CH_UNIX,
    250                                            ndr->data+ndr->offset, len1,
    251                                            (void **)(void *)&as,
    252                                            &converted_size, false))
    253                 {
    254                         return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    255                                               "Bad character conversion with flags 0x%x", flags);
    256                 }
    257                 NDR_CHECK(ndr_pull_advance(ndr, len1));
    258                 *s = as;
     124                        conv_src_len = utf16_len_n(ndr->data+ndr->offset, ndr->data_size - ndr->offset);
     125                }
     126                byte_mul = 1; /* the length is now absolute */
    259127                break;
    260128
     
    264132                                              ndr->flags & LIBNDR_STRING_FLAGS);
    265133                }
    266 
    267                 len1 = ndr->data_size - ndr->offset;
    268 
    269                 NDR_PULL_NEED_BYTES(ndr, len1);
    270                 if (len1 == 0) {
    271                         as = talloc_strdup(ndr->current_mem_ctx, "");
    272                 } else {
    273                         if (!convert_string_talloc(ndr->current_mem_ctx, chset,
    274                                                    CH_UNIX,
    275                                                    ndr->data+ndr->offset, len1,
    276                                                    (void **)(void *)&as,
    277                                                    &converted_size, false))
    278                         {
    279                                 return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
    280                                                       "Bad character conversion with flags 0x%x", flags);
    281                         }
    282                 }
    283                 NDR_CHECK(ndr_pull_advance(ndr, len1));
    284 
    285                 *s = as;
     134                conv_src_len = ndr->data_size - ndr->offset;
     135                byte_mul = 1; /* the length is now absolute */
    286136                break;
    287137
     
    290140                                      ndr->flags & LIBNDR_STRING_FLAGS);
    291141        }
     142
     143        NDR_PULL_NEED_BYTES(ndr, conv_src_len * byte_mul);
     144        if (conv_src_len == 0) {
     145                as = talloc_strdup(ndr->current_mem_ctx, "");
     146                converted_size = 0;
     147        } else {
     148                if (!do_convert) {
     149                        as = talloc_strndup(ndr->current_mem_ctx,
     150                                            (char *)ndr->data + ndr->offset,
     151                                            conv_src_len);
     152                        if (!as) {
     153                                return ndr_pull_error(ndr, NDR_ERR_ALLOC,
     154                                                      "Failed to talloc_strndup() in RAW8 ndr_string_pull()");
     155                        }
     156                        converted_size = MIN(strlen(as)+1, conv_src_len);
     157                } else if (!convert_string_talloc(ndr->current_mem_ctx, chset,
     158                                           CH_UNIX, ndr->data + ndr->offset,
     159                                           conv_src_len * byte_mul,
     160                                           (void **)(void *)&as,
     161                                           &converted_size)) {
     162                        return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
     163                                              "Bad character conversion with flags 0x%x", flags);
     164                }
     165        }
     166
     167        /* this is a way of detecting if a string is sent with the wrong
     168           termination */
     169        if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) {
     170                if (as && converted_size > 0 && as[converted_size-1] == '\0') {
     171                        DEBUG(6,("short string '%s', sent with NULL termination despite NOTERM flag in IDL\n", as));
     172                }
     173        } else {
     174                if (as && converted_size > 0 && as[converted_size-1] != '\0') {
     175                        DEBUG(6,("long string '%s', send without NULL termination (which was expected)\n", as));
     176                }
     177        }
     178
     179        NDR_CHECK(ndr_pull_advance(ndr, conv_src_len * byte_mul));
     180        *s = as;
    292181
    293182        return NDR_ERR_SUCCESS;
     
    302191        ssize_t s_len, c_len;
    303192        size_t d_len;
    304         int chset = CH_UTF16;
     193        int do_convert = 1, chset = CH_UTF16;
    305194        unsigned flags = ndr->flags;
    306195        unsigned byte_mul = 2;
     
    329218        }
    330219
     220        if (flags & LIBNDR_FLAG_STR_RAW8) {
     221                do_convert = 0;
     222                byte_mul = 1;
     223                flags &= ~LIBNDR_FLAG_STR_RAW8;
     224        }
     225
    331226        flags &= ~LIBNDR_FLAG_STR_CONFORMANT;
    332227
     
    334229                s_len++;
    335230        }
    336         if (!convert_string_talloc(ndr, CH_UNIX, chset, s, s_len,
    337                                    (void **)(void *)&dest, &d_len, false))
     231
     232        if (!do_convert) {
     233                d_len = s_len;
     234                dest = (uint8_t *)talloc_strndup(ndr, s, s_len);
     235        } else if (!convert_string_talloc(ndr, CH_UNIX, chset, s, s_len,
     236                                   (void **)(void *)&dest, &d_len))
    338237        {
    339238                return ndr_push_error(ndr, NDR_ERR_CHARCNV,
     
    404303        unsigned c_len_term = 1;
    405304
    406         c_len = s?strlen_m(s):0;
    407 
    408         if (flags & (LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_UTF8)) {
     305        if (flags & LIBNDR_FLAG_STR_RAW8) {
     306                c_len = s?strlen(s):0;
     307        } else {
     308                c_len = s?strlen_m(s):0;
     309        }
     310
     311        if (flags & (LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_RAW8|LIBNDR_FLAG_STR_UTF8)) {
    409312                byte_mul = 1;
    410313        }
     
    612515        uint32_t i;
    613516        size_t size = 0;
     517        int rawbytes = 0;
     518
     519        if (flags & LIBNDR_FLAG_STR_RAW8) {
     520                rawbytes = 1;
     521                flags &= ~LIBNDR_FLAG_STR_RAW8;
     522        }
    614523
    615524        switch (flags & LIBNDR_STRING_FLAGS) {
    616525        case LIBNDR_FLAG_STR_NULLTERM:
    617526                for (i = 0; i < count; i++) {
    618                         size += strlen_m_term(a[i]);
     527                        size += rawbytes?strlen(a[i]) + 1:strlen_m_term(a[i]);
    619528                }
    620529                break;
    621530        case LIBNDR_FLAG_STR_NOTERM:
    622531                for (i = 0; i < count; i++) {
    623                         size += strlen_m(a[i]);
     532                        size += rawbytes?strlen(a[i]):strlen_m(a[i]);
    624533                }
    625534                break;
     
    651560
    652561        save_offset = ndr->offset;
    653         ndr_pull_advance(ndr, (count - 1) * element_size);
     562        NDR_CHECK(ndr_pull_advance(ndr, (count - 1) * element_size));
    654563        NDR_PULL_NEED_BYTES(ndr, element_size);
    655564
     
    685594                                   ndr->data+ndr->offset, length*byte_mul,
    686595                                   discard_const_p(void *, var),
    687                                    &converted_size, false))
     596                                   &converted_size))
    688597        {
    689598                return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
     
    712621
    713622        str_len = ndr_string_length(ndr->data+ndr->offset, byte_mul);
    714         str_len = MIN(str_len, length); /* overrun protection */
    715 
     623        str_len = MIN(str_len, length); /* overrun protection */
    716624        if (!convert_string_talloc(ndr->current_mem_ctx, chset, CH_UNIX,
    717625                                   ndr->data+ndr->offset, str_len*byte_mul,
    718626                                   discard_const_p(void *, var),
    719                                    &converted_size, false))
     627                                   &converted_size))
    720628        {
    721629                return ndr_pull_error(ndr, NDR_ERR_CHARCNV,
     
    729637_PUBLIC_ 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)
    730638{
    731         ssize_t ret, required;
     639        ssize_t required;
    732640
    733641        if (NDR_BE(ndr) && chset == CH_UTF16) {
     
    740648
    741649        if (required) {
    742                 ret = convert_string(CH_UNIX, chset,
     650                size_t size = 0;
     651                if (!convert_string(CH_UNIX, chset,
    743652                             var, strlen(var),
    744                              ndr->data+ndr->offset, required, false);
    745                 if (ret == -1) {
    746                         return ndr_push_error(ndr, NDR_ERR_CHARCNV,
    747                                               "Bad character conversion");
     653                             ndr->data+ndr->offset, required, &size)) {
     654                        return ndr_push_error(ndr, NDR_ERR_CHARCNV,
     655                                      "Bad character conversion");
    748656                }
    749657
    750658                /* Make sure the remaining part of the string is filled with zeroes */
    751                 if (ret < required) {
    752                         memset(ndr->data+ndr->offset+ret, 0, required-ret);
     659                if (size < required) {
     660                        memset(ndr->data+ndr->offset+size, 0, required-size);
    753661                }
    754662        }
     
    769677        case CH_UTF8:
    770678                return strlen_m_ext_term((const char *)var, CH_UNIX, chset);
    771         case CH_DISPLAY:
    772679        case CH_DOS:
    773680        case CH_UNIX:
  • vendor/current/librpc/ndr/ndr_table.c

    r414 r988  
    7474{
    7575        const struct ndr_interface_list *l;
    76         for (l=ndr_interfaces;l;l=l->next){
     76        for (l=ndr_table_list();l;l=l->next){
    7777                if (GUID_equal(&l->table->syntax_id.uuid, uuid) &&
    7878                    l->table->syntax_id.if_version == if_version) {
     
    9090{
    9191        const struct ndr_interface_list *l;
    92         for (l=ndr_interfaces;l;l=l->next) {
     92        for (l=ndr_table_list();l;l=l->next) {
    9393                if (strcasecmp(l->table->name, name) == 0) {
     94                        return l->table;
     95                }
     96        }
     97        return NULL;
     98}
     99
     100/*
     101  find a dcerpc interface by syntax
     102*/
     103const struct ndr_interface_table *ndr_table_by_syntax(const struct ndr_syntax_id *syntax)
     104{
     105        const struct ndr_interface_list *l;
     106        for (l=ndr_table_list();l;l=l->next) {
     107                if (ndr_syntax_id_equal(&l->table->syntax_id, syntax)) {
    94108                        return l->table;
    95109                }
     
    104118{
    105119        const struct ndr_interface_list *l;
    106         for (l=ndr_interfaces;l;l=l->next) {
     120        for (l=ndr_table_list();l;l=l->next) {
    107121                if (GUID_equal(&l->table->syntax_id.uuid, uuid)) {
    108122                        return l->table;
     
    117131const struct ndr_interface_list *ndr_table_list(void)
    118132{
     133        ndr_table_init();
    119134        return ndr_interfaces;
    120135}
  • vendor/current/librpc/ndr/ndr_table.h

    r740 r988  
    2828int ndr_interface_num_calls(const struct GUID *uuid, uint32_t if_version);
    2929const struct ndr_interface_table *ndr_table_by_name(const char *name);
     30const struct ndr_interface_table *ndr_table_by_syntax(const struct ndr_syntax_id *syntax);
    3031const struct ndr_interface_table *ndr_table_by_uuid(const struct GUID *uuid);
    3132const struct ndr_interface_list *ndr_table_list(void);
  • vendor/current/librpc/ndr/ndr_wmi.c

    r740 r988  
    2424#include "librpc/gen_ndr/ndr_dcom.h"
    2525#include "librpc/gen_ndr/ndr_wmi.h"
     26#include "librpc/ndr/ndr_wmi.h"
    2627
    2728// Just for debugging
  • vendor/current/librpc/ndr/uuid.c

    r740 r988  
    158158
    159159/**
    160   build a GUID from a string
    161 */
    162 _PUBLIC_ NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid)
    163 {
    164         NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
    165         uint32_t time_low;
    166         uint32_t time_mid, time_hi_and_version;
    167         uint32_t clock_seq[2];
    168         uint32_t node[6];
    169         int i;
    170 
    171         if (s == NULL) {
    172                 return NT_STATUS_INVALID_PARAMETER;
    173         }
    174 
    175         if (11 == sscanf(s, "%08x-%04x%04x-%02x%02x%02x%02x-%02x%02x%02x%02x",
    176                          &time_low, &time_mid, &time_hi_and_version,
    177                          &clock_seq[0], &clock_seq[1],
    178                          &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
    179                 status = NT_STATUS_OK;
    180         }
    181 
    182         if (!NT_STATUS_IS_OK(status)) {
    183                 return status;
    184         }
    185 
    186         guid->time_low = time_low;
    187         guid->time_mid = time_mid;
    188         guid->time_hi_and_version = time_hi_and_version;
    189         guid->clock_seq[0] = clock_seq[0];
    190         guid->clock_seq[1] = clock_seq[1];
    191         for (i=0;i<6;i++) {
    192                 guid->node[i] = node[i];
    193         }
    194 
    195         return NT_STATUS_OK;
    196 }
    197 
    198 /**
    199160 * generate a random GUID
    200161 */
     
    237198_PUBLIC_ bool GUID_equal(const struct GUID *u1, const struct GUID *u2)
    238199{
    239         if (u1->time_low != u2->time_low ||
    240             u1->time_mid != u2->time_mid ||
    241             u1->time_hi_and_version != u2->time_hi_and_version ||
    242             u1->clock_seq[0] != u2->clock_seq[0] ||
    243             u1->clock_seq[1] != u2->clock_seq[1] ||
    244             memcmp(u1->node, u2->node, 6) != 0) {
    245                 return false;
    246         }
    247         return true;
     200        return (GUID_compare(u1, u2) == 0);
    248201}
    249202
     
    278231_PUBLIC_ char *GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid)
    279232{
    280         return talloc_asprintf(mem_ctx,
    281                                "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
    282                                guid->time_low, guid->time_mid,
    283                                guid->time_hi_and_version,
    284                                guid->clock_seq[0],
    285                                guid->clock_seq[1],
    286                                guid->node[0], guid->node[1],
    287                                guid->node[2], guid->node[3],
    288                                guid->node[4], guid->node[5]);
     233        struct GUID_txt_buf buf;
     234        return talloc_strdup(mem_ctx, GUID_buf_string(guid, &buf));
     235}
     236
     237/**
     238 * Does the same without allocating memory, using the structure buffer.
     239 * Useful for debug messages, so that you do not have to talloc_free the result
     240 */
     241_PUBLIC_ char* GUID_buf_string(const struct GUID *guid,
     242                               struct GUID_txt_buf *dst)
     243{
     244        if (!guid) {
     245                return NULL;
     246        }
     247        snprintf(dst->buf, sizeof(dst->buf),
     248                 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
     249                 guid->time_low, guid->time_mid,
     250                 guid->time_hi_and_version,
     251                 guid->clock_seq[0],
     252                 guid->clock_seq[1],
     253                 guid->node[0], guid->node[1],
     254                 guid->node[2], guid->node[3],
     255                 guid->node[4], guid->node[5]);
     256        return dst->buf;
    289257}
    290258
     
    319287}
    320288
    321 _PUBLIC_ char *NS_GUID_string(TALLOC_CTX *mem_ctx, const struct GUID *guid)
    322 {
    323         return talloc_asprintf(mem_ctx,
    324                                "%08x-%04x%04x-%02x%02x%02x%02x-%02x%02x%02x%02x",
    325                                guid->time_low, guid->time_mid,
    326                                guid->time_hi_and_version,
    327                                guid->clock_seq[0],
    328                                guid->clock_seq[1],
    329                                guid->node[0], guid->node[1],
    330                                guid->node[2], guid->node[3],
    331                                guid->node[4], guid->node[5]);
    332 }
    333 
    334 _PUBLIC_ bool policy_handle_empty(const struct policy_handle *h)
     289_PUBLIC_ bool ndr_policy_handle_empty(const struct policy_handle *h)
    335290{
    336291        return (h->handle_type == 0 && GUID_all_zero(&h->uuid));
    337292}
    338293
    339 _PUBLIC_ bool is_valid_policy_hnd(const struct policy_handle *hnd)
    340 {
    341         return !policy_handle_empty(hnd);
    342 }
    343 
    344 _PUBLIC_ bool policy_handle_equal(const struct policy_handle *hnd1,
     294_PUBLIC_ bool ndr_policy_handle_equal(const struct policy_handle *hnd1,
    345295                                  const struct policy_handle *hnd2)
    346296{
Note: See TracChangeset for help on using the changeset viewer.