summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2007-05-21 06:12:06 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:52:42 -0500
commit7bb939b1cb2b39a8271cf16d9f5fce5312a9af10 (patch)
tree3210fa30663556e6ff238a3c9f6d17a209bf26b4
parent042ddf28ec036141b2457eb4bf6d2b0cec5cc790 (diff)
downloadsamba-7bb939b1cb2b39a8271cf16d9f5fce5312a9af10.tar.gz
samba-7bb939b1cb2b39a8271cf16d9f5fce5312a9af10.tar.bz2
samba-7bb939b1cb2b39a8271cf16d9f5fce5312a9af10.zip
r23030: finally fixed up our asn1 code to use better memory allocation. This
should allow us to fix some long standing memory leaks. (This used to be commit 3db49c2ec9968221c1361785b94061046ecd159d)
-rw-r--r--source4/auth/gensec/spnego.c8
-rw-r--r--source4/auth/gensec/spnego_parse.c75
-rw-r--r--source4/auth/kerberos/gssapi_parse.c60
-rw-r--r--source4/ldap_server/ldap_server.c10
-rw-r--r--source4/libcli/cldap/cldap.c16
-rw-r--r--source4/libcli/cldap/cldap.h2
-rw-r--r--source4/libcli/ldap/ldap.c297
-rw-r--r--source4/libcli/ldap/ldap_client.c11
-rw-r--r--source4/libcli/ldap/ldap_controls.c344
-rw-r--r--source4/libcli/util/asn1.c61
-rw-r--r--source4/librpc/ndr/ndr_drsuapi.c2
11 files changed, 437 insertions, 449 deletions
diff --git a/source4/auth/gensec/spnego.c b/source4/auth/gensec/spnego.c
index 79dc0ea6e7..5c9a518cdd 100644
--- a/source4/auth/gensec/spnego.c
+++ b/source4/auth/gensec/spnego.c
@@ -711,7 +711,7 @@ static NTSTATUS gensec_spnego_update(struct gensec_security *gensec_security, TA
NTSTATUS nt_status;
if (in.length) {
- len = spnego_read_data(in, &spnego);
+ len = spnego_read_data(gensec_security, in, &spnego);
if (len == -1) {
return gensec_spnego_server_try_fallback(gensec_security, spnego_state,
out_mem_ctx, in, out);
@@ -769,7 +769,7 @@ static NTSTATUS gensec_spnego_update(struct gensec_security *gensec_security, TA
return nt_status;
}
- len = spnego_read_data(in, &spnego);
+ len = spnego_read_data(gensec_security, in, &spnego);
if (len == -1) {
DEBUG(1, ("Invalid SPNEGO request:\n"));
@@ -834,7 +834,7 @@ static NTSTATUS gensec_spnego_update(struct gensec_security *gensec_security, TA
return NT_STATUS_INVALID_PARAMETER;
}
- len = spnego_read_data(in, &spnego);
+ len = spnego_read_data(gensec_security, in, &spnego);
if (len == -1) {
DEBUG(1, ("Invalid SPNEGO request:\n"));
@@ -880,7 +880,7 @@ static NTSTATUS gensec_spnego_update(struct gensec_security *gensec_security, TA
return NT_STATUS_INVALID_PARAMETER;
}
- len = spnego_read_data(in, &spnego);
+ len = spnego_read_data(gensec_security, in, &spnego);
if (len == -1) {
DEBUG(1, ("Invalid SPNEGO request:\n"));
diff --git a/source4/auth/gensec/spnego_parse.c b/source4/auth/gensec/spnego_parse.c
index 66e24bdbe5..c768d1e847 100644
--- a/source4/auth/gensec/spnego_parse.c
+++ b/source4/auth/gensec/spnego_parse.c
@@ -26,7 +26,8 @@
#include "auth/gensec/gensec.h"
#include "libcli/util/asn_1.h"
-static BOOL read_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit *token)
+static BOOL read_negTokenInit(struct asn1_data *asn1, TALLOC_CTX *mem_ctx,
+ struct spnego_negTokenInit *token)
{
ZERO_STRUCTP(token);
@@ -53,11 +54,7 @@ static BOOL read_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit
token->mechTypes = talloc_realloc(NULL,
token->mechTypes,
const char *, i+2);
- asn1_read_OID(asn1, token->mechTypes + i);
- if (token->mechTypes[i]) {
- talloc_steal(token->mechTypes,
- token->mechTypes[i]);
- }
+ asn1_read_OID(asn1, token->mechTypes, token->mechTypes + i);
}
token->mechTypes[i] = NULL;
@@ -74,7 +71,7 @@ static BOOL read_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit
/* Read mechToken */
case ASN1_CONTEXT(2):
asn1_start_tag(asn1, ASN1_CONTEXT(2));
- asn1_read_OctetString(asn1, &token->mechToken);
+ asn1_read_OctetString(asn1, mem_ctx, &token->mechToken);
asn1_end_tag(asn1);
break;
/* Read mecListMIC */
@@ -87,7 +84,7 @@ static BOOL read_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit
break;
}
if (type_peek == ASN1_OCTET_STRING) {
- asn1_read_OctetString(asn1,
+ asn1_read_OctetString(asn1, mem_ctx,
&token->mechListMIC);
} else {
/* RFC 2478 says we have an Octet String here,
@@ -95,7 +92,7 @@ static BOOL read_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit
char *mechListMIC;
asn1_push_tag(asn1, ASN1_SEQUENCE(0));
asn1_push_tag(asn1, ASN1_CONTEXT(0));
- asn1_read_GeneralString(asn1, &mechListMIC);
+ asn1_read_GeneralString(asn1, mem_ctx, &mechListMIC);
asn1_pop_tag(asn1);
asn1_pop_tag(asn1);
@@ -179,7 +176,8 @@ static BOOL write_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenIni
return !asn1->has_error;
}
-static BOOL read_negTokenTarg(struct asn1_data *asn1, struct spnego_negTokenTarg *token)
+static BOOL read_negTokenTarg(struct asn1_data *asn1, TALLOC_CTX *mem_ctx,
+ struct spnego_negTokenTarg *token)
{
ZERO_STRUCTP(token);
@@ -203,17 +201,17 @@ static BOOL read_negTokenTarg(struct asn1_data *asn1, struct spnego_negTokenTarg
break;
case ASN1_CONTEXT(1):
asn1_start_tag(asn1, ASN1_CONTEXT(1));
- asn1_read_OID(asn1, &token->supportedMech);
+ asn1_read_OID(asn1, mem_ctx, &token->supportedMech);
asn1_end_tag(asn1);
break;
case ASN1_CONTEXT(2):
asn1_start_tag(asn1, ASN1_CONTEXT(2));
- asn1_read_OctetString(asn1, &token->responseToken);
+ asn1_read_OctetString(asn1, mem_ctx, &token->responseToken);
asn1_end_tag(asn1);
break;
case ASN1_CONTEXT(3):
asn1_start_tag(asn1, ASN1_CONTEXT(3));
- asn1_read_OctetString(asn1, &token->mechListMIC);
+ asn1_read_OctetString(asn1, mem_ctx, &token->mechListMIC);
asn1_end_tag(asn1);
break;
default:
@@ -265,77 +263,74 @@ static BOOL write_negTokenTarg(struct asn1_data *asn1, struct spnego_negTokenTar
return !asn1->has_error;
}
-ssize_t spnego_read_data(DATA_BLOB data, struct spnego_data *token)
+ssize_t spnego_read_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, struct spnego_data *token)
{
- struct asn1_data asn1;
+ struct asn1_data *asn1 = asn1_init(mem_ctx);
ssize_t ret = -1;
uint8_t context;
ZERO_STRUCTP(token);
- ZERO_STRUCT(asn1);
if (data.length == 0) {
return ret;
}
- asn1_load(&asn1, data);
+ asn1_load(asn1, data);
- if (!asn1_peek_uint8(&asn1, &context)) {
- asn1.has_error = True;
+ if (!asn1_peek_uint8(asn1, &context)) {
+ asn1->has_error = True;
} else {
switch (context) {
case ASN1_APPLICATION(0):
- asn1_start_tag(&asn1, ASN1_APPLICATION(0));
- asn1_check_OID(&asn1, GENSEC_OID_SPNEGO);
- if (read_negTokenInit(&asn1, &token->negTokenInit)) {
+ asn1_start_tag(asn1, ASN1_APPLICATION(0));
+ asn1_check_OID(asn1, GENSEC_OID_SPNEGO);
+ if (read_negTokenInit(asn1, mem_ctx, &token->negTokenInit)) {
token->type = SPNEGO_NEG_TOKEN_INIT;
}
- asn1_end_tag(&asn1);
+ asn1_end_tag(asn1);
break;
case ASN1_CONTEXT(1):
- if (read_negTokenTarg(&asn1, &token->negTokenTarg)) {
+ if (read_negTokenTarg(asn1, mem_ctx, &token->negTokenTarg)) {
token->type = SPNEGO_NEG_TOKEN_TARG;
}
break;
default:
- asn1.has_error = True;
+ asn1->has_error = True;
break;
}
}
- if (!asn1.has_error) ret = asn1.ofs;
- asn1_free(&asn1);
+ if (!asn1->has_error) ret = asn1->ofs;
+ asn1_free(asn1);
return ret;
}
ssize_t spnego_write_data(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct spnego_data *spnego)
{
- struct asn1_data asn1;
+ struct asn1_data *asn1 = asn1_init(mem_ctx);
ssize_t ret = -1;
- ZERO_STRUCT(asn1);
-
switch (spnego->type) {
case SPNEGO_NEG_TOKEN_INIT:
- asn1_push_tag(&asn1, ASN1_APPLICATION(0));
- asn1_write_OID(&asn1, GENSEC_OID_SPNEGO);
- write_negTokenInit(&asn1, &spnego->negTokenInit);
- asn1_pop_tag(&asn1);
+ asn1_push_tag(asn1, ASN1_APPLICATION(0));
+ asn1_write_OID(asn1, GENSEC_OID_SPNEGO);
+ write_negTokenInit(asn1, &spnego->negTokenInit);
+ asn1_pop_tag(asn1);
break;
case SPNEGO_NEG_TOKEN_TARG:
- write_negTokenTarg(&asn1, &spnego->negTokenTarg);
+ write_negTokenTarg(asn1, &spnego->negTokenTarg);
break;
default:
- asn1.has_error = True;
+ asn1->has_error = True;
break;
}
- if (!asn1.has_error) {
- *blob = data_blob_talloc(mem_ctx, asn1.data, asn1.length);
- ret = asn1.ofs;
+ if (!asn1->has_error) {
+ *blob = data_blob_talloc(mem_ctx, asn1->data, asn1->length);
+ ret = asn1->ofs;
}
- asn1_free(&asn1);
+ asn1_free(asn1);
return ret;
}
diff --git a/source4/auth/kerberos/gssapi_parse.c b/source4/auth/kerberos/gssapi_parse.c
index cc9565a040..86a9e9554a 100644
--- a/source4/auth/kerberos/gssapi_parse.c
+++ b/source4/auth/kerberos/gssapi_parse.c
@@ -31,30 +31,28 @@
*/
DATA_BLOB gensec_gssapi_gen_krb5_wrap(TALLOC_CTX *mem_ctx, const DATA_BLOB *ticket, const uint8_t tok_id[2])
{
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
DATA_BLOB ret;
- if (!ticket->data) {
+ if (!data || !ticket->data) {
return data_blob(NULL,0);
}
- ZERO_STRUCT(data);
+ asn1_push_tag(data, ASN1_APPLICATION(0));
+ asn1_write_OID(data, GENSEC_OID_KERBEROS5);
- asn1_push_tag(&data, ASN1_APPLICATION(0));
- asn1_write_OID(&data, GENSEC_OID_KERBEROS5);
+ asn1_write(data, tok_id, 2);
+ asn1_write(data, ticket->data, ticket->length);
+ asn1_pop_tag(data);
- asn1_write(&data, tok_id, 2);
- asn1_write(&data, ticket->data, ticket->length);
- asn1_pop_tag(&data);
-
- if (data.has_error) {
- DEBUG(1,("Failed to build krb5 wrapper at offset %d\n", (int)data.ofs));
- asn1_free(&data);
+ if (data->has_error) {
+ DEBUG(1,("Failed to build krb5 wrapper at offset %d\n", (int)data->ofs));
+ asn1_free(data);
return data_blob(NULL,0);
}
- ret = data_blob_talloc(mem_ctx, data.data, data.length);
- asn1_free(&data);
+ ret = data_blob_talloc(mem_ctx, data->data, data->length);
+ asn1_free(data);
return ret;
}
@@ -65,29 +63,29 @@ DATA_BLOB gensec_gssapi_gen_krb5_wrap(TALLOC_CTX *mem_ctx, const DATA_BLOB *tick
BOOL gensec_gssapi_parse_krb5_wrap(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, DATA_BLOB *ticket, uint8_t tok_id[2])
{
BOOL ret;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
int data_remaining;
- asn1_load(&data, *blob);
- asn1_start_tag(&data, ASN1_APPLICATION(0));
- asn1_check_OID(&data, GENSEC_OID_KERBEROS5);
+ asn1_load(data, *blob);
+ asn1_start_tag(data, ASN1_APPLICATION(0));
+ asn1_check_OID(data, GENSEC_OID_KERBEROS5);
- data_remaining = asn1_tag_remaining(&data);
+ data_remaining = asn1_tag_remaining(data);
if (data_remaining < 3) {
- data.has_error = True;
+ data->has_error = True;
} else {
- asn1_read(&data, tok_id, 2);
+ asn1_read(data, tok_id, 2);
data_remaining -= 2;
*ticket = data_blob_talloc(mem_ctx, NULL, data_remaining);
- asn1_read(&data, ticket->data, ticket->length);
+ asn1_read(data, ticket->data, ticket->length);
}
- asn1_end_tag(&data);
+ asn1_end_tag(data);
- ret = !data.has_error;
+ ret = !data->has_error;
- asn1_free(&data);
+ asn1_free(data);
return ret;
}
@@ -99,15 +97,15 @@ BOOL gensec_gssapi_parse_krb5_wrap(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, D
BOOL gensec_gssapi_check_oid(const DATA_BLOB *blob, const char *oid)
{
BOOL ret;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(NULL);
- asn1_load(&data, *blob);
- asn1_start_tag(&data, ASN1_APPLICATION(0));
- asn1_check_OID(&data, oid);
+ asn1_load(data, *blob);
+ asn1_start_tag(data, ASN1_APPLICATION(0));
+ asn1_check_OID(data, oid);
- ret = !data.has_error;
+ ret = !data->has_error;
- asn1_free(&data);
+ asn1_free(data);
return ret;
}
diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c
index 738215cda5..9aefbed485 100644
--- a/source4/ldap_server/ldap_server.c
+++ b/source4/ldap_server/ldap_server.c
@@ -134,26 +134,26 @@ static NTSTATUS ldapsrv_decode(void *private, DATA_BLOB blob)
NTSTATUS status;
struct ldapsrv_connection *conn = talloc_get_type(private,
struct ldapsrv_connection);
- struct asn1_data asn1;
+ struct asn1_data *asn1 = asn1_init(conn);
struct ldap_message *msg = talloc(conn, struct ldap_message);
if (msg == NULL) {
return NT_STATUS_NO_MEMORY;
}
- if (!asn1_load(&asn1, blob)) {
+ if (!asn1_load(asn1, blob)) {
return NT_STATUS_NO_MEMORY;
}
- status = ldap_decode(&asn1, msg);
+ status = ldap_decode(asn1, msg);
if (!NT_STATUS_IS_OK(status)) {
- asn1_free(&asn1);
+ asn1_free(asn1);
return status;
}
data_blob_free(&blob);
ldapsrv_process_message(conn, msg);
- asn1_free(&asn1);
+ asn1_free(asn1);
return NT_STATUS_OK;
}
diff --git a/source4/libcli/cldap/cldap.c b/source4/libcli/cldap/cldap.c
index c68a037552..e92abe4d47 100644
--- a/source4/libcli/cldap/cldap.c
+++ b/source4/libcli/cldap/cldap.c
@@ -66,7 +66,7 @@ static void cldap_socket_recv(struct cldap_socket *cldap)
struct socket_address *src;
DATA_BLOB blob;
size_t nread, dsize;
- struct asn1_data asn1;
+ struct asn1_data *asn1 = asn1_init(tmp_ctx);
struct ldap_message *ldap_msg;
struct cldap_request *req;
@@ -93,12 +93,12 @@ static void cldap_socket_recv(struct cldap_socket *cldap)
DEBUG(2,("Received cldap packet of length %d from %s:%d\n",
(int)blob.length, src->addr, src->port));
- if (!asn1_load(&asn1, blob)) {
+ if (!asn1_load(asn1, blob)) {
DEBUG(2,("Failed to setup for asn.1 decode\n"));
talloc_free(tmp_ctx);
return;
}
- talloc_steal(tmp_ctx, asn1.data);
+ talloc_steal(tmp_ctx, asn1->data);
ldap_msg = talloc(tmp_ctx, struct ldap_message);
if (ldap_msg == NULL) {
@@ -107,7 +107,7 @@ static void cldap_socket_recv(struct cldap_socket *cldap)
}
/* this initial decode is used to find the message id */
- status = ldap_decode(&asn1, ldap_msg);
+ status = ldap_decode(asn1, ldap_msg);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(2,("Failed to decode ldap message: %s\n", nt_errstr(status)));
talloc_free(tmp_ctx);
@@ -128,8 +128,8 @@ static void cldap_socket_recv(struct cldap_socket *cldap)
}
req->asn1 = asn1;
- talloc_steal(req, asn1.data);
- req->asn1.ofs = 0;
+ talloc_steal(req, asn1->data);
+ req->asn1->ofs = 0;
req->state = CLDAP_REQUEST_DONE;
talloc_free(req->te);
@@ -456,7 +456,7 @@ NTSTATUS cldap_search_recv(struct cldap_request *req,
ldap_msg = talloc(mem_ctx, struct ldap_message);
NT_STATUS_HAVE_NO_MEMORY(ldap_msg);
- status = ldap_decode(&req->asn1, ldap_msg);
+ status = ldap_decode(req->asn1, ldap_msg);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(2,("Failed to decode cldap search reply: %s\n", nt_errstr(status)));
talloc_free(req);
@@ -472,7 +472,7 @@ NTSTATUS cldap_search_recv(struct cldap_request *req,
*io->out.response = ldap_msg->r.SearchResultEntry;
/* decode the 2nd part */
- status = ldap_decode(&req->asn1, ldap_msg);
+ status = ldap_decode(req->asn1, ldap_msg);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(2,("Failed to decode cldap search result entry: %s\n", nt_errstr(status)));
talloc_free(req);
diff --git a/source4/libcli/cldap/cldap.h b/source4/libcli/cldap/cldap.h
index 928cf1f3e4..4b4be0d316 100644
--- a/source4/libcli/cldap/cldap.h
+++ b/source4/libcli/cldap/cldap.h
@@ -59,7 +59,7 @@ struct cldap_request {
DATA_BLOB encoded;
/* the reply data */
- struct asn1_data asn1;
+ struct asn1_data *asn1;
/* information on what to do on completion */
struct {
diff --git a/source4/libcli/ldap/ldap.c b/source4/libcli/ldap/ldap.c
index 1e308d5847..70ba9335db 100644
--- a/source4/libcli/ldap/ldap.c
+++ b/source4/libcli/ldap/ldap.c
@@ -190,55 +190,54 @@ static void ldap_encode_response(struct asn1_data *data, struct ldap_Result *res
BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ctx)
{
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
int i, j;
- ZERO_STRUCT(data);
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
- asn1_write_Integer(&data, msg->messageid);
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
+ asn1_write_Integer(data, msg->messageid);
switch (msg->type) {
case LDAP_TAG_BindRequest: {
struct ldap_BindRequest *r = &msg->r.BindRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_Integer(&data, r->version);
- asn1_write_OctetString(&data, r->dn,
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_Integer(data, r->version);
+ asn1_write_OctetString(data, r->dn,
(r->dn != NULL) ? strlen(r->dn) : 0);
switch (r->mechanism) {
case LDAP_AUTH_MECH_SIMPLE:
/* context, primitive */
- asn1_push_tag(&data, ASN1_CONTEXT_SIMPLE(0));
- asn1_write(&data, r->creds.password,
+ asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(0));
+ asn1_write(data, r->creds.password,
strlen(r->creds.password));
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
case LDAP_AUTH_MECH_SASL:
/* context, constructed */
- asn1_push_tag(&data, ASN1_CONTEXT(3));
- asn1_write_OctetString(&data, r->creds.SASL.mechanism,
+ asn1_push_tag(data, ASN1_CONTEXT(3));
+ asn1_write_OctetString(data, r->creds.SASL.mechanism,
strlen(r->creds.SASL.mechanism));
if (r->creds.SASL.secblob) {
- asn1_write_OctetString(&data, r->creds.SASL.secblob->data,
+ asn1_write_OctetString(data, r->creds.SASL.secblob->data,
r->creds.SASL.secblob->length);
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
default:
return False;
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_BindResponse: {
struct ldap_BindResponse *r = &msg->r.BindResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, &r->response);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, &r->response);
if (r->SASL.secblob) {
- asn1_write_ContextSimple(&data, 7, r->SASL.secblob);
+ asn1_write_ContextSimple(data, 7, r->SASL.secblob);
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_UnbindRequest: {
@@ -247,223 +246,223 @@ BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ct
}
case LDAP_TAG_SearchRequest: {
struct ldap_SearchRequest *r = &msg->r.SearchRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->basedn, strlen(r->basedn));
- asn1_write_enumerated(&data, r->scope);
- asn1_write_enumerated(&data, r->deref);
- asn1_write_Integer(&data, r->sizelimit);
- asn1_write_Integer(&data, r->timelimit);
- asn1_write_BOOLEAN(&data, r->attributesonly);
-
- if (!ldap_push_filter(&data, r->tree)) {
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->basedn, strlen(r->basedn));
+ asn1_write_enumerated(data, r->scope);
+ asn1_write_enumerated(data, r->deref);
+ asn1_write_Integer(data, r->sizelimit);
+ asn1_write_Integer(data, r->timelimit);
+ asn1_write_BOOLEAN(data, r->attributesonly);
+
+ if (!ldap_push_filter(data, r->tree)) {
return False;
}
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
for (i=0; i<r->num_attributes; i++) {
- asn1_write_OctetString(&data, r->attributes[i],
+ asn1_write_OctetString(data, r->attributes[i],
strlen(r->attributes[i]));
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_SearchResultEntry: {
struct ldap_SearchResEntry *r = &msg->r.SearchResultEntry;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->dn, strlen(r->dn));
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->dn, strlen(r->dn));
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
for (i=0; i<r->num_attributes; i++) {
struct ldb_message_element *attr = &r->attributes[i];
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
- asn1_write_OctetString(&data, attr->name,
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
+ asn1_write_OctetString(data, attr->name,
strlen(attr->name));
- asn1_push_tag(&data, ASN1_SEQUENCE(1));
+ asn1_push_tag(data, ASN1_SEQUENCE(1));
for (j=0; j<attr->num_values; j++) {
- asn1_write_OctetString(&data,
+ asn1_write_OctetString(data,
attr->values[j].data,
attr->values[j].length);
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_SearchResultDone: {
struct ldap_Result *r = &msg->r.SearchResultDone;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, r);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, r);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_ModifyRequest: {
struct ldap_ModifyRequest *r = &msg->r.ModifyRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->dn, strlen(r->dn));
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->dn, strlen(r->dn));
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
for (i=0; i<r->num_mods; i++) {
struct ldb_message_element *attrib = &r->mods[i].attrib;
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
- asn1_write_enumerated(&data, r->mods[i].type);
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
- asn1_write_OctetString(&data, attrib->name,
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
+ asn1_write_enumerated(data, r->mods[i].type);
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
+ asn1_write_OctetString(data, attrib->name,
strlen(attrib->name));
- asn1_push_tag(&data, ASN1_SET);
+ asn1_push_tag(data, ASN1_SET);
for (j=0; j<attrib->num_values; j++) {
- asn1_write_OctetString(&data,
+ asn1_write_OctetString(data,
attrib->values[j].data,
attrib->values[j].length);
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_ModifyResponse: {
struct ldap_Result *r = &msg->r.ModifyResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, r);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, r);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_AddRequest: {
struct ldap_AddRequest *r = &msg->r.AddRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->dn, strlen(r->dn));
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->dn, strlen(r->dn));
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
for (i=0; i<r->num_attributes; i++) {
struct ldb_message_element *attrib = &r->attributes[i];
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
- asn1_write_OctetString(&data, attrib->name,
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
+ asn1_write_OctetString(data, attrib->name,
strlen(attrib->name));
- asn1_push_tag(&data, ASN1_SET);
+ asn1_push_tag(data, ASN1_SET);
for (j=0; j<r->attributes[i].num_values; j++) {
- asn1_write_OctetString(&data,
+ asn1_write_OctetString(data,
attrib->values[j].data,
attrib->values[j].length);
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_AddResponse: {
struct ldap_Result *r = &msg->r.AddResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, r);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, r);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_DelRequest: {
struct ldap_DelRequest *r = &msg->r.DelRequest;
- asn1_push_tag(&data, ASN1_APPLICATION_SIMPLE(msg->type));
- asn1_write(&data, r->dn, strlen(r->dn));
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION_SIMPLE(msg->type));
+ asn1_write(data, r->dn, strlen(r->dn));
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_DelResponse: {
struct ldap_Result *r = &msg->r.DelResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, r);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, r);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_ModifyDNRequest: {
struct ldap_ModifyDNRequest *r = &msg->r.ModifyDNRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->dn, strlen(r->dn));
- asn1_write_OctetString(&data, r->newrdn, strlen(r->newrdn));
- asn1_write_BOOLEAN(&data, r->deleteolddn);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->dn, strlen(r->dn));
+ asn1_write_OctetString(data, r->newrdn, strlen(r->newrdn));
+ asn1_write_BOOLEAN(data, r->deleteolddn);
if (r->newsuperior) {
- asn1_push_tag(&data, ASN1_CONTEXT_SIMPLE(0));
- asn1_write(&data, r->newsuperior,
+ asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(0));
+ asn1_write(data, r->newsuperior,
strlen(r->newsuperior));
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_ModifyDNResponse: {
struct ldap_Result *r = &msg->r.ModifyDNResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, r);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, r);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_CompareRequest: {
struct ldap_CompareRequest *r = &msg->r.CompareRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->dn, strlen(r->dn));
- asn1_push_tag(&data, ASN1_SEQUENCE(0));
- asn1_write_OctetString(&data, r->attribute,
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->dn, strlen(r->dn));
+ asn1_push_tag(data, ASN1_SEQUENCE(0));
+ asn1_write_OctetString(data, r->attribute,
strlen(r->attribute));
- asn1_write_OctetString(&data, r->value.data,
+ asn1_write_OctetString(data, r->value.data,
r->value.length);
- asn1_pop_tag(&data);
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_CompareResponse: {
struct ldap_Result *r = &msg->r.ModifyDNResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, r);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, r);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_AbandonRequest: {
struct ldap_AbandonRequest *r = &msg->r.AbandonRequest;
- asn1_push_tag(&data, ASN1_APPLICATION_SIMPLE(msg->type));
- asn1_write_implicit_Integer(&data, r->messageid);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION_SIMPLE(msg->type));
+ asn1_write_implicit_Integer(data, r->messageid);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_SearchResultReference: {
struct ldap_SearchResRef *r = &msg->r.SearchResultReference;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_write_OctetString(&data, r->referral, strlen(r->referral));
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_write_OctetString(data, r->referral, strlen(r->referral));
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_ExtendedRequest: {
struct ldap_ExtendedRequest *r = &msg->r.ExtendedRequest;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- asn1_push_tag(&data, ASN1_CONTEXT_SIMPLE(0));
- asn1_write(&data, r->oid, strlen(r->oid));
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(0));
+ asn1_write(data, r->oid, strlen(r->oid));
+ asn1_pop_tag(data);
if (r->value) {
- asn1_push_tag(&data, ASN1_CONTEXT_SIMPLE(1));
- asn1_write(&data, r->value->data, r->value->length);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(1));
+ asn1_write(data, r->value->data, r->value->length);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
}
case LDAP_TAG_ExtendedResponse: {
struct ldap_ExtendedResponse *r = &msg->r.ExtendedResponse;
- asn1_push_tag(&data, ASN1_APPLICATION(msg->type));
- ldap_encode_response(&data, &r->response);
+ asn1_push_tag(data, ASN1_APPLICATION(msg->type));
+ ldap_encode_response(data, &r->response);
if (r->oid) {
- asn1_push_tag(&data, ASN1_CONTEXT_SIMPLE(10));
- asn1_write(&data, r->oid, strlen(r->oid));
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(10));
+ asn1_write(data, r->oid, strlen(r->oid));
+ asn1_pop_tag(data);
}
if (r->value) {
- asn1_push_tag(&data, ASN1_CONTEXT_SIMPLE(11));
- asn1_write(&data, r->value->data, r->value->length);
- asn1_pop_tag(&data);
+ asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(11));
+ asn1_write(data, r->value->data, r->value->length);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
break;
}
default:
@@ -471,26 +470,26 @@ BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ct
}
if (msg->controls != NULL) {
- asn1_push_tag(&data, ASN1_CONTEXT(0));
+ asn1_push_tag(data, ASN1_CONTEXT(0));
for (i = 0; msg->controls[i] != NULL; i++) {
- if (!ldap_encode_control(mem_ctx, &data, msg->controls[i])) {
+ if (!ldap_encode_control(mem_ctx, data, msg->controls[i])) {
return False;
}
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
}
- asn1_pop_tag(&data);
+ asn1_pop_tag(data);
- if (data.has_error) {
- asn1_free(&data);
+ if (data->has_error) {
+ asn1_free(data);
return False;
}
- *result = data_blob_talloc(mem_ctx, data.data, data.length);
- asn1_free(&data);
+ *result = data_blob_talloc(mem_ctx, data->data, data->length);
+ asn1_free(data);
return True;
}
@@ -508,7 +507,7 @@ static BOOL asn1_read_OctetString_talloc(TALLOC_CTX *mem_ctx,
const char **result)
{
DATA_BLOB string;
- if (!asn1_read_OctetString(data, &string))
+ if (!asn1_read_OctetString(data, mem_ctx, &string))
return False;
*result = blob2string_talloc(mem_ctx, string);
data_blob_free(&string);
@@ -631,7 +630,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
asn1_start_tag(data, ASN1_CONTEXT(filter_tag));
asn1_read_OctetString_talloc(mem_ctx, data, &attrib);
- asn1_read_OctetString(data, &value);
+ asn1_read_OctetString(data, mem_ctx, &value);
asn1_end_tag(data);
if ((data->has_error) || (attrib == NULL) || (value.data == NULL)) {
goto failed;
@@ -653,7 +652,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
if (!asn1_start_tag(data, ASN1_CONTEXT(filter_tag))) {
goto failed;
}
- if (!asn1_read_OctetString(data, &attr)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &attr)) {
goto failed;
}
@@ -673,7 +672,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
if (subs_tag > 2) goto failed;
asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(subs_tag));
- asn1_read_LDAPString(data, &value);
+ asn1_read_LDAPString(data, mem_ctx, &value);
asn1_end_tag(data);
switch (subs_tag) {
@@ -743,7 +742,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
asn1_start_tag(data, ASN1_CONTEXT(filter_tag));
asn1_read_OctetString_talloc(mem_ctx, data, &attrib);
- asn1_read_OctetString(data, &value);
+ asn1_read_OctetString(data, mem_ctx, &value);
asn1_end_tag(data);
if ((data->has_error) || (attrib == NULL) || (value.data == NULL)) {
goto failed;
@@ -762,7 +761,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
asn1_start_tag(data, ASN1_CONTEXT(filter_tag));
asn1_read_OctetString_talloc(mem_ctx, data, &attrib);
- asn1_read_OctetString(data, &value);
+ asn1_read_OctetString(data, mem_ctx, &value);
asn1_end_tag(data);
if ((data->has_error) || (attrib == NULL) || (value.data == NULL)) {
goto failed;
@@ -781,7 +780,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
if (!asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(filter_tag))) {
goto failed;
}
- if (!asn1_read_LDAPString(data, &attr)) {
+ if (!asn1_read_LDAPString(data, ret, &attr)) {
goto failed;
}
@@ -800,7 +799,7 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
asn1_start_tag(data, ASN1_CONTEXT(filter_tag));
asn1_read_OctetString_talloc(mem_ctx, data, &attrib);
- asn1_read_OctetString(data, &value);
+ asn1_read_OctetString(data, mem_ctx, &value);
asn1_end_tag(data);
if ((data->has_error) || (attrib == NULL) || (value.data == NULL)) {
goto failed;
@@ -825,16 +824,16 @@ static struct ldb_parse_tree *ldap_decode_filter_tree(TALLOC_CTX *mem_ctx,
/* either oid or type must be defined */
if (asn1_peek_tag(data, ASN1_CONTEXT_SIMPLE(1))) { /* optional */
asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(1));
- asn1_read_LDAPString(data, &oid);
+ asn1_read_LDAPString(data, ret, &oid);
asn1_end_tag(data);
}
if (asn1_peek_tag(data, ASN1_CONTEXT_SIMPLE(2))) { /* optional */
asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(2));
- asn1_read_LDAPString(data, &attr);
+ asn1_read_LDAPString(data, ret, &attr);
asn1_end_tag(data);
}
asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(3));
- asn1_read_LDAPString(data, &value);
+ asn1_read_LDAPString(data, ret, &value);
asn1_end_tag(data);
/* dnAttributes is marked as BOOLEAN DEFAULT FALSE
it is not marked as OPTIONAL but openldap tools
@@ -902,7 +901,7 @@ static void ldap_decode_attrib(TALLOC_CTX *mem_ctx, struct asn1_data *data,
asn1_start_tag(data, ASN1_SET);
while (asn1_peek_tag(data, ASN1_OCTET_STRING)) {
DATA_BLOB blob;
- asn1_read_OctetString(data, &blob);
+ asn1_read_OctetString(data, mem_ctx, &blob);
add_value_to_attrib(mem_ctx, &blob, attrib);
}
asn1_end_tag(data);
@@ -970,7 +969,7 @@ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
asn1_read_OctetString_talloc(msg, data, &r->creds.SASL.mechanism);
if (asn1_peek_tag(data, ASN1_OCTET_STRING)) { /* optional */
DATA_BLOB tmp_blob = data_blob(NULL, 0);
- asn1_read_OctetString(data, &tmp_blob);
+ asn1_read_OctetString(data, msg, &tmp_blob);
r->creds.SASL.secblob = talloc(msg, DATA_BLOB);
if (!r->creds.SASL.secblob) {
return NT_STATUS_LDAP(LDAP_OPERATIONS_ERROR);
@@ -1228,7 +1227,7 @@ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
asn1_read_OctetString_talloc(msg, data, &r->dn);
asn1_start_tag(data, ASN1_SEQUENCE(0));
asn1_read_OctetString_talloc(msg, data, &r->attribute);
- asn1_read_OctetString(data, &r->value);
+ asn1_read_OctetString(data, msg, &r->value);
if (r->value.data) {
talloc_steal(msg, r->value.data);
}
diff --git a/source4/libcli/ldap/ldap_client.c b/source4/libcli/ldap/ldap_client.c
index c819122dd2..5e4eddee92 100644
--- a/source4/libcli/ldap/ldap_client.c
+++ b/source4/libcli/ldap/ldap_client.c
@@ -169,31 +169,30 @@ static void ldap_match_message(struct ldap_connection *conn, struct ldap_message
*/
static NTSTATUS ldap_recv_handler(void *private_data, DATA_BLOB blob)
{
- int ret;
NTSTATUS status;
- struct asn1_data asn1;
struct ldap_connection *conn = talloc_get_type(private_data,
struct ldap_connection);
struct ldap_message *msg = talloc(conn, struct ldap_message);
+ struct asn1_data *asn1 = asn1_init(conn);
if (msg == NULL) {
return NT_STATUS_LDAP(LDAP_PROTOCOL_ERROR);
}
- if (!asn1_load(&asn1, blob)) {
+ if (!asn1_load(asn1, blob)) {
return NT_STATUS_LDAP(LDAP_PROTOCOL_ERROR);
}
- status = ldap_decode(&asn1, msg);
+ status = ldap_decode(asn1, msg);
if (!NT_STATUS_IS_OK(status)) {
- asn1_free(&asn1);
+ asn1_free(asn1);
return status;
}
ldap_match_message(conn, msg);
data_blob_free(&blob);
- asn1_free(&asn1);
+ asn1_free(asn1);
return NT_STATUS_OK;
}
diff --git a/source4/libcli/ldap/ldap_controls.c b/source4/libcli/ldap/ldap_controls.c
index bbb0cb1aa5..180e6eeb62 100644
--- a/source4/libcli/ldap/ldap_controls.c
+++ b/source4/libcli/ldap/ldap_controls.c
@@ -34,10 +34,10 @@ struct control_handler {
static BOOL decode_server_sort_response(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB attr;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_sort_resp_control *lsrc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -46,17 +46,17 @@ static BOOL decode_server_sort_response(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_enumerated(&data, &(lsrc->result))) {
+ if (!asn1_read_enumerated(data, &(lsrc->result))) {
return False;
}
lsrc->attr_desc = NULL;
- if (asn1_peek_tag(&data, ASN1_OCTET_STRING)) {
- if (!asn1_read_OctetString(&data, &attr)) {
+ if (asn1_peek_tag(data, ASN1_OCTET_STRING)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &attr)) {
return False;
}
lsrc->attr_desc = talloc_strndup(lsrc, (const char *)attr.data, attr.length);
@@ -65,7 +65,7 @@ static BOOL decode_server_sort_response(void *mem_ctx, DATA_BLOB in, void **out)
}
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -78,21 +78,21 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB attr;
DATA_BLOB rule;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_server_sort_control **lssc;
int num;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
lssc = NULL;
- for (num = 0; asn1_peek_tag(&data, ASN1_SEQUENCE(0)); num++) {
+ for (num = 0; asn1_peek_tag(data, ASN1_SEQUENCE(0)); num++) {
lssc = talloc_realloc(mem_ctx, lssc, struct ldb_server_sort_control *, num + 2);
if (!lssc) {
return False;
@@ -102,11 +102,11 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_OctetString(&data, &attr)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &attr)) {
return False;
}
@@ -115,8 +115,8 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (asn1_peek_tag(&data, ASN1_OCTET_STRING)) {
- if (!asn1_read_OctetString(&data, &rule)) {
+ if (asn1_peek_tag(data, ASN1_OCTET_STRING)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &rule)) {
return False;
}
lssc[num]->orderingRule = talloc_strndup(lssc[num], (const char *)rule.data, rule.length);
@@ -125,15 +125,15 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
}
}
- if (asn1_peek_tag(&data, ASN1_BOOLEAN)) {
+ if (asn1_peek_tag(data, ASN1_BOOLEAN)) {
BOOL reverse;
- if (!asn1_read_BOOLEAN(&data, &reverse)) {
+ if (!asn1_read_BOOLEAN(data, &reverse)) {
return False;
}
lssc[num]->reverse = reverse;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
}
@@ -142,7 +142,7 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
lssc[num] = NULL;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -153,10 +153,10 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL decode_extended_dn_request(void *mem_ctx, DATA_BLOB in, void **out)
{
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_extended_dn_control *ledc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -165,15 +165,15 @@ static BOOL decode_extended_dn_request(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(ledc->type))) {
+ if (!asn1_read_Integer(data, &(ledc->type))) {
return False;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -184,10 +184,10 @@ static BOOL decode_extended_dn_request(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL decode_sd_flags_request(void *mem_ctx, DATA_BLOB in, void **out)
{
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_sd_flags_control *lsdfc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -196,15 +196,15 @@ static BOOL decode_sd_flags_request(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lsdfc->secinfo_flags))) {
+ if (!asn1_read_Integer(data, &(lsdfc->secinfo_flags))) {
return False;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -215,10 +215,10 @@ static BOOL decode_sd_flags_request(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL decode_search_options_request(void *mem_ctx, DATA_BLOB in, void **out)
{
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_search_options_control *lsoc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -227,15 +227,15 @@ static BOOL decode_search_options_request(void *mem_ctx, DATA_BLOB in, void **ou
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lsoc->search_options))) {
+ if (!asn1_read_Integer(data, &(lsoc->search_options))) {
return False;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -247,10 +247,10 @@ static BOOL decode_search_options_request(void *mem_ctx, DATA_BLOB in, void **ou
static BOOL decode_paged_results_request(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB cookie;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_paged_control *lprc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -259,15 +259,15 @@ static BOOL decode_paged_results_request(void *mem_ctx, DATA_BLOB in, void **out
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lprc->size))) {
+ if (!asn1_read_Integer(data, &(lprc->size))) {
return False;
}
- if (!asn1_read_OctetString(&data, &cookie)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &cookie)) {
return False;
}
lprc->cookie_len = cookie.length;
@@ -281,7 +281,7 @@ static BOOL decode_paged_results_request(void *mem_ctx, DATA_BLOB in, void **out
lprc->cookie = NULL;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -293,10 +293,10 @@ static BOOL decode_paged_results_request(void *mem_ctx, DATA_BLOB in, void **out
static BOOL decode_dirsync_request(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB cookie;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_dirsync_control *ldc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -305,19 +305,19 @@ static BOOL decode_dirsync_request(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(ldc->flags))) {
+ if (!asn1_read_Integer(data, &(ldc->flags))) {
return False;
}
- if (!asn1_read_Integer(&data, &(ldc->max_attributes))) {
+ if (!asn1_read_Integer(data, &(ldc->max_attributes))) {
return False;
}
- if (!asn1_read_OctetString(&data, &cookie)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &cookie)) {
return False;
}
ldc->cookie_len = cookie.length;
@@ -331,7 +331,7 @@ static BOOL decode_dirsync_request(void *mem_ctx, DATA_BLOB in, void **out)
ldc->cookie = NULL;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -346,10 +346,10 @@ static BOOL decode_dirsync_request(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL decode_asq_control(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB source_attribute;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_asq_control *lac;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -358,13 +358,13 @@ static BOOL decode_asq_control(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (asn1_peek_tag(&data, ASN1_OCTET_STRING)) {
+ if (asn1_peek_tag(data, ASN1_OCTET_STRING)) {
- if (!asn1_read_OctetString(&data, &source_attribute)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &source_attribute)) {
return False;
}
lac->src_attr_len = source_attribute.length;
@@ -380,9 +380,9 @@ static BOOL decode_asq_control(void *mem_ctx, DATA_BLOB in, void **out)
lac->request = 1;
- } else if (asn1_peek_tag(&data, ASN1_ENUMERATED)) {
+ } else if (asn1_peek_tag(data, ASN1_ENUMERATED)) {
- if (!asn1_read_enumerated(&data, &(lac->result))) {
+ if (!asn1_read_enumerated(data, &(lac->result))) {
return False;
}
@@ -392,7 +392,7 @@ static BOOL decode_asq_control(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -449,10 +449,10 @@ static BOOL decode_manageDSAIT_request(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB assertion_value, context_id;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_vlv_req_control *lvrc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -461,43 +461,43 @@ static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lvrc->beforeCount))) {
+ if (!asn1_read_Integer(data, &(lvrc->beforeCount))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lvrc->afterCount))) {
+ if (!asn1_read_Integer(data, &(lvrc->afterCount))) {
return False;
}
- if (asn1_peek_tag(&data, ASN1_CONTEXT(0))) {
+ if (asn1_peek_tag(data, ASN1_CONTEXT(0))) {
lvrc->type = 0;
- if (!asn1_start_tag(&data, ASN1_CONTEXT(0))) {
+ if (!asn1_start_tag(data, ASN1_CONTEXT(0))) {
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lvrc->match.byOffset.offset))) {
+ if (!asn1_read_Integer(data, &(lvrc->match.byOffset.offset))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lvrc->match.byOffset.contentCount))) {
+ if (!asn1_read_Integer(data, &(lvrc->match.byOffset.contentCount))) {
return False;
}
- if (!asn1_end_tag(&data)) { /*SEQUENCE*/
+ if (!asn1_end_tag(data)) { /*SEQUENCE*/
return False;
}
- if (!asn1_end_tag(&data)) { /*CONTEXT*/
+ if (!asn1_end_tag(data)) { /*CONTEXT*/
return False;
}
@@ -505,11 +505,11 @@ static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
lvrc->type = 1;
- if (!asn1_start_tag(&data, ASN1_CONTEXT(1))) {
+ if (!asn1_start_tag(data, ASN1_CONTEXT(1))) {
return False;
}
- if (!asn1_read_OctetString(&data, &assertion_value)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &assertion_value)) {
return False;
}
lvrc->match.gtOrEq.value_len = assertion_value.length;
@@ -523,13 +523,13 @@ static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
lvrc->match.gtOrEq.value = NULL;
}
- if (!asn1_end_tag(&data)) { /*CONTEXT*/
+ if (!asn1_end_tag(data)) { /*CONTEXT*/
return False;
}
}
- if (asn1_peek_tag(&data, ASN1_OCTET_STRING)) {
- if (!asn1_read_OctetString(&data, &context_id)) {
+ if (asn1_peek_tag(data, ASN1_OCTET_STRING)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &context_id)) {
return False;
}
lvrc->ctxid_len = context_id.length;
@@ -547,7 +547,7 @@ static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
lvrc->ctxid_len = 0;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -559,10 +559,10 @@ static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL decode_vlv_response(void *mem_ctx, DATA_BLOB in, void **out)
{
DATA_BLOB context_id;
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
struct ldb_vlv_resp_control *lvrc;
- if (!asn1_load(&data, in)) {
+ if (!asn1_load(data, in)) {
return False;
}
@@ -571,24 +571,24 @@ static BOOL decode_vlv_response(void *mem_ctx, DATA_BLOB in, void **out)
return False;
}
- if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lvrc->targetPosition))) {
+ if (!asn1_read_Integer(data, &(lvrc->targetPosition))) {
return False;
}
- if (!asn1_read_Integer(&data, &(lvrc->contentCount))) {
+ if (!asn1_read_Integer(data, &(lvrc->contentCount))) {
return False;
}
- if (!asn1_read_enumerated(&data, &(lvrc->vlv_result))) {
+ if (!asn1_read_enumerated(data, &(lvrc->vlv_result))) {
return False;
}
- if (asn1_peek_tag(&data, ASN1_OCTET_STRING)) {
- if (!asn1_read_OctetString(&data, &context_id)) {
+ if (asn1_peek_tag(data, ASN1_OCTET_STRING)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &context_id)) {
return False;
}
lvrc->contextId = talloc_strndup(lvrc, (const char *)context_id.data, context_id.length);
@@ -601,7 +601,7 @@ static BOOL decode_vlv_response(void *mem_ctx, DATA_BLOB in, void **out)
lvrc->ctxid_len = 0;
}
- if (!asn1_end_tag(&data)) {
+ if (!asn1_end_tag(data)) {
return False;
}
@@ -613,32 +613,31 @@ static BOOL decode_vlv_response(void *mem_ctx, DATA_BLOB in, void **out)
static BOOL encode_server_sort_response(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_sort_resp_control *lsrc = talloc_get_type(in, struct ldb_sort_resp_control);
- struct asn1_data data;
-
- ZERO_STRUCT(data);
+ struct asn1_data *data = asn1_init(mem_ctx);
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_enumerated(&data, lsrc->result)) {
+ if (!asn1_write_enumerated(data, lsrc->result)) {
return False;
}
if (lsrc->attr_desc) {
- if (!asn1_write_OctetString(&data, lsrc->attr_desc, strlen(lsrc->attr_desc))) {
+ if (!asn1_write_OctetString(data, lsrc->attr_desc, strlen(lsrc->attr_desc))) {
return False;
}
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -646,49 +645,48 @@ static BOOL encode_server_sort_response(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_server_sort_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_server_sort_control **lssc = talloc_get_type(in, struct ldb_server_sort_control *);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
int num;
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
for (num = 0; lssc[num]; num++) {
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_OctetString(&data, lssc[num]->attributeName, strlen(lssc[num]->attributeName))) {
+ if (!asn1_write_OctetString(data, lssc[num]->attributeName, strlen(lssc[num]->attributeName))) {
return False;
}
if (lssc[num]->orderingRule) {
- if (!asn1_write_OctetString(&data, lssc[num]->orderingRule, strlen(lssc[num]->orderingRule))) {
+ if (!asn1_write_OctetString(data, lssc[num]->orderingRule, strlen(lssc[num]->orderingRule))) {
return False;
}
}
if (lssc[num]->reverse) {
- if (!asn1_write_BOOLEAN(&data, lssc[num]->reverse)) {
+ if (!asn1_write_BOOLEAN(data, lssc[num]->reverse)) {
return False;
}
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -696,26 +694,25 @@ static BOOL encode_server_sort_request(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_extended_dn_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_extended_dn_control *ledc = talloc_get_type(in, struct ldb_extended_dn_control);
- struct asn1_data data;
-
- ZERO_STRUCT(data);
+ struct asn1_data *data = asn1_init(mem_ctx);
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, ledc->type)) {
+ if (!asn1_write_Integer(data, ledc->type)) {
return False;
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -723,26 +720,25 @@ static BOOL encode_extended_dn_request(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_sd_flags_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_sd_flags_control *lsdfc = talloc_get_type(in, struct ldb_sd_flags_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, lsdfc->secinfo_flags)) {
+ if (!asn1_write_Integer(data, lsdfc->secinfo_flags)) {
return False;
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -750,26 +746,25 @@ static BOOL encode_sd_flags_request(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_search_options_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_search_options_control *lsoc = talloc_get_type(in, struct ldb_search_options_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, lsoc->search_options)) {
+ if (!asn1_write_Integer(data, lsoc->search_options)) {
return False;
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -777,30 +772,29 @@ static BOOL encode_search_options_request(void *mem_ctx, void *in, DATA_BLOB *ou
static BOOL encode_paged_results_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_paged_control *lprc = talloc_get_type(in, struct ldb_paged_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, lprc->size)) {
+ if (!asn1_write_Integer(data, lprc->size)) {
return False;
}
- if (!asn1_write_OctetString(&data, lprc->cookie, lprc->cookie_len)) {
+ if (!asn1_write_OctetString(data, lprc->cookie, lprc->cookie_len)) {
return False;
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -811,33 +805,32 @@ static BOOL encode_paged_results_request(void *mem_ctx, void *in, DATA_BLOB *out
static BOOL encode_asq_control(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_asq_control *lac = talloc_get_type(in, struct ldb_asq_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
if (lac->request) {
- if (!asn1_write_OctetString(&data, lac->source_attribute, lac->src_attr_len)) {
+ if (!asn1_write_OctetString(data, lac->source_attribute, lac->src_attr_len)) {
return False;
}
} else {
- if (!asn1_write_enumerated(&data, lac->result)) {
+ if (!asn1_write_enumerated(data, lac->result)) {
return False;
}
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -845,34 +838,33 @@ static BOOL encode_asq_control(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_dirsync_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_dirsync_control *ldc = talloc_get_type(in, struct ldb_dirsync_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, ldc->flags)) {
+ if (!asn1_write_Integer(data, ldc->flags)) {
return False;
}
- if (!asn1_write_Integer(&data, ldc->max_attributes)) {
+ if (!asn1_write_Integer(data, ldc->max_attributes)) {
return False;
}
- if (!asn1_write_OctetString(&data, ldc->cookie, ldc->cookie_len)) {
+ if (!asn1_write_OctetString(data, ldc->cookie, ldc->cookie_len)) {
return False;
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -930,74 +922,73 @@ static BOOL encode_manageDSAIT_request(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_vlv_request(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_vlv_req_control *lvrc = talloc_get_type(in, struct ldb_vlv_req_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, lvrc->beforeCount)) {
+ if (!asn1_write_Integer(data, lvrc->beforeCount)) {
return False;
}
- if (!asn1_write_Integer(&data, lvrc->afterCount)) {
+ if (!asn1_write_Integer(data, lvrc->afterCount)) {
return False;
}
if (lvrc->type == 0) {
- if (!asn1_push_tag(&data, ASN1_CONTEXT(0))) {
+ if (!asn1_push_tag(data, ASN1_CONTEXT(0))) {
return False;
}
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, lvrc->match.byOffset.offset)) {
+ if (!asn1_write_Integer(data, lvrc->match.byOffset.offset)) {
return False;
}
- if (!asn1_write_Integer(&data, lvrc->match.byOffset.contentCount)) {
+ if (!asn1_write_Integer(data, lvrc->match.byOffset.contentCount)) {
return False;
}
- if (!asn1_pop_tag(&data)) { /*SEQUENCE*/
+ if (!asn1_pop_tag(data)) { /*SEQUENCE*/
return False;
}
- if (!asn1_pop_tag(&data)) { /*CONTEXT*/
+ if (!asn1_pop_tag(data)) { /*CONTEXT*/
return False;
}
} else {
- if (!asn1_push_tag(&data, ASN1_CONTEXT(1))) {
+ if (!asn1_push_tag(data, ASN1_CONTEXT(1))) {
return False;
}
- if (!asn1_write_OctetString(&data, lvrc->match.gtOrEq.value, lvrc->match.gtOrEq.value_len)) {
+ if (!asn1_write_OctetString(data, lvrc->match.gtOrEq.value, lvrc->match.gtOrEq.value_len)) {
return False;
}
- if (!asn1_pop_tag(&data)) { /*CONTEXT*/
+ if (!asn1_pop_tag(data)) { /*CONTEXT*/
return False;
}
}
if (lvrc->ctxid_len) {
- if (!asn1_write_OctetString(&data, lvrc->contextId, lvrc->ctxid_len)) {
+ if (!asn1_write_OctetString(data, lvrc->contextId, lvrc->ctxid_len)) {
return False;
}
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -1005,40 +996,39 @@ static BOOL encode_vlv_request(void *mem_ctx, void *in, DATA_BLOB *out)
static BOOL encode_vlv_response(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_vlv_resp_control *lvrc = talloc_get_type(in, struct ldb_vlv_resp_control);
- struct asn1_data data;
+ struct asn1_data *data = asn1_init(mem_ctx);
- ZERO_STRUCT(data);
-
- if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
return False;
}
- if (!asn1_write_Integer(&data, lvrc->targetPosition)) {
+ if (!asn1_write_Integer(data, lvrc->targetPosition)) {
return False;
}
- if (!asn1_write_Integer(&data, lvrc->contentCount)) {
+ if (!asn1_write_Integer(data, lvrc->contentCount)) {
return False;
}
- if (!asn1_write_enumerated(&data, lvrc->vlv_result)) {
+ if (!asn1_write_enumerated(data, lvrc->vlv_result)) {
return False;
}
if (lvrc->ctxid_len) {
- if (!asn1_write_OctetString(&data, lvrc->contextId, lvrc->ctxid_len)) {
+ if (!asn1_write_OctetString(data, lvrc->contextId, lvrc->ctxid_len)) {
return False;
}
}
- if (!asn1_pop_tag(&data)) {
+ if (!asn1_pop_tag(data)) {
return False;
}
- *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ *out = data_blob_talloc(mem_ctx, data->data, data->length);
if (out->data == NULL) {
return False;
}
+ talloc_free(data);
return True;
}
@@ -1093,7 +1083,7 @@ BOOL ldap_decode_control_wrapper(void *mem_ctx, struct asn1_data *data, struct l
return False;
}
- if (!asn1_read_OctetString(data, &oid)) {
+ if (!asn1_read_OctetString(data, mem_ctx, &oid)) {
return False;
}
ctrl->oid = talloc_strndup(mem_ctx, (char *)oid.data, oid.length);
@@ -1117,7 +1107,7 @@ BOOL ldap_decode_control_wrapper(void *mem_ctx, struct asn1_data *data, struct l
goto end_tag;
}
- if (!asn1_read_OctetString(data, value)) {
+ if (!asn1_read_OctetString(data, mem_ctx, value)) {
return False;
}
diff --git a/source4/libcli/util/asn1.c b/source4/libcli/util/asn1.c
index e64ffdf86c..d02f6be9c7 100644
--- a/source4/libcli/util/asn1.c
+++ b/source4/libcli/util/asn1.c
@@ -21,12 +21,16 @@
#include "includes.h"
#include "libcli/util/asn_1.h"
+/* allocate an asn1 structure */
+struct asn1_data *asn1_init(TALLOC_CTX *mem_ctx)
+{
+ return talloc_zero(NULL, struct asn1_data);
+}
+
/* free an asn1 structure */
void asn1_free(struct asn1_data *data)
{
- talloc_free(data->data);
- ZERO_STRUCTP(data);
- data->has_error = True;
+ talloc_free(data);
}
/* write to the ASN1 buffer, advancing the buffer pointer */
@@ -35,7 +39,7 @@ BOOL asn1_write(struct asn1_data *data, const void *p, int len)
if (data->has_error) return False;
if (data->length < data->ofs+len) {
uint8_t *newp;
- newp = talloc_realloc(NULL, data->data, uint8_t, data->ofs+len);
+ newp = talloc_realloc(data, data->data, uint8_t, data->ofs+len);
if (!newp) {
asn1_free(data);
data->has_error = True;
@@ -61,7 +65,7 @@ BOOL asn1_push_tag(struct asn1_data *data, uint8_t tag)
struct nesting *nesting;
asn1_write_uint8(data, tag);
- nesting = talloc(NULL, struct nesting);
+ nesting = talloc(data, struct nesting);
if (!nesting) {
data->has_error = True;
return False;
@@ -341,7 +345,7 @@ BOOL asn1_check_BOOLEAN(struct asn1_data *data, BOOL v)
BOOL asn1_load(struct asn1_data *data, DATA_BLOB blob)
{
ZERO_STRUCTP(data);
- data->data = talloc_memdup(NULL, blob.data, blob.length);
+ data->data = talloc_memdup(data, blob.data, blob.length);
if (!data->data) {
data->has_error = True;
return False;
@@ -417,7 +421,7 @@ BOOL asn1_start_tag(struct asn1_data *data, uint8_t tag)
data->has_error = True;
return False;
}
- nesting = talloc(NULL, struct nesting);
+ nesting = talloc(data, struct nesting);
if (!nesting) {
data->has_error = True;
return False;
@@ -494,7 +498,7 @@ int asn1_tag_remaining(struct asn1_data *data)
}
/* read an object ID from a data blob */
-BOOL ber_read_OID_String(DATA_BLOB blob, const char **OID)
+BOOL ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID)
{
int i;
uint8_t *b;
@@ -505,7 +509,7 @@ BOOL ber_read_OID_String(DATA_BLOB blob, const char **OID)
b = blob.data;
- tmp_oid = talloc_asprintf(NULL, "%u", b[0]/40);
+ tmp_oid = talloc_asprintf(mem_ctx, "%u", b[0]/40);
if (!tmp_oid) goto nomem;
tmp_oid = talloc_asprintf_append(tmp_oid, ".%u", b[0]%40);
if (!tmp_oid) goto nomem;
@@ -532,7 +536,7 @@ nomem:
}
/* read an object ID from a ASN1 buffer */
-BOOL asn1_read_OID(struct asn1_data *data, const char **OID)
+BOOL asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID)
{
DATA_BLOB blob;
int len;
@@ -558,7 +562,7 @@ BOOL asn1_read_OID(struct asn1_data *data, const char **OID)
return False;
}
- if (!ber_read_OID_String(blob, OID)) {
+ if (!ber_read_OID_String(mem_ctx, blob, OID)) {
data->has_error = True;
data_blob_free(&blob);
return False;
@@ -573,9 +577,10 @@ BOOL asn1_check_OID(struct asn1_data *data, const char *OID)
{
const char *id;
- if (!asn1_read_OID(data, &id)) return False;
+ if (!asn1_read_OID(data, data, &id)) return False;
if (strcmp(id, OID) != 0) {
+ talloc_free(discard_const(id));
data->has_error = True;
return False;
}
@@ -584,7 +589,7 @@ BOOL asn1_check_OID(struct asn1_data *data, const char *OID)
}
/* read a LDAPString from a ASN1 buffer */
-BOOL asn1_read_LDAPString(struct asn1_data *data, char **s)
+BOOL asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s)
{
int len;
len = asn1_tag_remaining(data);
@@ -592,7 +597,7 @@ BOOL asn1_read_LDAPString(struct asn1_data *data, char **s)
data->has_error = True;
return False;
}
- *s = talloc_size(NULL, len+1);
+ *s = talloc_size(mem_ctx, len+1);
if (! *s) {
data->has_error = True;
return False;
@@ -604,16 +609,16 @@ BOOL asn1_read_LDAPString(struct asn1_data *data, char **s)
/* read a GeneralString from a ASN1 buffer */
-BOOL asn1_read_GeneralString(struct asn1_data *data, char **s)
+BOOL asn1_read_GeneralString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s)
{
if (!asn1_start_tag(data, ASN1_GENERAL_STRING)) return False;
- if (!asn1_read_LDAPString(data, s)) return False;
+ if (!asn1_read_LDAPString(data, mem_ctx, s)) return False;
return asn1_end_tag(data);
}
/* read a octet string blob */
-BOOL asn1_read_OctetString(struct asn1_data *data, DATA_BLOB *blob)
+BOOL asn1_read_OctetString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob)
{
int len;
ZERO_STRUCTP(blob);
@@ -623,7 +628,7 @@ BOOL asn1_read_OctetString(struct asn1_data *data, DATA_BLOB *blob)
data->has_error = True;
return False;
}
- *blob = data_blob(NULL, len+1);
+ *blob = data_blob_talloc(mem_ctx, NULL, len+1);
if (!blob->data) {
data->has_error = True;
return False;
@@ -727,19 +732,21 @@ BOOL asn1_write_enumerated(struct asn1_data *data, uint8_t v)
*/
NTSTATUS asn1_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size)
{
- struct asn1_data asn1;
+ struct asn1_data *asn1 = asn1_init(NULL);
int size;
- ZERO_STRUCT(asn1);
- asn1.data = blob.data;
- asn1.length = blob.length;
- asn1_start_tag(&asn1, tag);
- if (asn1.has_error) {
- talloc_free(asn1.nesting);
+ NT_STATUS_HAVE_NO_MEMORY(asn1);
+
+ asn1->data = blob.data;
+ asn1->length = blob.length;
+ asn1_start_tag(asn1, tag);
+ if (asn1->has_error) {
+ talloc_free(asn1);
return STATUS_MORE_ENTRIES;
}
- size = asn1_tag_remaining(&asn1) + asn1.ofs;
- talloc_free(asn1.nesting);
+ size = asn1_tag_remaining(asn1) + asn1->ofs;
+
+ talloc_free(asn1);
if (size > blob.length) {
return STATUS_MORE_ENTRIES;
diff --git a/source4/librpc/ndr/ndr_drsuapi.c b/source4/librpc/ndr/ndr_drsuapi.c
index f8f84f8c70..ac6e4f9c18 100644
--- a/source4/librpc/ndr/ndr_drsuapi.c
+++ b/source4/librpc/ndr/ndr_drsuapi.c
@@ -144,7 +144,7 @@ NTSTATUS ndr_pull_drsuapi_DsReplicaOID(struct ndr_pull *ndr, int ndr_flags, stru
_oid = data_blob_hex_string(ndr, &_oid_array);
NT_STATUS_HAVE_NO_MEMORY(_oid);
} else {
- _OID_PULL_CHECK(ber_read_OID_String(_oid_array, &_oid));
+ _OID_PULL_CHECK(ber_read_OID_String(r->oid, _oid_array, &_oid));
}
data_blob_free(&_oid_array);
talloc_steal(r->oid, _oid);