*/
#include "includes.h"
+#include "tldap.h"
+#include "../lib/util/asn1.h"
+#include "../lib/tsocket/tsocket.h"
+#include "../lib/util/tevent_unix.h"
+
+static int tldap_simple_recv(struct tevent_req *req);
bool tevent_req_is_ldap_error(struct tevent_req *req, int *perr)
{
struct tldap_ctx_attribute *tmp, *attr;
char *tmpname;
int num_attrs;
- void **pptr = (void **)_pptr;
+ void **pptr = (void **)discard_const_p(void,_pptr);
attr = tldap_context_findattr(ld, name);
if (attr != NULL) {
return tevent_req_post(req, ev);
}
- state->iov.iov_base = blob.data;
+ state->iov.iov_base = (void *)blob.data;
state->iov.iov_len = blob.length;
subreq = tstream_writev_queue_send(state, ev, ld->conn, ld->outgoing,
* No NULL check here, we're shrinking by sizeof(void *), and
* talloc_realloc just adjusts the size for this.
*/
- ld->pending = talloc_realloc(NULL, ld->pending, struct tevent_req *,
+ ld->pending = talloc_realloc(ld, ld->pending, struct tevent_req *,
num_pending - 1);
return;
}
}
/*
- * We're the first ones, add the read_ldap request that waits for the
+ * We're the first one, add the read_ldap request that waits for the
* answer from the server
*/
subreq = read_ldap_send(ld->pending, state->ev, ld->conn);
}
if (!tldap_msg_set_pending(req)) {
- tevent_req_nomem(NULL, req);
+ tevent_req_oom(req);
return;
}
}
subreq, struct tldap_context);
struct tevent_req *req;
struct tldap_msg_state *state;
- struct tevent_context *ev;
struct asn1_data *data;
uint8_t *inbuf;
ssize_t received;
state->inbuf = talloc_move(state, &inbuf);
state->data = talloc_move(state, &data);
- ev = state->ev;
-
talloc_set_destructor(req, NULL);
tldap_msg_unset_pending(req);
num_pending = talloc_array_length(ld->pending);
static char *blob2string_talloc(TALLOC_CTX *mem_ctx, DATA_BLOB blob)
{
char *result = talloc_array(mem_ctx, char, blob.length+1);
+
+ if (result == NULL) {
+ return NULL;
+ }
+
memcpy(result, blob.data, blob.length);
result[blob.length] = '\0';
return result;
static bool asn1_read_OctetString_talloc(TALLOC_CTX *mem_ctx,
struct asn1_data *data,
- char **result)
+ char **presult)
{
DATA_BLOB string;
+ char *result;
if (!asn1_read_OctetString(data, mem_ctx, &string))
return false;
- *result = blob2string_talloc(mem_ctx, string);
+
+ result = blob2string_talloc(mem_ctx, string);
+
data_blob_free(&string);
+
+ if (result == NULL) {
+ return false;
+ }
+ *presult = result;
return true;
}
int tldap_sasl_bind_recv(struct tevent_req *req)
{
- int err;
-
- if (tevent_req_is_ldap_error(req, &err)) {
- return err;
- }
- return TLDAP_SUCCESS;
+ return tldap_simple_recv(req);
}
int tldap_sasl_bind(struct tldap_context *ld,
DATA_BLOB cred;
if (passwd != NULL) {
- cred.data = (uint8_t *)passwd;
+ cred.data = discard_const_p(uint8_t, passwd);
cred.length = strlen(passwd);
} else {
- cred.data = (uint8_t *)"";
+ cred.data = discard_const_p(uint8_t, "");
cred.length = 0;
}
return tldap_sasl_bind_send(mem_ctx, ev, ld, dn, NULL, &cred, NULL, 0,
DATA_BLOB cred;
if (passwd != NULL) {
- cred.data = (uint8_t *)passwd;
+ cred.data = discard_const_p(uint8_t, passwd);
cred.length = strlen(passwd);
} else {
- cred.data = (uint8_t *)"";
+ cred.data = discard_const_p(uint8_t, "");
cred.length = 0;
}
return tldap_sasl_bind(ld, dn, NULL, &cred, NULL, 0, NULL, 0);
/*****************************************************************************/
/* can't use isalpha() as only a strict set is valid for LDAP */
-#define TLDAP_IS_ALPHA(c) ((((c) >= 'a') && ((c) <= 'z')) || \
- (((c) >= 'A') && ((c) <= 'Z')))
-#define TLDAP_IS_ADH(c) (TLDAP_IS_ALPHA(c) || isdigit(c) || (c) == '-')
+static bool tldap_is_alpha(char c)
+{
+ return (((c >= 'a') && (c <= 'z')) || \
+ ((c >= 'A') && (c <= 'Z')));
+}
+
+static bool tldap_is_adh(char c)
+{
+ return tldap_is_alpha(c) || isdigit(c) || (c == '-');
+}
#define TLDAP_FILTER_AND ASN1_CONTEXT(0)
#define TLDAP_FILTER_OR ASN1_CONTEXT(1)
/* first char has stricter rules */
if (isdigit(*s)) {
is_oid = true;
- } else if (!TLDAP_IS_ALPHA(*s)) {
+ } else if (!tldap_is_alpha(*s)) {
/* bad first char */
return false;
}
continue;
}
} else {
- if (TLDAP_IS_ADH(s[i])) {
+ if (tldap_is_adh(s[i])) {
continue;
}
}
{
if (isxdigit(x[0]) && isxdigit(x[1])) {
const char h1 = x[0], h2 = x[1];
- int c;
+ int c = 0;
if (h1 >= 'a') c = h1 - (int)'a' + 10;
else if (h1 >= 'A') c = h1 - (int)'A' + 10;
const char *dn;
const char *rule;
const char *star;
- size_t type_len;
+ size_t type_len = 0;
char *uval;
size_t uval_len;
bool write_octect = true;
return false;
}
- if (StrnCaseCmp(dn, "dn:", 3) != 0) {
+ if (strncasecmp_m(dn, "dn:", 3) != 0) {
if (rule == e) {
rule = dn;
dn = NULL;
switch (state->result->type) {
case TLDAP_RES_SEARCH_ENTRY:
case TLDAP_RES_SEARCH_REFERENCE:
- tevent_req_notify_callback(req);
if (!tldap_msg_set_pending(subreq)) {
- tevent_req_nomem(NULL, req);
+ tevent_req_oom(req);
return;
}
+ tevent_req_notify_callback(req);
break;
case TLDAP_RES_SEARCH_RESULT:
TALLOC_FREE(subreq);
return true;
}
-bool tldap_entry_attributes(struct tldap_message *msg, int *num_attributes,
- struct tldap_attribute **attributes)
+bool tldap_entry_attributes(struct tldap_message *msg,
+ struct tldap_attribute **attributes,
+ int *num_attributes)
{
if ((msg->dn == NULL) && (!tldap_parse_search_entry(msg))) {
return false;
}
int tldap_add(struct tldap_context *ld, const char *dn,
- int num_attributes, struct tldap_mod *attributes,
+ struct tldap_mod *attributes, int num_attributes,
struct tldap_control *sctrls, int num_sctrls,
struct tldap_control *cctrls, int num_cctrls)
{
struct tevent_context *ev,
struct tldap_context *ld,
const char *dn,
- int num_mods, struct tldap_mod *mods,
+ struct tldap_mod *mods, int num_mods,
struct tldap_control *sctrls,
int num_sctrls,
struct tldap_control *cctrls,
}
int tldap_modify(struct tldap_context *ld, const char *dn,
- int num_mods, struct tldap_mod *mods,
+ struct tldap_mod *mods, int num_mods,
struct tldap_control *sctrls, int num_sctrls,
struct tldap_control *cctrls, int num_cctrls)
{
goto fail;
}
- req = tldap_modify_send(frame, ev, ld, dn, num_mods, mods,
+ req = tldap_modify_send(frame, ev, ld, dn, mods, num_mods,
sctrls, num_sctrls, cctrls, num_cctrls);
if (req == NULL) {
result = TLDAP_NO_MEMORY;
if (msg == NULL) {
*sctrls = NULL;
*num_sctrls = 0;
+ return;
}
*sctrls = msg->res_sctrls;
*num_sctrls = talloc_array_length(msg->res_sctrls);