code rewrite from Luke Howard <lukeh@PADL.COM>
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12642 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -62,69 +62,101 @@ static char *krb5principal_attrs[] =
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/* based on samba: source/passdb/ldap.c */
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
LDAP_addmod_len(LDAPMod *** modlist, int modop, const char *attribute,
|
LDAP__setmod(LDAPMod *** modlist, int modop, const char *attribute,
|
||||||
unsigned char *value, size_t len)
|
int *pIndex)
|
||||||
{
|
{
|
||||||
LDAPMod **mods = *modlist;
|
int cMods;
|
||||||
int i, j;
|
|
||||||
|
|
||||||
if (mods == NULL) {
|
if (*modlist == NULL) {
|
||||||
mods = (LDAPMod **) calloc(1, sizeof(LDAPMod *));
|
*modlist = (LDAPMod **)ber_memcalloc(1, sizeof(LDAPMod *));
|
||||||
if (mods == NULL) {
|
if (*modlist == NULL) {
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
mods[0] = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; mods[i] != NULL; ++i) {
|
for (cMods = 0; (*modlist)[cMods] != NULL; cMods++) {
|
||||||
if ((mods[i]->mod_op & (~LDAP_MOD_BVALUES)) == modop
|
if ((*modlist)[cMods]->mod_op == modop &&
|
||||||
&& (!strcasecmp(mods[i]->mod_type, attribute))) {
|
strcasecmp((*modlist)[cMods]->mod_type, attribute) == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mods[i] == NULL) {
|
*pIndex = cMods;
|
||||||
mods = (LDAPMod **) realloc(mods, (i + 2) * sizeof(LDAPMod *));
|
|
||||||
if (mods == NULL) {
|
if ((*modlist)[cMods] == NULL) {
|
||||||
|
LDAPMod *mod;
|
||||||
|
|
||||||
|
*modlist = (LDAPMod **)ber_memrealloc(*modlist,
|
||||||
|
(cMods + 2) * sizeof(LDAPMod *));
|
||||||
|
if (*modlist == NULL) {
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
mods[i] = (LDAPMod *) malloc(sizeof(LDAPMod));
|
(*modlist)[cMods] = (LDAPMod *)ber_memalloc(sizeof(LDAPMod));
|
||||||
if (mods[i] == NULL) {
|
if ((*modlist)[cMods] == NULL) {
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
mods[i]->mod_op = modop | LDAP_MOD_BVALUES;
|
|
||||||
mods[i]->mod_bvalues = NULL;
|
mod = (*modlist)[cMods];
|
||||||
mods[i]->mod_type = strdup(attribute);
|
mod->mod_op = modop;
|
||||||
if (mods[i]->mod_type == NULL) {
|
mod->mod_type = ber_strdup(attribute);
|
||||||
|
if (mod->mod_type == NULL) {
|
||||||
|
ber_memfree(mod);
|
||||||
|
(*modlist)[cMods] = NULL;
|
||||||
return ENOMEM;
|
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) {
|
if (value != NULL) {
|
||||||
j = 0;
|
struct berval *bValue;
|
||||||
if (mods[i]->mod_bvalues != NULL) {
|
struct berval ***pbValues = &((*modlist)[cMods]->mod_bvalues);
|
||||||
for (; mods[i]->mod_bvalues[j] != NULL; j++);
|
|
||||||
|
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 =
|
if (*pbValues == NULL) {
|
||||||
(struct berval **) realloc(mods[i]->mod_bvalues,
|
|
||||||
(j + 2) * sizeof(struct berval *));
|
|
||||||
if (mods[i]->mod_bvalues == NULL) {
|
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
/* Caller allocates memory on our behalf, unlike LDAP_addmod. */
|
(*pbValues)[cValues] = (struct berval *)ber_memalloc(sizeof(struct berval));;
|
||||||
mods[i]->mod_bvalues[j] =
|
if ((*pbValues)[cValues] == NULL) {
|
||||||
(struct berval *) malloc(sizeof(struct berval));
|
|
||||||
if (mods[i]->mod_bvalues[j] == NULL) {
|
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
mods[i]->mod_bvalues[j]->bv_val = value;
|
|
||||||
mods[i]->mod_bvalues[j]->bv_len = len;
|
bValue = (*pbValues)[cValues];
|
||||||
mods[i]->mod_bvalues[j + 1] = NULL;
|
bValue->bv_val = value;
|
||||||
|
bValue->bv_len = len;
|
||||||
|
|
||||||
|
(*pbValues)[cValues + 1] = NULL;
|
||||||
}
|
}
|
||||||
*modlist = mods;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,59 +164,34 @@ static krb5_error_code
|
|||||||
LDAP_addmod(LDAPMod *** modlist, int modop, const char *attribute,
|
LDAP_addmod(LDAPMod *** modlist, int modop, const char *attribute,
|
||||||
const char *value)
|
const char *value)
|
||||||
{
|
{
|
||||||
LDAPMod **mods = *modlist;
|
int cMods, cValues = 0;
|
||||||
int i, j;
|
krb5_error_code ret;
|
||||||
|
|
||||||
if (mods == NULL) {
|
ret = LDAP__setmod(modlist, modop, attribute, &cMods);
|
||||||
mods = (LDAPMod **) calloc(1, sizeof(LDAPMod *));
|
if (ret != 0) {
|
||||||
if (mods == NULL) {
|
return ret;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value != NULL) {
|
if (value != NULL) {
|
||||||
j = 0;
|
char ***pValues = &((*modlist)[cMods]->mod_values);
|
||||||
if (mods[i]->mod_values != NULL) {
|
|
||||||
for (; mods[i]->mod_values[j] != NULL; j++);
|
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,
|
if (*pValues == NULL) {
|
||||||
(j + 2) * sizeof(char *));
|
|
||||||
if (mods[i]->mod_values == NULL) {
|
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
mods[i]->mod_values[j] = strdup(value);
|
(*pValues)[cValues] = ber_strdup(value);
|
||||||
if (mods[i]->mod_values[j] == NULL) {
|
if ((*pValues)[cValues] == NULL) {
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
mods[i]->mod_values[j + 1] = NULL;
|
(*pValues)[cValues + 1] = NULL;
|
||||||
}
|
}
|
||||||
*modlist = mods;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user