static kadm5_ret_t perform_tl_data(krb5_context context, HDB *db, hdb_entry_ex *ent, const krb5_tl_data *tl_data) { kadm5_ret_t ret = 0; if (tl_data->tl_data_type == KRB5_TL_PASSWORD) { heim_utf8_string pw = tl_data->tl_data_contents; if (pw[tl_data->tl_data_length] != '\0') return KADM5_BAD_TL_TYPE; ret = hdb_entry_set_password(context, db, &ent->entry, pw); } else if (tl_data->tl_data_type == KRB5_TL_LAST_PWD_CHANGE) { unsigned char *s; time_t t; if (tl_data->tl_data_length != 4) return KADM5_BAD_TL_TYPE; s = tl_data->tl_data_contents; t = s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24); ret = hdb_entry_set_pw_change_time(context, &ent->entry, t); } else if (tl_data->tl_data_type == KRB5_TL_EXTENSION) { HDB_extension ext; ret = decode_HDB_extension(tl_data->tl_data_contents, tl_data->tl_data_length, &ext, NULL); if (ret) return KADM5_BAD_TL_TYPE; ret = hdb_replace_extension(context, &ent->entry, &ext); free_HDB_extension(&ext); } else { return KADM5_BAD_TL_TYPE; } return ret; }
static int parse_extensions(char *str, HDB_extensions **e) { char *p; int ret; if(strcmp(str, "-") == 0 || *str == '\0') { *e = NULL; return 0; } *e = calloc(1, sizeof(**e)); p = strsep(&str, ":"); while (p) { HDB_extension ext; ssize_t len; void *d; len = strlen(p); d = malloc(len); len = hex_decode(p, d, len); if (len < 0) { free(d); return -1; } ret = decode_HDB_extension(d, len, &ext, NULL); free(d); if (ret) return -1; d = realloc((*e)->val, ((*e)->len + 1) * sizeof((*e)->val[0])); if (d == NULL) abort(); (*e)->val = d; (*e)->val[(*e)->len] = ext; (*e)->len++; p = strsep(&str, ":"); } return 0; }