From 1c5aca620c6c5cd829c10cbe12aefb3605da0d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Mon, 25 Aug 2003 20:29:03 +0000 Subject: [PATCH] code rewrite from Luke Howard git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12642 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/hdb/hdb-ldap.c | 167 +++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 80 deletions(-) diff --git a/lib/hdb/hdb-ldap.c b/lib/hdb/hdb-ldap.c index ec73b10e1..e8cfcf29a 100644 --- a/lib/hdb/hdb-ldap.c +++ b/lib/hdb/hdb-ldap.c @@ -62,69 +62,101 @@ static char *krb5principal_attrs[] = NULL }; -/* based on samba: source/passdb/ldap.c */ static krb5_error_code -LDAP_addmod_len(LDAPMod *** modlist, int modop, const char *attribute, - unsigned char *value, size_t len) +LDAP__setmod(LDAPMod *** modlist, int modop, const char *attribute, + int *pIndex) { - LDAPMod **mods = *modlist; - int i, j; + int cMods; - if (mods == NULL) { - mods = (LDAPMod **) calloc(1, sizeof(LDAPMod *)); - if (mods == NULL) { + if (*modlist == NULL) { + *modlist = (LDAPMod **)ber_memcalloc(1, sizeof(LDAPMod *)); + if (*modlist == NULL) { return ENOMEM; } - mods[0] = NULL; } - for (i = 0; mods[i] != NULL; ++i) { - if ((mods[i]->mod_op & (~LDAP_MOD_BVALUES)) == modop - && (!strcasecmp(mods[i]->mod_type, attribute))) { + for (cMods = 0; (*modlist)[cMods] != NULL; cMods++) { + if ((*modlist)[cMods]->mod_op == modop && + strcasecmp((*modlist)[cMods]->mod_type, attribute) == 0) { break; } } - if (mods[i] == NULL) { - mods = (LDAPMod **) realloc(mods, (i + 2) * sizeof(LDAPMod *)); - if (mods == NULL) { + *pIndex = cMods; + + if ((*modlist)[cMods] == NULL) { + LDAPMod *mod; + + *modlist = (LDAPMod **)ber_memrealloc(*modlist, + (cMods + 2) * sizeof(LDAPMod *)); + if (*modlist == NULL) { return ENOMEM; } - mods[i] = (LDAPMod *) malloc(sizeof(LDAPMod)); - if (mods[i] == NULL) { + (*modlist)[cMods] = (LDAPMod *)ber_memalloc(sizeof(LDAPMod)); + if ((*modlist)[cMods] == NULL) { return ENOMEM; } - mods[i]->mod_op = modop | LDAP_MOD_BVALUES; - mods[i]->mod_bvalues = NULL; - mods[i]->mod_type = strdup(attribute); - if (mods[i]->mod_type == NULL) { + + mod = (*modlist)[cMods]; + mod->mod_op = modop; + mod->mod_type = ber_strdup(attribute); + if (mod->mod_type == NULL) { + ber_memfree(mod); + (*modlist)[cMods] = NULL; return ENOMEM; } - mods[i + 1] = NULL; + + if (modop & LDAP_MOD_BVALUES) { + mod->mod_bvalues = NULL; + } else { + mod->mod_values = NULL; + } + + (*modlist)[cMods + 1] = NULL; + } + + return 0; +} + +static krb5_error_code +LDAP_addmod_len(LDAPMod *** modlist, int modop, const char *attribute, + unsigned char *value, size_t len) +{ + int cMods, cValues = 0; + krb5_error_code ret; + + ret = LDAP__setmod(modlist, modop | LDAP_MOD_BVALUES, attribute, &cMods); + if (ret != 0) { + return ret; } if (value != NULL) { - j = 0; - if (mods[i]->mod_bvalues != NULL) { - for (; mods[i]->mod_bvalues[j] != NULL; j++); + struct berval *bValue; + struct berval ***pbValues = &((*modlist)[cMods]->mod_bvalues); + + if (*pbValues != NULL) { + for (cValues = 0; (*pbValues)[cValues] != NULL; cValues++) + ; + *pbValues = (struct berval **)ber_memrealloc(*pbValues, (cValues + 2) + * sizeof(struct berval *)); + } else { + *pbValues = (struct berval **)ber_memalloc(2 * sizeof(struct berval *)); } - mods[i]->mod_bvalues = - (struct berval **) realloc(mods[i]->mod_bvalues, - (j + 2) * sizeof(struct berval *)); - if (mods[i]->mod_bvalues == NULL) { + if (*pbValues == NULL) { return ENOMEM; } - /* Caller allocates memory on our behalf, unlike LDAP_addmod. */ - mods[i]->mod_bvalues[j] = - (struct berval *) malloc(sizeof(struct berval)); - if (mods[i]->mod_bvalues[j] == NULL) { + (*pbValues)[cValues] = (struct berval *)ber_memalloc(sizeof(struct berval));; + if ((*pbValues)[cValues] == NULL) { return ENOMEM; } - mods[i]->mod_bvalues[j]->bv_val = value; - mods[i]->mod_bvalues[j]->bv_len = len; - mods[i]->mod_bvalues[j + 1] = NULL; + + bValue = (*pbValues)[cValues]; + bValue->bv_val = value; + bValue->bv_len = len; + + (*pbValues)[cValues + 1] = NULL; } - *modlist = mods; + return 0; } @@ -132,59 +164,34 @@ static krb5_error_code LDAP_addmod(LDAPMod *** modlist, int modop, const char *attribute, const char *value) { - LDAPMod **mods = *modlist; - int i, j; + int cMods, cValues = 0; + krb5_error_code ret; - if (mods == NULL) { - mods = (LDAPMod **) calloc(1, sizeof(LDAPMod *)); - if (mods == NULL) { - return ENOMEM; - } - mods[0] = NULL; - } - - for (i = 0; mods[i] != NULL; ++i) { - if (mods[i]->mod_op == modop - && (!strcasecmp(mods[i]->mod_type, attribute))) { - break; - } - } - - if (mods[i] == NULL) { - mods = (LDAPMod **) realloc(mods, (i + 2) * sizeof(LDAPMod *)); - if (mods == NULL) { - return ENOMEM; - } - mods[i] = (LDAPMod *) malloc(sizeof(LDAPMod)); - if (mods[i] == NULL) { - return ENOMEM; - } - mods[i]->mod_op = modop; - mods[i]->mod_values = NULL; - mods[i]->mod_type = strdup(attribute); - if (mods[i]->mod_type == NULL) { - return ENOMEM; - } - mods[i + 1] = NULL; + ret = LDAP__setmod(modlist, modop, attribute, &cMods); + if (ret != 0) { + return ret; } if (value != NULL) { - j = 0; - if (mods[i]->mod_values != NULL) { - for (; mods[i]->mod_values[j] != NULL; j++); + char ***pValues = &((*modlist)[cMods]->mod_values); + + if (*pValues != NULL) { + for (cValues = 0; (*pValues)[cValues] != NULL; cValues++) + ; + *pValues = (char **)ber_memrealloc(*pValues, (cValues + 2) * sizeof(char *)); + } else { + *pValues = (char **)ber_memalloc(2 * sizeof(char *)); } - mods[i]->mod_values = (char **) realloc(mods[i]->mod_values, - (j + 2) * sizeof(char *)); - if (mods[i]->mod_values == NULL) { + if (*pValues == NULL) { return ENOMEM; } - mods[i]->mod_values[j] = strdup(value); - if (mods[i]->mod_values[j] == NULL) { + (*pValues)[cValues] = ber_strdup(value); + if ((*pValues)[cValues] == NULL) { return ENOMEM; } - mods[i]->mod_values[j + 1] = NULL; + (*pValues)[cValues + 1] = NULL; } - *modlist = mods; + return 0; }