The branch, master has been updated via 3e1b26b selftest: more dfree command and smbclient disk usage tests via 275da6c smbclient: query disk usage relative to current directory via d865ed2 asn1: Make 'struct asn1_data' private via 44c56fc asn1: Remove a reference to asn1_data internals via 3c340d8 libcli: Remove a reference to asn1->ofs via b7f0e29 lib: Use asn1_current_ofs() via 927bbed asn1: Add asn1_current_ofs() via 1282f60 lib: Use asn1_has_nesting via 2a5141a asn1: Add asn1_has_nesting via a93946b lib: Use asn1_extract_blob() via 7b7aa01 asn1: Add asn1_extract_blob() via 8cfb6a3 lib: Use asn1_set_error() via 94b4459 asn1: Add asn1_set_error() via 57a0bc9 lib: Use asn1_has_error() via fa207fe asn1: Add asn1_has_error() via ef8049b asn1: Make "struct nesting" private via f908e65 asn1: Add some early returns via 249202d asn1: Add overflow check to asn1_write via ad630a6 asn1: Make asn1_peek_full_tag return 0/errno via 4580022 asn1: Remove an unused asn1 function from a44e4e9 ldb: validate ldb_dn_set_component input parameters even more strictly
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 3e1b26bd6d0998c3af3d77f94eaac469434389be Author: Uri Simchoni <u...@samba.org> Date: Wed Jan 6 00:12:36 2016 +0200 selftest: more dfree command and smbclient disk usage tests Add tests that cover disk usage printing by smbclient, as well as passing directory info to the "dfree command" script. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11662 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Wed Jan 6 03:58:59 CET 2016 on sn-devel-144 commit 275da6c5c7e7c5dd0581e919912eb82102903a46 Author: Uri Simchoni <u...@samba.org> Date: Wed Jan 6 00:08:25 2016 +0200 smbclient: query disk usage relative to current directory When querying disk usage in the "dir" and "du" commands, use the current directory. This behavior is compatible with Windows command shell "dir" command. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11662 Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d865ed20062cc5fc62313c25e7a6cb90763d0158 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 3 21:26:50 2016 +0100 asn1: Make 'struct asn1_data' private Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 44c56fc66788adf7b58f1d77a1e7d79d840ea9f6 Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 10:42:11 2016 +0100 asn1: Remove a reference to asn1_data internals Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3c340d81d8bf2e7b8488b150452bbcc4e3b521b6 Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 10:30:35 2016 +0100 libcli: Remove a reference to asn1->ofs Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b7f0e29fd2c30024d5a7da7aa6a1f0084612f9d2 Author: Volker Lendecke <v...@samba.org> Date: Tue Jan 5 10:55:44 2016 +0100 lib: Use asn1_current_ofs() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 927bbed6aaed9d454e8750aa053c5fa9fb1f1005 Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 10:25:41 2016 +0100 asn1: Add asn1_current_ofs() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1282f6063d53b2b86c91cf80c9b0d6a2cdb4ad7b Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 10:24:01 2016 +0100 lib: Use asn1_has_nesting Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2a5141a772f531ca113b9c2649ad79400c283749 Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 10:23:20 2016 +0100 asn1: Add asn1_has_nesting Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a93946b2fee6d6fedb9830d1dec593fca15fefc8 Author: Volker Lendecke <v...@samba.org> Date: Sat Jan 2 20:10:53 2016 +0100 lib: Use asn1_extract_blob() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7b7aa016df35ed7f8388a9df08d66a816adc1bf7 Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 21:53:23 2016 +0100 asn1: Add asn1_extract_blob() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8cfb6a313937964902940a7ebada7bacab7dbbb8 Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 21:51:07 2016 +0100 lib: Use asn1_set_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 94b44598a581539958d8f537742fcab44d21de4c Author: Volker Lendecke <v...@samba.org> Date: Mon Jan 4 21:50:49 2016 +0100 asn1: Add asn1_set_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 57a0bc9a9f3a02f809153dc19537110c4c796338 Author: Volker Lendecke <v...@samba.org> Date: Sat Jan 2 18:11:00 2016 +0100 lib: Use asn1_has_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit fa207fe9d17d27060e5e2989c19980103fd4778d Author: Volker Lendecke <v...@samba.org> Date: Sat Jan 2 17:58:21 2016 +0100 asn1: Add asn1_has_error() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ef8049b24353ea657d6fba989a294939c58895cb Author: Volker Lendecke <v...@samba.org> Date: Sun Dec 27 11:18:47 2015 +0100 asn1: Make "struct nesting" private Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f908e6560bcb06938bee9019d43b622eb31fb2c3 Author: Volker Lendecke <v...@samba.org> Date: Sun Dec 27 10:57:07 2015 +0100 asn1: Add some early returns Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 249202d8c04fae245ee373e7926484e33822c905 Author: Volker Lendecke <v...@samba.org> Date: Tue Dec 22 13:50:54 2015 +0100 asn1: Add overflow check to asn1_write Found by pure code reading :-) Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ad630a681e345cc7765f2a2f2dc1ba25ee0200c2 Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 21 10:41:39 2015 +0100 asn1: Make asn1_peek_full_tag return 0/errno We don't need the full power of NTSTATUS here. This was the only NTSTATUS in asn1.h, so I think it's worth removing it. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 45800223fd5fb8d35770d101882cfb2b19465944 Author: Volker Lendecke <v...@samba.org> Date: Sun Dec 20 21:49:26 2015 +0100 asn1: Remove an unused asn1 function Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: auth/gensec/gensec_util.c | 2 +- auth/gensec/spnego.c | 12 ++-- lib/util/asn1.c | 109 ++++++++++++++++++++--------- lib/util/asn1.h | 25 +++---- lib/util/tests/asn1_tests.c | 6 +- libcli/auth/spnego_parse.c | 50 ++++++------- libcli/cldap/cldap.c | 12 ++-- libcli/ldap/ldap_message.c | 32 ++++++--- selftest/target/Samba3.pm | 2 + source3/client/client.c | 2 +- source3/lib/tldap.c | 6 +- source3/libsmb/cli_smb2_fnum.c | 5 +- source3/libsmb/cli_smb2_fnum.h | 1 + source3/libsmb/clifile.c | 5 +- source3/libsmb/clispnego.c | 41 ++++++----- source3/libsmb/proto.h | 3 +- source3/script/tests/test_dfree_command.sh | 17 +++-- source3/torture/nbio.c | 2 +- source4/auth/gensec/gensec_krb5.c | 11 +-- source4/libcli/ldap/ldap_controls.c | 48 ++++++------- testprogs/blackbox/dfree.sh | 8 ++- 21 files changed, 240 insertions(+), 159 deletions(-) Changeset truncated at 500 lines: diff --git a/auth/gensec/gensec_util.c b/auth/gensec/gensec_util.c index 8ef4b25..64fffb1 100644 --- a/auth/gensec/gensec_util.c +++ b/auth/gensec/gensec_util.c @@ -81,7 +81,7 @@ static bool gensec_gssapi_check_oid(const DATA_BLOB *blob, const char *oid) if (!asn1_start_tag(data, ASN1_APPLICATION(0))) goto err; if (!asn1_check_OID(data, oid)) goto err; - ret = !data->has_error; + ret = !asn1_has_error(data); err: diff --git a/auth/gensec/spnego.c b/auth/gensec/spnego.c index 73c76eb..079a2bc 100644 --- a/auth/gensec/spnego.c +++ b/auth/gensec/spnego.c @@ -1095,26 +1095,24 @@ static NTSTATUS gensec_spnego_update_in(struct gensec_security *gensec_security, { struct spnego_state *spnego_state = (struct spnego_state *)gensec_security->private_data; size_t expected; - NTSTATUS status; bool ok; *full_in = data_blob_null; if (spnego_state->in_needed == 0) { size_t size = 0; + int ret; /* * try to work out the size of the full * input token, it might be fragmented */ - status = asn1_peek_full_tag(in, ASN1_APPLICATION(0), &size); - if (!NT_STATUS_IS_OK(status) && - !NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) { - status = asn1_peek_full_tag(in, ASN1_CONTEXT(1), &size); + ret = asn1_peek_full_tag(in, ASN1_APPLICATION(0), &size); + if ((ret != 0) && (ret != EAGAIN)) { + ret = asn1_peek_full_tag(in, ASN1_CONTEXT(1), &size); } - if (NT_STATUS_IS_OK(status) || - NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) { + if ((ret == 0) || (ret == EAGAIN)) { spnego_state->in_needed = size; } else { /* diff --git a/lib/util/asn1.c b/lib/util/asn1.c index 9f4924c..fed6590 100644 --- a/lib/util/asn1.c +++ b/lib/util/asn1.c @@ -20,6 +20,21 @@ #include "includes.h" #include "../lib/util/asn1.h" +struct nesting { + off_t start; + size_t taglen; /* for parsing */ + struct nesting *next; +}; + + +struct asn1_data { + uint8_t *data; + size_t length; + off_t ofs; + struct nesting *nesting; + bool has_error; +}; + /* allocate an asn1 structure */ struct asn1_data *asn1_init(TALLOC_CTX *mem_ctx) { @@ -36,10 +51,36 @@ void asn1_free(struct asn1_data *data) talloc_free(data); } +bool asn1_has_error(const struct asn1_data *data) +{ + return data->has_error; +} + +void asn1_set_error(struct asn1_data *data) +{ + data->has_error = true; +} + +bool asn1_has_nesting(const struct asn1_data *data) +{ + return data->nesting != NULL; +} + +off_t asn1_current_ofs(const struct asn1_data *data) +{ + return data->ofs; +} + /* write to the ASN1 buffer, advancing the buffer pointer */ bool asn1_write(struct asn1_data *data, const void *p, int len) { if (data->has_error) return false; + + if ((len < 0) || (data->ofs + (size_t)len < data->ofs)) { + data->has_error = true; + return false; + } + if (data->length < data->ofs+len) { uint8_t *newp; newp = talloc_realloc(data, data->data, uint8_t, data->ofs+len); @@ -66,7 +107,9 @@ bool asn1_push_tag(struct asn1_data *data, uint8_t tag) { struct nesting *nesting; - asn1_write_uint8(data, tag); + if (!asn1_write_uint8(data, tag)) { + return false; + } nesting = talloc(data, struct nesting); if (!nesting) { data->has_error = true; @@ -85,6 +128,10 @@ bool asn1_pop_tag(struct asn1_data *data) struct nesting *nesting; size_t len; + if (data->has_error) { + return false; + } + nesting = data->nesting; if (!nesting) { @@ -184,6 +231,10 @@ static bool push_int_bigendian(struct asn1_data *data, unsigned int i, bool nega bool asn1_write_implicit_Integer(struct asn1_data *data, int i) { + if (data->has_error) { + return false; + } + if (i == -1) { /* -1 is special as it consists of all-0xff bytes. In push_int_bigendian this is the only case that is not @@ -986,6 +1037,26 @@ bool asn1_blob(const struct asn1_data *asn1, DATA_BLOB *blob) return true; } +bool asn1_extract_blob(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, + DATA_BLOB *pblob) +{ + DATA_BLOB blob; + + if (!asn1_blob(asn1, &blob)) { + return false; + } + + *pblob = (DATA_BLOB) { .length = blob.length }; + pblob->data = talloc_move(mem_ctx, &blob.data); + + /* + * Stop access from here on + */ + asn1->has_error = true; + + return true; +} + /* Fill in an asn1 struct without making a copy */ @@ -996,35 +1067,7 @@ void asn1_load_nocopy(struct asn1_data *data, uint8_t *buf, size_t len) data->length = len; } -/* - check if a ASN.1 blob is a full tag -*/ -NTSTATUS asn1_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size) -{ - struct asn1_data *asn1 = asn1_init(NULL); - int size; - - NT_STATUS_HAVE_NO_MEMORY(asn1); - - asn1->data = blob.data; - asn1->length = blob.length; - if (!asn1_start_tag(asn1, tag)) { - talloc_free(asn1); - return STATUS_MORE_ENTRIES; - } - size = asn1_tag_remaining(asn1) + asn1->ofs; - - talloc_free(asn1); - - if (size > blob.length) { - return STATUS_MORE_ENTRIES; - } - - *packet_size = size; - return NT_STATUS_OK; -} - -NTSTATUS asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size) +int asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size) { struct asn1_data asn1; size_t size; @@ -1036,14 +1079,14 @@ NTSTATUS asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size) ok = asn1_peek_tag_needed_size(&asn1, tag, &size); if (!ok) { - return NT_STATUS_INVALID_BUFFER_SIZE; + return EMSGSIZE; } if (size > blob.length) { *packet_size = size; - return STATUS_MORE_ENTRIES; + return EAGAIN; } *packet_size = size; - return NT_STATUS_OK; + return 0; } diff --git a/lib/util/asn1.h b/lib/util/asn1.h index 568b4e4..4eb8506 100644 --- a/lib/util/asn1.h +++ b/lib/util/asn1.h @@ -20,20 +20,8 @@ #ifndef _ASN_1_H #define _ASN_1_H -struct nesting { - off_t start; - size_t taglen; /* for parsing */ - struct nesting *next; -}; - -struct asn1_data { - uint8_t *data; - size_t length; - off_t ofs; - struct nesting *nesting; - bool has_error; -}; - +struct nesting; +struct asn1_data; typedef struct asn1_data ASN1_DATA; #define ASN1_APPLICATION(x) ((x)+0x60) @@ -54,6 +42,10 @@ typedef struct asn1_data ASN1_DATA; struct asn1_data *asn1_init(TALLOC_CTX *mem_ctx); void asn1_free(struct asn1_data *data); +bool asn1_has_error(const struct asn1_data *data); +void asn1_set_error(struct asn1_data *data); +bool asn1_has_nesting(const struct asn1_data *data); +off_t asn1_current_ofs(const struct asn1_data *data); bool asn1_write(struct asn1_data *data, const void *p, int len); bool asn1_write_uint8(struct asn1_data *data, uint8_t v); bool asn1_push_tag(struct asn1_data *data, uint8_t tag); @@ -99,8 +91,9 @@ bool asn1_read_enumerated(struct asn1_data *data, int *v); bool asn1_check_enumerated(struct asn1_data *data, int v); bool asn1_write_enumerated(struct asn1_data *data, uint8_t v); bool asn1_blob(const struct asn1_data *asn1, DATA_BLOB *blob); +bool asn1_extract_blob(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, + DATA_BLOB *pblob); void asn1_load_nocopy(struct asn1_data *data, uint8_t *buf, size_t len); -NTSTATUS asn1_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size); -NTSTATUS asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size); +int asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size); #endif /* _ASN_1_H */ diff --git a/lib/util/tests/asn1_tests.c b/lib/util/tests/asn1_tests.c index 6dd7c64..e4b386a 100644 --- a/lib/util/tests/asn1_tests.c +++ b/lib/util/tests/asn1_tests.c @@ -337,8 +337,10 @@ static bool test_asn1_Integer(struct torture_context *tctx) if (!asn1_write_Integer(data, integer_tests[i].value)) goto err; - blob.data = data->data; - blob.length = data->length; + if (!asn1_blob(data, &blob)) { + goto err; + } + torture_assert_data_blob_equal(tctx, blob, integer_tests[i].blob, "asn1_write_Integer gave incorrect result"); if (!asn1_load(data, blob)) goto err; diff --git a/libcli/auth/spnego_parse.c b/libcli/auth/spnego_parse.c index d4c5bdc..1b294df 100644 --- a/libcli/auth/spnego_parse.c +++ b/libcli/auth/spnego_parse.c @@ -32,12 +32,12 @@ static bool read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, if (!asn1_start_tag(asn1, ASN1_CONTEXT(0))) return false; if (!asn1_start_tag(asn1, ASN1_SEQUENCE(0))) return false; - while (!asn1->has_error && 0 < asn1_tag_remaining(asn1)) { + while (!asn1_has_error(asn1) && 0 < asn1_tag_remaining(asn1)) { int i; uint8_t context; if (!asn1_peek_uint8(asn1, &context)) { - asn1->has_error = true; + asn1_set_error(asn1); break; } @@ -51,10 +51,10 @@ static bool read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, mechTypes = talloc(mem_ctx, const char *); if (mechTypes == NULL) { - asn1->has_error = true; + asn1_set_error(asn1); return false; } - for (i = 0; !asn1->has_error && + for (i = 0; !asn1_has_error(asn1) && 0 < asn1_tag_remaining(asn1); i++) { char *oid; const char **p; @@ -63,7 +63,7 @@ static bool read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, const char *, i+2); if (p == NULL) { talloc_free(mechTypes); - asn1->has_error = true; + asn1_set_error(asn1); return false; } mechTypes = p; @@ -97,7 +97,7 @@ static bool read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, uint8_t type_peek; if (!asn1_start_tag(asn1, ASN1_CONTEXT(3))) return false; if (!asn1_peek_uint8(asn1, &type_peek)) { - asn1->has_error = true; + asn1_set_error(asn1); break; } if (type_peek == ASN1_OCTET_STRING) { @@ -119,7 +119,7 @@ static bool read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, break; } default: - asn1->has_error = true; + asn1_set_error(asn1); break; } } @@ -127,7 +127,7 @@ static bool read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, if (!asn1_end_tag(asn1)) return false; if (!asn1_end_tag(asn1)) return false; - return !asn1->has_error; + return !asn1_has_error(asn1); } static bool write_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit *token) @@ -190,7 +190,7 @@ static bool write_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenIni if (!asn1_pop_tag(asn1)) return false; if (!asn1_pop_tag(asn1)) return false; - return !asn1->has_error; + return !asn1_has_error(asn1); } static bool read_negTokenTarg(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, @@ -201,11 +201,11 @@ static bool read_negTokenTarg(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, if (!asn1_start_tag(asn1, ASN1_CONTEXT(1))) return false; if (!asn1_start_tag(asn1, ASN1_SEQUENCE(0))) return false; - while (!asn1->has_error && 0 < asn1_tag_remaining(asn1)) { + while (!asn1_has_error(asn1) && 0 < asn1_tag_remaining(asn1)) { uint8_t context; char *oid; if (!asn1_peek_uint8(asn1, &context)) { - asn1->has_error = true; + asn1_set_error(asn1); break; } @@ -234,7 +234,7 @@ static bool read_negTokenTarg(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, if (!asn1_end_tag(asn1)) return false; break; default: - asn1->has_error = true; + asn1_set_error(asn1); break; } } @@ -242,7 +242,7 @@ static bool read_negTokenTarg(struct asn1_data *asn1, TALLOC_CTX *mem_ctx, if (!asn1_end_tag(asn1)) return false; if (!asn1_end_tag(asn1)) return false; - return !asn1->has_error; + return !asn1_has_error(asn1); } static bool write_negTokenTarg(struct asn1_data *asn1, struct spnego_negTokenTarg *token) @@ -279,7 +279,7 @@ static bool write_negTokenTarg(struct asn1_data *asn1, struct spnego_negTokenTar if (!asn1_pop_tag(asn1)) return false; if (!asn1_pop_tag(asn1)) return false; - return !asn1->has_error; + return !asn1_has_error(asn1); } ssize_t spnego_read_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, struct spnego_data *token) @@ -302,7 +302,7 @@ ssize_t spnego_read_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, struct spnego_data if (!asn1_load(asn1, data)) goto err; if (!asn1_peek_uint8(asn1, &context)) { - asn1->has_error = true; + asn1_set_error(asn1); } else { switch (context) { case ASN1_APPLICATION(0): @@ -319,12 +319,14 @@ ssize_t spnego_read_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, struct spnego_data } break; default: - asn1->has_error = true; + asn1_set_error(asn1); break; } } - if (!asn1->has_error) ret = asn1->ofs; + if (!asn1_has_error(asn1)) { + ret = asn1_current_ofs(asn1); + } err: @@ -353,15 +355,16 @@ ssize_t spnego_write_data(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct spnego_da write_negTokenTarg(asn1, &spnego->negTokenTarg); break; default: - asn1->has_error = true; + asn1_set_error(asn1); break; } - if (!asn1->has_error) { - *blob = data_blob_talloc(mem_ctx, asn1->data, asn1->length); - ret = asn1->ofs; + if (!asn1_extract_blob(asn1, mem_ctx, blob)) { + goto err; } + ret = asn1_current_ofs(asn1); + err: asn1_free(asn1); @@ -423,12 +426,11 @@ bool spnego_write_mech_types(TALLOC_CTX *mem_ctx, if (!asn1_pop_tag(asn1)) goto err; } - if (asn1->has_error) { + if (asn1_has_error(asn1)) { goto err; } - *blob = data_blob_talloc(mem_ctx, asn1->data, asn1->length); - if (blob->length != asn1->length) { + if (!asn1_extract_blob(asn1, mem_ctx, blob)) { goto err; } diff --git a/libcli/cldap/cldap.c b/libcli/cldap/cldap.c index 964cb0a..dd9d40b 100644 --- a/libcli/cldap/cldap.c +++ b/libcli/cldap/cldap.c @@ -220,7 +220,6 @@ nomem: static bool cldap_socket_recv_dgram(struct cldap_socket *c, struct cldap_incoming *in) { - DATA_BLOB blob; struct asn1_data *asn1; void *p; struct cldap_search_state *search; @@ -230,16 +229,12 @@ static bool cldap_socket_recv_dgram(struct cldap_socket *c, goto error; } - blob = data_blob_const(in->buf, in->len); - asn1 = asn1_init(in); if (!asn1) { goto nomem; } - if (!asn1_load(asn1, blob)) { - goto nomem; - } -- Samba Shared Repository