Changeset 988 for vendor/current/source3/lib/tldap.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/lib/tldap.c
r740 r988 18 18 */ 19 19 20 #include " includes.h"20 #include "replace.h" 21 21 #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" 22 27 #include "../lib/util/asn1.h" 23 28 #include "../lib/tsocket/tsocket.h" … … 58 63 struct tldap_context { 59 64 int ld_version; 60 int ld_deref;61 int ld_sizelimit;62 int ld_timelimit;63 65 struct tstream_context *conn; 64 66 bool server_down; … … 172 174 struct tldap_context *ld, const char *name) 173 175 { 174 int i, num_attrs;176 size_t i, num_attrs; 175 177 176 178 num_attrs = talloc_array_length(ld->ctx_attrs); … … 190 192 char *tmpname; 191 193 int num_attrs; 192 void **pptr = (void **) _pptr;194 void **pptr = (void **)discard_const_p(void,_pptr); 193 195 194 196 attr = tldap_context_findattr(ld, name); … … 357 359 }; 358 360 359 static voidtldap_push_controls(struct asn1_data *data,361 static bool tldap_push_controls(struct asn1_data *data, 360 362 struct tldap_control *sctrls, 361 363 int num_sctrls) … … 364 366 365 367 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; 370 372 371 373 for (i=0; i<num_sctrls; i++) { 372 374 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; 375 377 if (c->critical) { 376 asn1_write_BOOLEAN(data, true);378 if (!asn1_write_BOOLEAN(data, true)) return false; 377 379 } 378 380 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) */ 386 388 } 387 389 … … 416 418 } 417 419 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 } 421 430 422 431 if (!asn1_blob(data, &blob)) { … … 444 453 int num_pending = talloc_array_length(ld->pending); 445 454 int i; 455 456 tevent_req_set_cleanup_fn(req, NULL); 446 457 447 458 if (num_pending == 1) { … … 477 488 ld->pending = talloc_realloc(NULL, ld->pending, struct tevent_req *, 478 489 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 492 static 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 } 486 503 } 487 504 … … 505 522 pending[num_pending] = req; 506 523 ld->pending = pending; 507 t alloc_set_destructor(req, tldap_msg_destructor);524 tevent_req_set_cleanup_fn(req, tldap_msg_cleanup); 508 525 509 526 if (num_pending > 0) { … … 542 559 543 560 if (!tldap_msg_set_pending(req)) { 544 tevent_req_ nomem(NULL,req);561 tevent_req_oom(req); 545 562 return; 546 563 } … … 619 636 state->data = talloc_move(state, &data); 620 637 621 talloc_set_destructor(req, NULL);622 638 tldap_msg_unset_pending(req); 623 639 num_pending = talloc_array_length(ld->pending); … … 651 667 while (talloc_array_length(ld->pending) > 0) { 652 668 req = ld->pending[0]; 653 talloc_set_destructor(req, NULL);654 t ldap_msg_destructor(req);669 state = tevent_req_data(req, struct tldap_msg_state); 670 tevent_req_defer_callback(req, state->ev); 655 671 tevent_req_error(req, status); 656 672 } … … 709 725 return NULL; 710 726 } 711 ZERO_STRUCTP(state);712 727 state->out = asn1_init(state); 713 728 if (state->out == NULL) { 714 TALLOC_FREE(req); 715 return NULL; 716 } 717 state->result = NULL; 729 goto err; 730 } 718 731 state->id = tldap_next_msgid(ld); 719 732 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; 722 735 723 736 *pstate = state; 724 737 return req; 738 739 err: 740 741 TALLOC_FREE(req); 742 return NULL; 725 743 } 726 744 … … 779 797 ok &= asn1_read_OctetString_talloc(msg, data, 780 798 &msg->res_diagnosticmessage); 799 if (!ok) return ok; 781 800 if (asn1_peek_tag(data, ASN1_CONTEXT(3))) { 782 801 ok &= asn1_start_tag(data, ASN1_CONTEXT(3)); … … 816 835 } 817 836 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; 821 840 822 841 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; 826 845 } 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; 830 849 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; 841 857 842 858 subreq = tldap_msg_send(state, ev, ld, state->id, state->out, … … 847 863 tevent_req_set_callback(subreq, tldap_sasl_bind_done, req); 848 864 return req; 865 866 err: 867 868 tevent_req_error(req, TLDAP_ENCODING_ERROR); 869 return tevent_req_post(req, ev); 849 870 } 850 871 … … 902 923 int result; 903 924 904 ev = event_context_init(frame);925 ev = samba_tevent_context_init(frame); 905 926 if (ev == NULL) { 906 927 result = TLDAP_NO_MEMORY; … … 936 957 937 958 if (passwd != NULL) { 938 cred.data = (uint8_t *)passwd;959 cred.data = discard_const_p(uint8_t, passwd); 939 960 cred.length = strlen(passwd); 940 961 } else { 941 cred.data = (uint8_t *)"";962 cred.data = discard_const_p(uint8_t, ""); 942 963 cred.length = 0; 943 964 } … … 957 978 958 979 if (passwd != NULL) { 959 cred.data = (uint8_t *)passwd;980 cred.data = discard_const_p(uint8_t, passwd); 960 981 cred.length = strlen(passwd); 961 982 } else { 962 cred.data = (uint8_t *)"";983 cred.data = discard_const_p(uint8_t, ""); 963 984 cred.length = 0; 964 985 } … … 1224 1245 case '&': 1225 1246 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; 1227 1248 s++; 1228 1249 break; … … 1230 1251 case '|': 1231 1252 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; 1233 1254 s++; 1234 1255 break; … … 1236 1257 case '!': 1237 1258 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; 1239 1260 s++; 1240 1261 ret = tldap_push_filter_int(ld, data, &s); … … 1242 1263 return false; 1243 1264 } 1244 asn1_pop_tag(data);1265 if (!asn1_pop_tag(data)) return false; 1245 1266 goto done; 1246 1267 … … 1269 1290 if (*s == ')') { 1270 1291 /* RFC 4526: empty and/or */ 1271 asn1_pop_tag(data);1292 if (!asn1_pop_tag(data)) return false; 1272 1293 goto done; 1273 1294 } … … 1281 1302 if (*s == ')') { 1282 1303 /* end of list, return */ 1283 asn1_pop_tag(data);1304 if (!asn1_pop_tag(data)) return false; 1284 1305 break; 1285 1306 } … … 1294 1315 s++; 1295 1316 1296 if ( data->has_error) {1317 if (asn1_has_error(data)) { 1297 1318 return false; 1298 1319 } … … 1334 1355 switch (*e) { 1335 1356 case '<': 1336 asn1_push_tag(data, TLDAP_FILTER_LE);1357 if (!asn1_push_tag(data, TLDAP_FILTER_LE)) return false; 1337 1358 break; 1338 1359 1339 1360 case '>': 1340 asn1_push_tag(data, TLDAP_FILTER_GE);1361 if (!asn1_push_tag(data, TLDAP_FILTER_GE)) return false; 1341 1362 break; 1342 1363 1343 1364 case '~': 1344 asn1_push_tag(data, TLDAP_FILTER_APX);1365 if (!asn1_push_tag(data, TLDAP_FILTER_APX)) return false; 1345 1366 break; 1346 1367 1347 1368 case ':': 1348 asn1_push_tag(data, TLDAP_FILTER_EXT);1369 if (!asn1_push_tag(data, TLDAP_FILTER_EXT)) return false; 1349 1370 write_octect = false; 1350 1371 … … 1371 1392 1372 1393 rule = strchr(dn, ':'); 1394 if (rule == NULL) { 1395 return false; 1396 } 1373 1397 if ((rule == dn + 1) || rule + 1 == e) { 1374 1398 /* malformed filter, contains "::" */ … … 1376 1400 } 1377 1401 1378 if ( StrnCaseCmp(dn, "dn:", 3) != 0) {1402 if (strncasecmp_m(dn, "dn:", 3) != 0) { 1379 1403 if (rule == e) { 1380 1404 rule = dn; … … 1415 1439 return false; 1416 1440 } 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; 1420 1444 } 1421 1445 … … 1426 1450 return false; 1427 1451 } 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; 1431 1455 } 1432 1456 … … 1441 1465 } 1442 1466 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; 1450 1474 break; 1451 1475 … … 1460 1484 if (strncmp(val, "*)", 2) == 0) { 1461 1485 /* 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; 1464 1488 *_s = val + 1; 1465 1489 write_octect = false; … … 1473 1497 if (*star == '*') { 1474 1498 /* 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; 1477 1501 ret = tldap_push_filter_substring(ld, data, val, &s); 1478 1502 if (!ret) { … … 1485 1509 1486 1510 /* 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; 1488 1512 write_octect = true; 1489 1513 break; … … 1501 1525 } 1502 1526 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)) { 1508 1532 return false; 1509 1533 } 1510 asn1_pop_tag(data); 1511 return true; 1534 return asn1_pop_tag(data); 1512 1535 } 1513 1536 … … 1533 1556 final [2] LDAPString } } 1534 1557 */ 1535 asn1_push_tag(data, ASN1_SEQUENCE(0));1558 if (!asn1_push_tag(data, ASN1_SEQUENCE(0))) return false; 1536 1559 1537 1560 do { … … 1578 1601 case '*': 1579 1602 if (initial) { 1580 asn1_push_tag(data, TLDAP_SUB_INI);1603 if (!asn1_push_tag(data, TLDAP_SUB_INI)) return false; 1581 1604 initial = false; 1582 1605 } else { 1583 asn1_push_tag(data, TLDAP_SUB_ANY);1606 if (!asn1_push_tag(data, TLDAP_SUB_ANY)) return false; 1584 1607 } 1585 1608 break; 1586 1609 case ')': 1587 asn1_push_tag(data, TLDAP_SUB_FIN);1610 if (!asn1_push_tag(data, TLDAP_SUB_FIN)) return false; 1588 1611 break; 1589 1612 default: … … 1591 1614 return false; 1592 1615 } 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; 1595 1618 1596 1619 val = star + 1; … … 1601 1624 1602 1625 /* end of sequence */ 1603 asn1_pop_tag(data); 1604 return true; 1626 return asn1_pop_tag(data); 1605 1627 } 1606 1628 … … 1655 1677 } 1656 1678 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; 1664 1686 1665 1687 if (!tldap_push_filter(ld, state->out, filter)) { … … 1667 1689 } 1668 1690 1669 asn1_push_tag(state->out, ASN1_SEQUENCE(0));1691 if (!asn1_push_tag(state->out, ASN1_SEQUENCE(0))) goto encoding_error; 1670 1692 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; 1675 1697 1676 1698 subreq = tldap_msg_send(state, ev, ld, state->id, state->out, … … 1703 1725 case TLDAP_RES_SEARCH_ENTRY: 1704 1726 case TLDAP_RES_SEARCH_REFERENCE: 1727 if (!tldap_msg_set_pending(subreq)) { 1728 tevent_req_oom(req); 1729 return; 1730 } 1705 1731 tevent_req_notify_callback(req); 1706 if (!tldap_msg_set_pending(subreq)) {1707 tevent_req_nomem(NULL, req);1708 return;1709 }1710 1732 break; 1711 1733 case TLDAP_RES_SEARCH_RESULT: … … 1819 1841 struct tevent_context *ev; 1820 1842 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); 1828 1848 if (ev == NULL) { 1829 1849 state.rc = TLDAP_NO_MEMORY; … … 1880 1900 int num_attribs = 0; 1881 1901 1882 asn1_start_tag(msg->data, msg->type);1902 if (!asn1_start_tag(msg->data, msg->type)) return false; 1883 1903 1884 1904 /* dn */ 1885 1905 1886 asn1_read_OctetString_talloc(msg, msg->data, &msg->dn); 1906 if (!asn1_read_OctetString_talloc(msg, msg->data, &msg->dn)) return false; 1907 1887 1908 if (msg->dn == NULL) { 1888 1909 return false; … … 1900 1921 } 1901 1922 1902 asn1_start_tag(msg->data, ASN1_SEQUENCE(0));1923 if (!asn1_start_tag(msg->data, ASN1_SEQUENCE(0))) return false; 1903 1924 while (asn1_peek_tag(msg->data, ASN1_SEQUENCE(0))) { 1904 1925 struct tldap_attribute *attrib; … … 1910 1931 return false; 1911 1932 } 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; 1916 1937 1917 1938 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; 1920 1941 1921 1942 attrib->values = talloc_realloc( … … 1931 1952 attrib->num_values = num_values; 1932 1953 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) */ 1935 1956 msg->attribs = talloc_realloc( 1936 1957 msg, msg->attribs, struct tldap_attribute, … … 1943 1964 msg->attribs = talloc_realloc( 1944 1965 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); 1950 1967 } 1951 1968 … … 1977 1994 struct tldap_control *sctrls = NULL; 1978 1995 int num_controls = 0; 1996 bool ret = false; 1979 1997 1980 1998 msg->res_sctrls = NULL; … … 1984 2002 } 1985 2003 1986 asn1_start_tag(data, ASN1_CONTEXT(0));2004 if (!asn1_start_tag(data, ASN1_CONTEXT(0))) goto out; 1987 2005 1988 2006 while (asn1_peek_tag(data, ASN1_SEQUENCE(0))) { … … 1993 2011 num_controls + 1); 1994 2012 if (sctrls == NULL) { 1995 return false;2013 goto out; 1996 2014 } 1997 2015 c = &sctrls[num_controls]; 1998 2016 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; 2003 2021 } 2004 2022 c->oid = oid; 2005 2023 if (asn1_peek_tag(data, ASN1_BOOLEAN)) { 2006 asn1_read_BOOLEAN(data, &c->critical);2024 if (!asn1_read_BOOLEAN(data, &c->critical)) goto out; 2007 2025 } else { 2008 2026 c->critical = false; … … 2011 2029 if (asn1_peek_tag(data, ASN1_OCTET_STRING) && 2012 2030 !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) */ 2016 2034 2017 2035 num_controls += 1; 2018 2036 } 2019 2037 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) { 2023 2045 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; 2028 2050 } 2029 2051 … … 2091 2113 } 2092 2114 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; 2096 2118 2097 2119 for (i=0; i<num_attributes; i++) { 2098 2120 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; 2103 2125 for (j=0; j<attrib->num_values; j++) { 2104 asn1_write_OctetString(state->out,2126 if (!asn1_write_OctetString(state->out, 2105 2127 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; 2114 2136 2115 2137 subreq = tldap_msg_send(state, ev, ld, state->id, state->out, … … 2120 2142 tevent_req_set_callback(subreq, tldap_add_done, req); 2121 2143 return req; 2144 2145 err: 2146 2147 tevent_req_error(req, TLDAP_ENCODING_ERROR); 2148 return tevent_req_post(req, ev); 2122 2149 } 2123 2150 … … 2142 2169 int result; 2143 2170 2144 ev = event_context_init(frame);2171 ev = samba_tevent_context_init(frame); 2145 2172 if (ev == NULL) { 2146 2173 result = TLDAP_NO_MEMORY; … … 2188 2215 } 2189 2216 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; 2193 2220 2194 2221 for (i=0; i<num_mods; i++) { 2195 2222 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; 2202 2229 for (j=0; j<mod->num_values; j++) { 2203 asn1_write_OctetString(state->out,2230 if (!asn1_write_OctetString(state->out, 2204 2231 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; 2214 2241 2215 2242 subreq = tldap_msg_send(state, ev, ld, state->id, state->out, … … 2220 2247 tevent_req_set_callback(subreq, tldap_modify_done, req); 2221 2248 return req; 2249 2250 err: 2251 2252 tevent_req_error(req, TLDAP_ENCODING_ERROR); 2253 return tevent_req_post(req, ev); 2222 2254 } 2223 2255 … … 2242 2274 int result; 2243 2275 2244 ev = event_context_init(frame);2276 ev = samba_tevent_context_init(frame); 2245 2277 if (ev == NULL) { 2246 2278 result = TLDAP_NO_MEMORY; … … 2286 2318 } 2287 2319 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; 2291 2323 2292 2324 subreq = tldap_msg_send(state, ev, ld, state->id, state->out, … … 2297 2329 tevent_req_set_callback(subreq, tldap_delete_done, req); 2298 2330 return req; 2331 2332 err: 2333 2334 tevent_req_error(req, TLDAP_ENCODING_ERROR); 2335 return tevent_req_post(req, ev); 2299 2336 } 2300 2337 … … 2318 2355 int result; 2319 2356 2320 ev = event_context_init(frame);2357 ev = samba_tevent_context_init(frame); 2321 2358 if (ev == NULL) { 2322 2359 result = TLDAP_NO_MEMORY;
Note:
See TracChangeset
for help on using the changeset viewer.