r23036: error checking on asn1_init() failure
authorAndrew Tridgell <tridge@samba.org>
Mon, 21 May 2007 12:47:18 +0000 (12:47 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:52:43 +0000 (14:52 -0500)
source/auth/gensec/spnego_parse.c
source/auth/kerberos/gssapi_parse.c
source/ldap_server/ldap_server.c
source/libcli/cldap/cldap.c
source/libcli/ldap/ldap.c
source/libcli/ldap/ldap_client.c
source/libcli/ldap/ldap_controls.c
source/libcli/util/asn1.c

index c768d1e8470635660c3c188acee190f99bc575f2..53824022065d7a533add760fd1f1fc813313d2d1 100644 (file)
@@ -265,7 +265,7 @@ static BOOL write_negTokenTarg(struct asn1_data *asn1, struct spnego_negTokenTar
 
 ssize_t spnego_read_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, struct spnego_data *token)
 {
-       struct asn1_data *asn1 = asn1_init(mem_ctx);
+       struct asn1_data *asn1;
        ssize_t ret = -1;
        uint8_t context;
 
@@ -275,6 +275,11 @@ ssize_t spnego_read_data(TALLOC_CTX *mem_ctx, DATA_BLOB data, struct spnego_data
                return ret;
        }
 
+       asn1 = asn1_init(mem_ctx);
+       if (asn1 == NULL) {
+               return -1;
+       }
+
        asn1_load(asn1, data);
 
        if (!asn1_peek_uint8(asn1, &context)) {
@@ -311,6 +316,10 @@ ssize_t spnego_write_data(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct spnego_da
        struct asn1_data *asn1 = asn1_init(mem_ctx);
        ssize_t ret = -1;
 
+       if (asn1 == NULL) {
+               return -1;
+       }
+
        switch (spnego->type) {
        case SPNEGO_NEG_TOKEN_INIT:
                asn1_push_tag(asn1, ASN1_APPLICATION(0));
index 86a9e9554aabc3b4d4bbfe57e86c499c3d43a600..de6fa31afb151dc2924ac8a1646aa7aafe37a7ad 100644 (file)
 */
 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 = asn1_init(mem_ctx);
+       struct asn1_data *data;
        DATA_BLOB ret;
 
        if (!data || !ticket->data) {
                return data_blob(NULL,0);
        }
 
+       data = asn1_init(mem_ctx);
+       if (data == NULL) {
+               return data_blob(NULL,0);
+       }
+
        asn1_push_tag(data, ASN1_APPLICATION(0));
        asn1_write_OID(data, GENSEC_OID_KERBEROS5);
 
@@ -66,6 +71,10 @@ BOOL gensec_gssapi_parse_krb5_wrap(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, D
        struct asn1_data *data = asn1_init(mem_ctx);
        int data_remaining;
 
+       if (!data) {
+               return False;
+       }
+
        asn1_load(data, *blob);
        asn1_start_tag(data, ASN1_APPLICATION(0));
        asn1_check_OID(data, GENSEC_OID_KERBEROS5);
@@ -99,6 +108,8 @@ BOOL gensec_gssapi_check_oid(const DATA_BLOB *blob, const char *oid)
        BOOL ret;
        struct asn1_data *data = asn1_init(NULL);
 
+       if (!data) return False;
+
        asn1_load(data, *blob);
        asn1_start_tag(data, ASN1_APPLICATION(0));
        asn1_check_OID(data, oid);
index 9aefbed48564d7b971c3bafcf2f9de39d4da3720..03fb10b4de432c10e3e98bddf63761cd509822e6 100644 (file)
@@ -137,11 +137,13 @@ static NTSTATUS ldapsrv_decode(void *private, DATA_BLOB blob)
        struct asn1_data *asn1 = asn1_init(conn);
        struct ldap_message *msg = talloc(conn, struct ldap_message);
 
-       if (msg == NULL) {
+       if (asn1 == NULL || msg == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
 
        if (!asn1_load(asn1, blob)) {
+               talloc_free(msg);
+               talloc_free(asn1);
                return NT_STATUS_NO_MEMORY;
        }
 
index e92abe4d47af359738515adc06f2244f6191be69..bd2ab630db2958182717524d4617b871d40b14b6 100644 (file)
@@ -70,6 +70,8 @@ static void cldap_socket_recv(struct cldap_socket *cldap)
        struct ldap_message *ldap_msg;
        struct cldap_request *req;
 
+       if (!asn1) return;
+
        status = socket_pending(cldap->sock, &dsize);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(tmp_ctx);
index 70ba9335dbfb3a78aae72268aa3519d66f0106d3..55988b8eb48c5a044b05fb7d356acbcfdd42dc96 100644 (file)
@@ -193,6 +193,8 @@ BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ct
        struct asn1_data *data = asn1_init(mem_ctx);
        int i, j;
 
+       if (!data) return False;
+
        asn1_push_tag(data, ASN1_SEQUENCE(0));
        asn1_write_Integer(data, msg->messageid);
 
index 5e4eddee927ccf247318c76f62b0ba4a45d44eed..ce15b392711a91f96ee203965624583d039a4780 100644 (file)
@@ -175,11 +175,13 @@ static NTSTATUS ldap_recv_handler(void *private_data, DATA_BLOB blob)
        struct ldap_message *msg = talloc(conn, struct ldap_message);
        struct asn1_data *asn1 = asn1_init(conn);
 
-       if (msg == NULL) {
+       if (asn1 == NULL || msg == NULL) {
                return NT_STATUS_LDAP(LDAP_PROTOCOL_ERROR);
        }
 
        if (!asn1_load(asn1, blob)) {
+               talloc_free(msg);
+               talloc_free(asn1);
                return NT_STATUS_LDAP(LDAP_PROTOCOL_ERROR);
        }
        
index 180e6eeb62b6c25b980edd3cbaba535f10d5e39f..79c16afc9518a357905e04acc73b232df1ff36f8 100644 (file)
@@ -37,6 +37,8 @@ static BOOL decode_server_sort_response(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_sort_resp_control *lsrc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -82,6 +84,8 @@ static BOOL decode_server_sort_request(void *mem_ctx, DATA_BLOB in, void **out)
        struct ldb_server_sort_control **lssc;
        int num;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -156,6 +160,8 @@ static BOOL decode_extended_dn_request(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_extended_dn_control *ledc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -187,6 +193,8 @@ static BOOL decode_sd_flags_request(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_sd_flags_control *lsdfc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -218,6 +226,8 @@ static BOOL decode_search_options_request(void *mem_ctx, DATA_BLOB in, void **ou
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_search_options_control *lsoc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -250,6 +260,8 @@ static BOOL decode_paged_results_request(void *mem_ctx, DATA_BLOB in, void **out
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_paged_control *lprc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -296,6 +308,8 @@ static BOOL decode_dirsync_request(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_dirsync_control *ldc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -349,6 +363,8 @@ static BOOL decode_asq_control(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_asq_control *lac;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -452,6 +468,8 @@ static BOOL decode_vlv_request(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_vlv_req_control *lvrc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -562,6 +580,8 @@ static BOOL decode_vlv_response(void *mem_ctx, DATA_BLOB in, void **out)
        struct asn1_data *data = asn1_init(mem_ctx);
        struct ldb_vlv_resp_control *lvrc;
 
+       if (!data) return False;
+
        if (!asn1_load(data, in)) {
                return False;
        }
@@ -615,6 +635,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -648,6 +670,8 @@ static BOOL encode_server_sort_request(void *mem_ctx, void *in, DATA_BLOB *out)
        struct asn1_data *data = asn1_init(mem_ctx);
        int num;
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -696,6 +720,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -722,6 +748,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -748,6 +776,8 @@ static BOOL encode_search_options_request(void *mem_ctx, void *in, DATA_BLOB *ou
        struct ldb_search_options_control *lsoc = talloc_get_type(in, struct ldb_search_options_control);
        struct asn1_data *data = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -774,6 +804,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -807,6 +839,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -840,6 +874,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -924,6 +960,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
@@ -998,6 +1036,8 @@ 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 = asn1_init(mem_ctx);
 
+       if (!data) return False;
+
        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) {
                return False;
        }
index d02f6be9c776b2eaaac96c29968e7bb86251af31..81ce72bed97744ca42cc2ed39c61ab85c13a51de 100644 (file)
 /* allocate an asn1 structure */
 struct asn1_data *asn1_init(TALLOC_CTX *mem_ctx)
 {
-       return talloc_zero(NULL, struct asn1_data);
+       struct asn1_data *ret = talloc_zero(NULL, struct asn1_data);
+       if (ret == NULL) {
+               DEBUG(0,("asn1_init failed! out of memory\n"));
+       }
+       return ret;
 }
 
 /* free an asn1 structure */