*/
if (!out) {
if (!rule->func) {
+ no_out:
cf_log_err(cs, "Rule doesn't specify output destination");
return -1;
}
for (i = 0; i < count; i++, cp = cf_pair_find_next(cs, cp, rule->name)) {
int ret;
- cf_parse_t func = cf_pair_parse_value;
+ cf_parse_t func;
void *entry;
+ TALLOC_CTX *value_ctx = array ? array : ctx;
+ /*
+ * Figure out where to write the output
+ */
+ if (!array) {
+ entry = NULL;
+ } else if (FR_BASE_TYPE(type) == FR_TYPE_VOID) {
+ entry = &array[i];
+ } else {
+ entry = ((uint8_t *) array) + i * fr_value_box_field_sizes[FR_BASE_TYPE(type)];
+ }
+
+ /*
+ * Switch between customer parsing function
+ * and the standard value parsing function.
+ */
if (rule->func) {
cf_log_debug(cs, "%.*s%s = %s", PAIR_SPACE(cs), parse_spaces,
cf_pair_attr(cp), cp->value);
func = rule->func;
- }
-
- if (FR_BASE_TYPE(type) == FR_TYPE_VOID) {
- entry = &array[i];
} else {
- entry = ((uint8_t *) array) + i * fr_value_box_field_sizes[FR_BASE_TYPE(type)];
+ if (!entry) goto no_out;
+ func = cf_pair_parse_value;
}
- ret = func(array ? array : ctx, entry, cf_pair_to_item(cp), rule);
+ ret = func(value_ctx, entry, cf_pair_to_item(cp), rule);
if (ret < 0) {
talloc_free(array);
talloc_free(dflt_cp);
tDataBuffer *pStepBuff = NULL;
tDataNode *pAuthType = NULL;
uint32_t uiCurr = 0;
- uint32_t uiLen = 0;
+ uint32_t user_id_len = 0;
char *username_string = NULL;
- char *shortUserName = NULL;
+ char *short_user_name = NULL;
VALUE_PAIR *response = fr_pair_find_by_num(request->packet->vps, VENDORPEC_MICROSOFT,
FR_MSCHAP2_RESPONSE, TAG_ANY);
#ifndef NDEBUG
return RLM_MODULE_FAIL;
}
- rcode = getUserNodeRef(request, username_string, &shortUserName, &userNodeRef, dsRef);
+ rcode = getUserNodeRef(request, username_string, &short_user_name, &userNodeRef, dsRef);
if (rcode != RLM_MODULE_OK) {
if (rcode != RLM_MODULE_NOOP) {
RDEBUG2("od_mschap_auth: getUserNodeRef() failed");
pAuthType = dsDataNodeAllocateString(dsRef, kDSStdAuthMSCHAP2);
uiCurr = 0;
- RDEBUG2("OD username_string = %s, OD shortUserName=%s (length = %lu)\n", username_string, shortUserName, strlen(shortUserName));
+ user_id_len = (uint32_t)short_user_name ? strlen(short_user_name) : 0;
+
+ RDEBUG2("OD username_string = %s, OD short_user_name=%s (length = %u)",
+ username_string, short_user_name, user_id_len);
/* User name length + username */
- uiLen = (uint32_t)strlen(shortUserName);
- memcpy(&(tDataBuff->fBufferData[uiCurr]), &uiLen, sizeof(uiLen));
- uiCurr += sizeof(uiLen);
- memcpy(&(tDataBuff->fBufferData[uiCurr]), shortUserName, uiLen);
- uiCurr += uiLen;
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), &user_id_len, sizeof(user_id_len));
+ uiCurr += sizeof(user_id_len);
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), short_user_name, user_id_len);
+ uiCurr += user_id_len;
#ifndef NDEBUG
RINDENT();
RDEBUG2("Stepbuf server challenge : ");
#endif
/* server challenge (ie. my (freeRADIUS) challenge) */
- uiLen = 16;
- memcpy(&(tDataBuff->fBufferData[uiCurr]), &uiLen, sizeof(uiLen));
- uiCurr += sizeof(uiLen);
+ user_id_len = 16;
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), &user_id_len, sizeof(user_id_len));
+ uiCurr += sizeof(user_id_len);
memcpy(&(tDataBuff->fBufferData[uiCurr]), &(challenge->vp_strvalue[0]),
- uiLen);
- uiCurr += uiLen;
+ user_id_len);
+ uiCurr += user_id_len;
#ifndef NDEBUG
RDEBUG2("Stepbuf peer challenge : ");
#endif
/* peer challenge (ie. the client-generated response) */
- uiLen = 16;
- memcpy(&(tDataBuff->fBufferData[uiCurr]), &uiLen, sizeof(uiLen));
- uiCurr += sizeof(uiLen);
+ user_id_len = 16;
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), &user_id_len, sizeof(user_id_len));
+ uiCurr += sizeof(user_id_len);
memcpy(&(tDataBuff->fBufferData[uiCurr]), &(response->vp_strvalue[2]),
- uiLen);
- uiCurr += uiLen;
+ user_id_len);
+ uiCurr += user_id_len;
#ifndef NDEBUG
RDEBUG2("Stepbuf p24 : ");
#endif
/* p24 (ie. second part of client-generated response) */
- uiLen = 24; /* strlen(&(response->vp_strvalue[26])); may contain NULL byte in the middle. */
- memcpy(&(tDataBuff->fBufferData[uiCurr]), &uiLen, sizeof(uiLen));
- uiCurr += sizeof(uiLen);
+ user_id_len = 24; /* strlen(&(response->vp_strvalue[26])); may contain NULL byte in the middle. */
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), &user_id_len, sizeof(user_id_len));
+ uiCurr += sizeof(user_id_len);
memcpy(&(tDataBuff->fBufferData[uiCurr]), &(response->vp_strvalue[26]),
- uiLen);
- uiCurr += uiLen;
+ user_id_len);
+ uiCurr += user_id_len;
/* Client generated use name (short name?) */
- uiLen = (uint32_t)strlen(username_string);
- memcpy(&(tDataBuff->fBufferData[uiCurr]), &uiLen, sizeof(uiLen));
- uiCurr += sizeof(uiLen);
- memcpy(&(tDataBuff->fBufferData[uiCurr]), username_string, uiLen);
- uiCurr += uiLen;
+ user_id_len = (uint32_t)strlen(username_string);
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), &user_id_len, sizeof(user_id_len));
+ uiCurr += sizeof(user_id_len);
+ memcpy(&(tDataBuff->fBufferData[uiCurr]), username_string, user_id_len);
+ uiCurr += user_id_len;
tDataBuff->fBufferLength = uiCurr;
/* clean up */
if (username_string != NULL)
talloc_free(username_string);
- if (shortUserName != NULL)
- talloc_free(shortUserName);
+ if (short_user_name != NULL)
+ talloc_free(short_user_name);
if (tDataBuff != NULL)
dsDataBufferDeAllocate(dsRef, tDataBuff);