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

Samba Server: update vendor to version 4.4.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/lib/tldap.c

    r740 r988  
    1818*/
    1919
    20 #include "includes.h"
     20#include "replace.h"
    2121#include "tldap.h"
     22#include "system/network.h"
     23#include "system/locale.h"
     24#include "lib/util/talloc_stack.h"
     25#include "lib/util/samba_util.h"
     26#include "lib/util_tsock.h"
    2227#include "../lib/util/asn1.h"
    2328#include "../lib/tsocket/tsocket.h"
     
    5863struct tldap_context {
    5964        int ld_version;
    60         int ld_deref;
    61         int ld_sizelimit;
    62         int ld_timelimit;
    6365        struct tstream_context *conn;
    6466        bool server_down;
     
    172174        struct tldap_context *ld, const char *name)
    173175{
    174         int i, num_attrs;
     176        size_t i, num_attrs;
    175177
    176178        num_attrs = talloc_array_length(ld->ctx_attrs);
     
    190192        char *tmpname;
    191193        int num_attrs;
    192         void **pptr = (void **)_pptr;
     194        void **pptr = (void **)discard_const_p(void,_pptr);
    193195
    194196        attr = tldap_context_findattr(ld, name);
     
    357359};
    358360
    359 static void tldap_push_controls(struct asn1_data *data,
     361static bool tldap_push_controls(struct asn1_data *data,
    360362                                struct tldap_control *sctrls,
    361363                                int num_sctrls)
     
    364366
    365367        if ((sctrls == NULL) || (num_sctrls == 0)) {
    366                 return;
    367         }
    368 
    369         asn1_push_tag(data, ASN1_CONTEXT(0));
     368                return true;
     369        }
     370
     371        if (!asn1_push_tag(data, ASN1_CONTEXT(0))) return false;
    370372
    371373        for (i=0; i<num_sctrls; i++) {
    372374                struct tldap_control *c = &sctrls[i];
    373                 asn1_push_tag(data, ASN1_SEQUENCE(0));
    374                 asn1_write_OctetString(data, c->oid, strlen(c->oid));
     375                if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) return false;
     376                if (!asn1_write_OctetString(data, c->oid, strlen(c->oid))) return false;
    375377                if (c->critical) {
    376                         asn1_write_BOOLEAN(data, true);
     378                        if (!asn1_write_BOOLEAN(data, true)) return false;
    377379                }
    378380                if (c->value.data != NULL) {
    379                         asn1_write_OctetString(data, c->value.data,
    380                                                c->value.length);
    381                 }
    382                 asn1_pop_tag(data); /* ASN1_SEQUENCE(0) */
    383         }
    384 
    385         asn1_pop_tag(data); /* ASN1_CONTEXT(0) */
     381                        if (!asn1_write_OctetString(data, c->value.data,
     382                                               c->value.length)) return false;
     383                }
     384                if (!asn1_pop_tag(data)) return false; /* ASN1_SEQUENCE(0) */
     385        }
     386
     387        return asn1_pop_tag(data); /* ASN1_CONTEXT(0) */
    386388}
    387389
     
    416418        }
    417419
    418         tldap_push_controls(data, sctrls, num_sctrls);
    419 
    420         asn1_pop_tag(data);
     420        if (!tldap_push_controls(data, sctrls, num_sctrls)) {
     421                tevent_req_error(req, TLDAP_ENCODING_ERROR);
     422                return tevent_req_post(req, ev);
     423        }
     424
     425
     426        if (!asn1_pop_tag(data)) {
     427                tevent_req_error(req, TLDAP_ENCODING_ERROR);
     428                return tevent_req_post(req, ev);
     429        }
    421430
    422431        if (!asn1_blob(data, &blob)) {
     
    444453        int num_pending = talloc_array_length(ld->pending);
    445454        int i;
     455
     456        tevent_req_set_cleanup_fn(req, NULL);
    446457
    447458        if (num_pending == 1) {
     
    477488        ld->pending = talloc_realloc(NULL, ld->pending, struct tevent_req *,
    478489                                     num_pending - 1);
    479         return;
    480 }
    481 
    482 static int tldap_msg_destructor(struct tevent_req *req)
    483 {
    484         tldap_msg_unset_pending(req);
    485         return 0;
     490}
     491
     492static void tldap_msg_cleanup(struct tevent_req *req,
     493                              enum tevent_req_state req_state)
     494{
     495        switch (req_state) {
     496        case TEVENT_REQ_USER_ERROR:
     497        case TEVENT_REQ_RECEIVED:
     498                tldap_msg_unset_pending(req);
     499                return;
     500        default:
     501                return;
     502        }
    486503}
    487504
     
    505522        pending[num_pending] = req;
    506523        ld->pending = pending;
    507         talloc_set_destructor(req, tldap_msg_destructor);
     524        tevent_req_set_cleanup_fn(req, tldap_msg_cleanup);
    508525
    509526        if (num_pending > 0) {
     
    542559
    543560        if (!tldap_msg_set_pending(req)) {
    544                 tevent_req_nomem(NULL, req);
     561                tevent_req_oom(req);
    545562                return;
    546563        }
     
    619636        state->data = talloc_move(state, &data);
    620637
    621         talloc_set_destructor(req, NULL);
    622638        tldap_msg_unset_pending(req);
    623639        num_pending = talloc_array_length(ld->pending);
     
    651667        while (talloc_array_length(ld->pending) > 0) {
    652668                req = ld->pending[0];
    653                 talloc_set_destructor(req, NULL);
    654                 tldap_msg_destructor(req);
     669                state = tevent_req_data(req, struct tldap_msg_state);
     670                tevent_req_defer_callback(req, state->ev);
    655671                tevent_req_error(req, status);
    656672        }
     
    709725                return NULL;
    710726        }
    711         ZERO_STRUCTP(state);
    712727        state->out = asn1_init(state);
    713728        if (state->out == NULL) {
    714                 TALLOC_FREE(req);
    715                 return NULL;
    716         }
    717         state->result = NULL;
     729                goto err;
     730        }
    718731        state->id = tldap_next_msgid(ld);
    719732
    720         asn1_push_tag(state->out, ASN1_SEQUENCE(0));
    721         asn1_write_Integer(state->out, state->id);
     733        if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto err;
     734        if (!asn1_write_Integer(state->out, state->id)) goto err;
    722735
    723736        *pstate = state;
    724737        return req;
     738
     739  err:
     740
     741        TALLOC_FREE(req);
     742        return NULL;
    725743}
    726744
     
    779797        ok &= asn1_read_OctetString_talloc(msg, data,
    780798                                           &msg->res_diagnosticmessage);
     799        if (!ok) return ok;
    781800        if (asn1_peek_tag(data, ASN1_CONTEXT(3))) {
    782801                ok &= asn1_start_tag(data, ASN1_CONTEXT(3));
     
    816835        }
    817836
    818         asn1_push_tag(state->out, TLDAP_REQ_BIND);
    819         asn1_write_Integer(state->out, ld->ld_version);
    820         asn1_write_OctetString(state->out, dn, (dn != NULL) ? strlen(dn) : 0);
     837        if (!asn1_push_tag(state->out, TLDAP_REQ_BIND)) goto err;
     838        if (!asn1_write_Integer(state->out, ld->ld_version)) goto err;
     839        if (!asn1_write_OctetString(state->out, dn, strlen(dn))) goto err;
    821840
    822841        if (mechanism == NULL) {
    823                 asn1_push_tag(state->out, ASN1_CONTEXT_SIMPLE(0));
    824                 asn1_write(state->out, creds->data, creds->length);
    825                 asn1_pop_tag(state->out);
     842                if (!asn1_push_tag(state->out, ASN1_CONTEXT_SIMPLE(0))) goto err;
     843                if (!asn1_write(state->out, creds->data, creds->length)) goto err;
     844                if (!asn1_pop_tag(state->out)) goto err;
    826845        } else {
    827                 asn1_push_tag(state->out, ASN1_CONTEXT(3));
    828                 asn1_write_OctetString(state->out, mechanism,
    829                                        strlen(mechanism));
     846                if (!asn1_push_tag(state->out, ASN1_CONTEXT(3))) goto err;
     847                if (!asn1_write_OctetString(state->out, mechanism,
     848                                       strlen(mechanism))) goto err;
    830849                if ((creds != NULL) && (creds->data != NULL)) {
    831                         asn1_write_OctetString(state->out, creds->data,
    832                                                creds->length);
    833                 }
    834                 asn1_pop_tag(state->out);
    835         }
    836 
    837         if (!asn1_pop_tag(state->out)) {
    838                 tevent_req_error(req, TLDAP_ENCODING_ERROR);
    839                 return tevent_req_post(req, ev);
    840         }
     850                        if (!asn1_write_OctetString(state->out, creds->data,
     851                                               creds->length)) goto err;
     852                }
     853                if (!asn1_pop_tag(state->out)) goto err;
     854        }
     855
     856        if (!asn1_pop_tag(state->out)) goto err;
    841857
    842858        subreq = tldap_msg_send(state, ev, ld, state->id, state->out,
     
    847863        tevent_req_set_callback(subreq, tldap_sasl_bind_done, req);
    848864        return req;
     865
     866  err:
     867
     868        tevent_req_error(req, TLDAP_ENCODING_ERROR);
     869        return tevent_req_post(req, ev);
    849870}
    850871
     
    902923        int result;
    903924
    904         ev = event_context_init(frame);
     925        ev = samba_tevent_context_init(frame);
    905926        if (ev == NULL) {
    906927                result = TLDAP_NO_MEMORY;
     
    936957
    937958        if (passwd != NULL) {
    938                 cred.data = (uint8_t *)passwd;
     959                cred.data = discard_const_p(uint8_t, passwd);
    939960                cred.length = strlen(passwd);
    940961        } else {
    941                 cred.data = (uint8_t *)"";
     962                cred.data = discard_const_p(uint8_t, "");
    942963                cred.length = 0;
    943964        }
     
    957978
    958979        if (passwd != NULL) {
    959                 cred.data = (uint8_t *)passwd;
     980                cred.data = discard_const_p(uint8_t, passwd);
    960981                cred.length = strlen(passwd);
    961982        } else {
    962                 cred.data = (uint8_t *)"";
     983                cred.data = discard_const_p(uint8_t, "");
    963984                cred.length = 0;
    964985        }
     
    12241245        case '&':
    12251246                tldap_debug(ld, TLDAP_DEBUG_TRACE, "Filter op: AND\n");
    1226                 asn1_push_tag(data, TLDAP_FILTER_AND);
     1247                if (!asn1_push_tag(data, TLDAP_FILTER_AND)) return false;
    12271248                s++;
    12281249                break;
     
    12301251        case '|':
    12311252                tldap_debug(ld, TLDAP_DEBUG_TRACE, "Filter op: OR\n");
    1232                 asn1_push_tag(data, TLDAP_FILTER_OR);
     1253                if (!asn1_push_tag(data, TLDAP_FILTER_OR)) return false;
    12331254                s++;
    12341255                break;
     
    12361257        case '!':
    12371258                tldap_debug(ld, TLDAP_DEBUG_TRACE, "Filter op: NOT\n");
    1238                 asn1_push_tag(data, TLDAP_FILTER_NOT);
     1259                if (!asn1_push_tag(data, TLDAP_FILTER_NOT)) return false;
    12391260                s++;
    12401261                ret = tldap_push_filter_int(ld, data, &s);
     
    12421263                        return false;
    12431264                }
    1244                 asn1_pop_tag(data);
     1265                if (!asn1_pop_tag(data)) return false;
    12451266                goto done;
    12461267
     
    12691290        if (*s == ')') {
    12701291                /* RFC 4526: empty and/or */
    1271                 asn1_pop_tag(data);
     1292                if (!asn1_pop_tag(data)) return false;
    12721293                goto done;
    12731294        }
     
    12811302                if (*s == ')') {
    12821303                        /* end of list, return */
    1283                         asn1_pop_tag(data);
     1304                        if (!asn1_pop_tag(data)) return false;
    12841305                        break;
    12851306                }
     
    12941315        s++;
    12951316
    1296         if (data->has_error) {
     1317        if (asn1_has_error(data)) {
    12971318                return false;
    12981319        }
     
    13341355        switch (*e) {
    13351356        case '<':
    1336                 asn1_push_tag(data, TLDAP_FILTER_LE);
     1357                if (!asn1_push_tag(data, TLDAP_FILTER_LE)) return false;
    13371358                break;
    13381359
    13391360        case '>':
    1340                 asn1_push_tag(data, TLDAP_FILTER_GE);
     1361                if (!asn1_push_tag(data, TLDAP_FILTER_GE)) return false;
    13411362                break;
    13421363
    13431364        case '~':
    1344                 asn1_push_tag(data, TLDAP_FILTER_APX);
     1365                if (!asn1_push_tag(data, TLDAP_FILTER_APX)) return false;
    13451366                break;
    13461367
    13471368        case ':':
    1348                 asn1_push_tag(data, TLDAP_FILTER_EXT);
     1369                if (!asn1_push_tag(data, TLDAP_FILTER_EXT)) return false;
    13491370                write_octect = false;
    13501371
     
    13711392
    13721393                        rule = strchr(dn, ':');
     1394                        if (rule == NULL) {
     1395                                return false;
     1396                        }
    13731397                        if ((rule == dn + 1) || rule + 1 == e) {
    13741398                                /* malformed filter, contains "::" */
     
    13761400                        }
    13771401
    1378                         if (StrnCaseCmp(dn, "dn:", 3) != 0) {
     1402                        if (strncasecmp_m(dn, "dn:", 3) != 0) {
    13791403                                if (rule == e) {
    13801404                                        rule = dn;
     
    14151439                                return false;
    14161440                        }
    1417                         asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(1));
    1418                         asn1_write(data, rule, e - rule);
    1419                         asn1_pop_tag(data);
     1441                        if (!asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(1))) return false;
     1442                        if (!asn1_write(data, rule, e - rule)) return false;
     1443                        if (!asn1_pop_tag(data)) return false;
    14201444                }
    14211445
     
    14261450                                return false;
    14271451                        }
    1428                         asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(2));
    1429                         asn1_write(data, type, type_len);
    1430                         asn1_pop_tag(data);
     1452                        if (!asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(2))) return false;
     1453                        if (!asn1_write(data, type, type_len)) return false;
     1454                        if (!asn1_pop_tag(data)) return false;
    14311455                }
    14321456
     
    14411465                }
    14421466
    1443                 asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(3));
    1444                 asn1_write(data, uval, uval_len);
    1445                 asn1_pop_tag(data);
    1446 
    1447                 asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(4));
    1448                 asn1_write_uint8(data, dn?1:0);
    1449                 asn1_pop_tag(data);
     1467                if (!asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(3))) return false;
     1468                if (!asn1_write(data, uval, uval_len)) return false;
     1469                if (!asn1_pop_tag(data)) return false;
     1470
     1471                if (!asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(4))) return false;
     1472                if (!asn1_write_uint8(data, dn?1:0)) return false;
     1473                if (!asn1_pop_tag(data)) return false;
    14501474                break;
    14511475
     
    14601484                if (strncmp(val, "*)", 2) == 0) {
    14611485                        /* presence */
    1462                         asn1_push_tag(data, TLDAP_FILTER_PRES);
    1463                         asn1_write(data, s, e - s);
     1486                        if (!asn1_push_tag(data, TLDAP_FILTER_PRES)) return false;
     1487                        if (!asn1_write(data, s, e - s)) return false;
    14641488                        *_s = val + 1;
    14651489                        write_octect = false;
     
    14731497                if (*star == '*') {
    14741498                        /* substring */
    1475                         asn1_push_tag(data, TLDAP_FILTER_SUB);
    1476                         asn1_write_OctetString(data, s, e - s);
     1499                        if (!asn1_push_tag(data, TLDAP_FILTER_SUB)) return false;
     1500                        if (!asn1_write_OctetString(data, s, e - s)) return false;
    14771501                        ret = tldap_push_filter_substring(ld, data, val, &s);
    14781502                        if (!ret) {
     
    14851509
    14861510                /* if nothing else, then it is just equality */
    1487                 asn1_push_tag(data, TLDAP_FILTER_EQ);
     1511                if (!asn1_push_tag(data, TLDAP_FILTER_EQ)) return false;
    14881512                write_octect = true;
    14891513                break;
     
    15011525                }
    15021526
    1503                 asn1_write_OctetString(data, s, e - s);
    1504                 asn1_write_OctetString(data, uval, uval_len);
    1505         }
    1506 
    1507         if (data->has_error) {
     1527                if (!asn1_write_OctetString(data, s, e - s)) return false;
     1528                if (!asn1_write_OctetString(data, uval, uval_len)) return false;
     1529        }
     1530
     1531        if (asn1_has_error(data)) {
    15081532                return false;
    15091533        }
    1510         asn1_pop_tag(data);
    1511         return true;
     1534        return asn1_pop_tag(data);
    15121535}
    15131536
     
    15331556                          final   [2] LDAPString } }
    15341557        */
    1535         asn1_push_tag(data, ASN1_SEQUENCE(0));
     1558        if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) return false;
    15361559
    15371560        do {
     
    15781601                case '*':
    15791602                        if (initial) {
    1580                                 asn1_push_tag(data, TLDAP_SUB_INI);
     1603                                if (!asn1_push_tag(data, TLDAP_SUB_INI)) return false;
    15811604                                initial = false;
    15821605                        } else {
    1583                                 asn1_push_tag(data, TLDAP_SUB_ANY);
     1606                                if (!asn1_push_tag(data, TLDAP_SUB_ANY)) return false;
    15841607                        }
    15851608                        break;
    15861609                case ')':
    1587                         asn1_push_tag(data, TLDAP_SUB_FIN);
     1610                        if (!asn1_push_tag(data, TLDAP_SUB_FIN)) return false;
    15881611                        break;
    15891612                default:
     
    15911614                        return false;
    15921615                }
    1593                 asn1_write(data, chunk, chunk_len);
    1594                 asn1_pop_tag(data);
     1616                if (!asn1_write(data, chunk, chunk_len)) return false;
     1617                if (!asn1_pop_tag(data)) return false;
    15951618
    15961619                val = star + 1;
     
    16011624
    16021625        /* end of sequence */
    1603         asn1_pop_tag(data);
    1604         return true;
     1626        return asn1_pop_tag(data);
    16051627}
    16061628
     
    16551677        }
    16561678
    1657         asn1_push_tag(state->out, TLDAP_REQ_SEARCH);
    1658         asn1_write_OctetString(state->out, base, strlen(base));
    1659         asn1_write_enumerated(state->out, scope);
    1660         asn1_write_enumerated(state->out, deref);
    1661         asn1_write_Integer(state->out, sizelimit);
    1662         asn1_write_Integer(state->out, timelimit);
    1663         asn1_write_BOOLEAN(state->out, attrsonly);
     1679        if (!asn1_push_tag(state->out, TLDAP_REQ_SEARCH)) goto encoding_error;
     1680        if (!asn1_write_OctetString(state->out, base, strlen(base))) goto encoding_error;
     1681        if (!asn1_write_enumerated(state->out, scope)) goto encoding_error;
     1682        if (!asn1_write_enumerated(state->out, deref)) goto encoding_error;
     1683        if (!asn1_write_Integer(state->out, sizelimit)) goto encoding_error;
     1684        if (!asn1_write_Integer(state->out, timelimit)) goto encoding_error;
     1685        if (!asn1_write_BOOLEAN(state->out, attrsonly)) goto encoding_error;
    16641686
    16651687        if (!tldap_push_filter(ld, state->out, filter)) {
     
    16671689        }
    16681690
    1669         asn1_push_tag(state->out, ASN1_SEQUENCE(0));
     1691        if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto encoding_error;
    16701692        for (i=0; i<num_attrs; i++) {
    1671                 asn1_write_OctetString(state->out, attrs[i], strlen(attrs[i]));
    1672         }
    1673         asn1_pop_tag(state->out);
    1674         asn1_pop_tag(state->out);
     1693                if (!asn1_write_OctetString(state->out, attrs[i], strlen(attrs[i]))) goto encoding_error;
     1694        }
     1695        if (!asn1_pop_tag(state->out)) goto encoding_error;
     1696        if (!asn1_pop_tag(state->out)) goto encoding_error;
    16751697
    16761698        subreq = tldap_msg_send(state, ev, ld, state->id, state->out,
     
    17031725        case TLDAP_RES_SEARCH_ENTRY:
    17041726        case TLDAP_RES_SEARCH_REFERENCE:
     1727                if (!tldap_msg_set_pending(subreq)) {
     1728                        tevent_req_oom(req);
     1729                        return;
     1730                }
    17051731                tevent_req_notify_callback(req);
    1706                 if (!tldap_msg_set_pending(subreq)) {
    1707                         tevent_req_nomem(NULL, req);
    1708                         return;
    1709                 }
    17101732                break;
    17111733        case TLDAP_RES_SEARCH_RESULT:
     
    18191841        struct tevent_context *ev;
    18201842        struct tevent_req *req;
    1821         struct tldap_sync_search_state state;
    1822 
    1823         ZERO_STRUCT(state);
    1824         state.mem_ctx = mem_ctx;
    1825         state.rc = TLDAP_SUCCESS;
    1826 
    1827         ev = event_context_init(frame);
     1843        struct tldap_sync_search_state state = {
     1844                .mem_ctx = mem_ctx, .rc = TLDAP_SUCCESS
     1845        };
     1846
     1847        ev = samba_tevent_context_init(frame);
    18281848        if (ev == NULL) {
    18291849                state.rc = TLDAP_NO_MEMORY;
     
    18801900        int num_attribs = 0;
    18811901
    1882         asn1_start_tag(msg->data, msg->type);
     1902        if (!asn1_start_tag(msg->data, msg->type)) return false;
    18831903
    18841904        /* dn */
    18851905
    1886         asn1_read_OctetString_talloc(msg, msg->data, &msg->dn);
     1906        if (!asn1_read_OctetString_talloc(msg, msg->data, &msg->dn)) return false;
     1907
    18871908        if (msg->dn == NULL) {
    18881909                return false;
     
    19001921        }
    19011922
    1902         asn1_start_tag(msg->data, ASN1_SEQUENCE(0));
     1923        if (!asn1_start_tag(msg->data, ASN1_SEQUENCE(0))) return false;
    19031924        while (asn1_peek_tag(msg->data, ASN1_SEQUENCE(0))) {
    19041925                struct tldap_attribute *attrib;
     
    19101931                        return false;
    19111932                }
    1912                 asn1_start_tag(msg->data, ASN1_SEQUENCE(0));
    1913                 asn1_read_OctetString_talloc(msg->attribs, msg->data,
    1914                                              &attrib->name);
    1915                 asn1_start_tag(msg->data, ASN1_SET);
     1933                if (!asn1_start_tag(msg->data, ASN1_SEQUENCE(0))) return false;
     1934                if (!asn1_read_OctetString_talloc(msg->attribs, msg->data,
     1935                                             &attrib->name)) return false;
     1936                if (!asn1_start_tag(msg->data, ASN1_SET)) return false;
    19161937
    19171938                while (asn1_peek_tag(msg->data, ASN1_OCTET_STRING)) {
    1918                         asn1_read_OctetString(msg->data, msg,
    1919                                               &attrib->values[num_values]);
     1939                        if (!asn1_read_OctetString(msg->data, msg,
     1940                                              &attrib->values[num_values])) return false;
    19201941
    19211942                        attrib->values = talloc_realloc(
     
    19311952                attrib->num_values = num_values;
    19321953
    1933                 asn1_end_tag(msg->data); /* ASN1_SET */
    1934                 asn1_end_tag(msg->data); /* ASN1_SEQUENCE(0) */
     1954                if (!asn1_end_tag(msg->data)) return false; /* ASN1_SET */
     1955                if (!asn1_end_tag(msg->data)) return false; /* ASN1_SEQUENCE(0) */
    19351956                msg->attribs = talloc_realloc(
    19361957                        msg, msg->attribs, struct tldap_attribute,
     
    19431964        msg->attribs = talloc_realloc(
    19441965                msg, msg->attribs, struct tldap_attribute, num_attribs);
    1945         asn1_end_tag(msg->data);
    1946         if (msg->data->has_error) {
    1947                 return false;
    1948         }
    1949         return true;
     1966        return asn1_end_tag(msg->data);
    19501967}
    19511968
     
    19771994        struct tldap_control *sctrls = NULL;
    19781995        int num_controls = 0;
     1996        bool ret = false;
    19791997
    19801998        msg->res_sctrls = NULL;
     
    19842002        }
    19852003
    1986         asn1_start_tag(data, ASN1_CONTEXT(0));
     2004        if (!asn1_start_tag(data, ASN1_CONTEXT(0))) goto out;
    19872005
    19882006        while (asn1_peek_tag(data, ASN1_SEQUENCE(0))) {
     
    19932011                                        num_controls + 1);
    19942012                if (sctrls == NULL) {
    1995                         return false;
     2013                        goto out;
    19962014                }
    19972015                c = &sctrls[num_controls];
    19982016
    1999                 asn1_start_tag(data, ASN1_SEQUENCE(0));
    2000                 asn1_read_OctetString_talloc(msg, data, &oid);
    2001                 if ((data->has_error) || (oid == NULL)) {
    2002                         return false;
     2017                if (!asn1_start_tag(data, ASN1_SEQUENCE(0))) goto out;
     2018                if (!asn1_read_OctetString_talloc(msg, data, &oid)) goto out;
     2019                if (asn1_has_error(data) || (oid == NULL)) {
     2020                        goto out;
    20032021                }
    20042022                c->oid = oid;
    20052023                if (asn1_peek_tag(data, ASN1_BOOLEAN)) {
    2006                         asn1_read_BOOLEAN(data, &c->critical);
     2024                        if (!asn1_read_BOOLEAN(data, &c->critical)) goto out;
    20072025                } else {
    20082026                        c->critical = false;
     
    20112029                if (asn1_peek_tag(data, ASN1_OCTET_STRING) &&
    20122030                    !asn1_read_OctetString(data, msg, &c->value)) {
    2013                         return false;
    2014                 }
    2015                 asn1_end_tag(data); /* ASN1_SEQUENCE(0) */
     2031                        goto out;
     2032                }
     2033                if (!asn1_end_tag(data)) goto out; /* ASN1_SEQUENCE(0) */
    20162034
    20172035                num_controls += 1;
    20182036        }
    20192037
    2020         asn1_end_tag(data);     /* ASN1_CONTEXT(0) */
    2021 
    2022         if (data->has_error) {
     2038        if (!asn1_end_tag(data)) goto out;      /* ASN1_CONTEXT(0) */
     2039
     2040        ret = true;
     2041
     2042 out:
     2043
     2044        if (ret == false) {
    20232045                TALLOC_FREE(sctrls);
    2024                 return false;
    2025         }
    2026         msg->res_sctrls = sctrls;
    2027         return true;
     2046        } else {
     2047                msg->res_sctrls = sctrls;
     2048        }
     2049        return ret;
    20282050}
    20292051
     
    20912113        }
    20922114
    2093         asn1_push_tag(state->out, TLDAP_REQ_ADD);
    2094         asn1_write_OctetString(state->out, dn, strlen(dn));
    2095         asn1_push_tag(state->out, ASN1_SEQUENCE(0));
     2115        if (!asn1_push_tag(state->out, TLDAP_REQ_ADD)) goto err;
     2116        if (!asn1_write_OctetString(state->out, dn, strlen(dn))) goto err;
     2117        if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto err;
    20962118
    20972119        for (i=0; i<num_attributes; i++) {
    20982120                struct tldap_mod *attrib = &attributes[i];
    2099                 asn1_push_tag(state->out, ASN1_SEQUENCE(0));
    2100                 asn1_write_OctetString(state->out, attrib->attribute,
    2101                                        strlen(attrib->attribute));
    2102                 asn1_push_tag(state->out, ASN1_SET);
     2121                if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto err;
     2122                if (!asn1_write_OctetString(state->out, attrib->attribute,
     2123                                       strlen(attrib->attribute))) goto err;
     2124                if (!asn1_push_tag(state->out, ASN1_SET)) goto err;
    21032125                for (j=0; j<attrib->num_values; j++) {
    2104                         asn1_write_OctetString(state->out,
     2126                        if (!asn1_write_OctetString(state->out,
    21052127                                               attrib->values[j].data,
    2106                                                attrib->values[j].length);
    2107                 }
    2108                 asn1_pop_tag(state->out);
    2109                 asn1_pop_tag(state->out);
    2110         }
    2111 
    2112         asn1_pop_tag(state->out);
    2113         asn1_pop_tag(state->out);
     2128                                               attrib->values[j].length)) goto err;
     2129                }
     2130                if (!asn1_pop_tag(state->out)) goto err;
     2131                if (!asn1_pop_tag(state->out)) goto err;
     2132        }
     2133
     2134        if (!asn1_pop_tag(state->out)) goto err;
     2135        if (!asn1_pop_tag(state->out)) goto err;
    21142136
    21152137        subreq = tldap_msg_send(state, ev, ld, state->id, state->out,
     
    21202142        tevent_req_set_callback(subreq, tldap_add_done, req);
    21212143        return req;
     2144
     2145  err:
     2146
     2147        tevent_req_error(req, TLDAP_ENCODING_ERROR);
     2148        return tevent_req_post(req, ev);
    21222149}
    21232150
     
    21422169        int result;
    21432170
    2144         ev = event_context_init(frame);
     2171        ev = samba_tevent_context_init(frame);
    21452172        if (ev == NULL) {
    21462173                result = TLDAP_NO_MEMORY;
     
    21882215        }
    21892216
    2190         asn1_push_tag(state->out, TLDAP_REQ_MODIFY);
    2191         asn1_write_OctetString(state->out, dn, strlen(dn));
    2192         asn1_push_tag(state->out, ASN1_SEQUENCE(0));
     2217        if (!asn1_push_tag(state->out, TLDAP_REQ_MODIFY)) goto err;
     2218        if (!asn1_write_OctetString(state->out, dn, strlen(dn))) goto err;
     2219        if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto err;
    21932220
    21942221        for (i=0; i<num_mods; i++) {
    21952222                struct tldap_mod *mod = &mods[i];
    2196                 asn1_push_tag(state->out, ASN1_SEQUENCE(0));
    2197                 asn1_write_enumerated(state->out, mod->mod_op),
    2198                 asn1_push_tag(state->out, ASN1_SEQUENCE(0));
    2199                 asn1_write_OctetString(state->out, mod->attribute,
    2200                                        strlen(mod->attribute));
    2201                 asn1_push_tag(state->out, ASN1_SET);
     2223                if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto err;
     2224                if (!asn1_write_enumerated(state->out, mod->mod_op)) goto err;
     2225                if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto err;
     2226                if (!asn1_write_OctetString(state->out, mod->attribute,
     2227                                       strlen(mod->attribute))) goto err;
     2228                if (!asn1_push_tag(state->out, ASN1_SET)) goto err;
    22022229                for (j=0; j<mod->num_values; j++) {
    2203                         asn1_write_OctetString(state->out,
     2230                        if (!asn1_write_OctetString(state->out,
    22042231                                               mod->values[j].data,
    2205                                                mod->values[j].length);
    2206                 }
    2207                 asn1_pop_tag(state->out);
    2208                 asn1_pop_tag(state->out);
    2209                 asn1_pop_tag(state->out);
    2210         }
    2211 
    2212         asn1_pop_tag(state->out);
    2213         asn1_pop_tag(state->out);
     2232                                               mod->values[j].length)) goto err;
     2233                }
     2234                if (!asn1_pop_tag(state->out)) goto err;
     2235                if (!asn1_pop_tag(state->out)) goto err;
     2236                if (!asn1_pop_tag(state->out)) goto err;
     2237        }
     2238
     2239        if (!asn1_pop_tag(state->out)) goto err;
     2240        if (!asn1_pop_tag(state->out)) goto err;
    22142241
    22152242        subreq = tldap_msg_send(state, ev, ld, state->id, state->out,
     
    22202247        tevent_req_set_callback(subreq, tldap_modify_done, req);
    22212248        return req;
     2249
     2250  err:
     2251
     2252        tevent_req_error(req, TLDAP_ENCODING_ERROR);
     2253        return tevent_req_post(req, ev);
    22222254}
    22232255
     
    22422274        int result;
    22432275
    2244         ev = event_context_init(frame);
     2276        ev = samba_tevent_context_init(frame);
    22452277        if (ev == NULL) {
    22462278                result = TLDAP_NO_MEMORY;
     
    22862318        }
    22872319
    2288         asn1_push_tag(state->out, TLDAP_REQ_DELETE);
    2289         asn1_write(state->out, dn, strlen(dn));
    2290         asn1_pop_tag(state->out);
     2320        if (!asn1_push_tag(state->out, TLDAP_REQ_DELETE)) goto err;
     2321        if (!asn1_write(state->out, dn, strlen(dn))) goto err;
     2322        if (!asn1_pop_tag(state->out)) goto err;
    22912323
    22922324        subreq = tldap_msg_send(state, ev, ld, state->id, state->out,
     
    22972329        tevent_req_set_callback(subreq, tldap_delete_done, req);
    22982330        return req;
     2331
     2332  err:
     2333
     2334        tevent_req_error(req, TLDAP_ENCODING_ERROR);
     2335        return tevent_req_post(req, ev);
    22992336}
    23002337
     
    23182355        int result;
    23192356
    2320         ev = event_context_init(frame);
     2357        ev = samba_tevent_context_init(frame);
    23212358        if (ev == NULL) {
    23222359                result = TLDAP_NO_MEMORY;
Note: See TracChangeset for help on using the changeset viewer.