for (i = 0; i < 4; i++) {
uint32_t lvalue;
-
+
lvalue = eap_rand(&inst->rand_pool);
+ if (i == 0) lvalue ^= fr_rand(); /* !thread-safe */
+
memcpy(handler->state + i * 4, &lvalue,
sizeof(lvalue));
- }
+ }
}
+
memcpy(state->vp_octets, handler->state, sizeof(handler->state));
state->length = EAP_STATE_LEN;
pthread_mutex_unlock(&(inst->session_mutex));
if (!status) {
- radlog(L_ERR, "rlm_eap: Failed to remember handler!");
- eap_handler_free(handler);
+ char buffer[1024];
+
+ vp_prints_value(buffer, sizeof(buffer), state, 0);
+ radlog(L_ERR, "rlm_eap: Failed to remember handler with State %s!", buffer);
return 0;
}
const EAP_HANDLER *one = a;
const EAP_HANDLER *two = b;
-#if 0
if (one->eap_id < two->eap_id) return -1;
if (one->eap_id > two->eap_id) return +1;
-#endif
rcode = fr_ipaddr_cmp(&one->src_ipaddr, &two->src_ipaddr);
if (rcode != 0) return rcode;
* Add to the list only if it is EAP-Request, OR if
* it's LEAP, and a response.
*/
- if ((handler->eap_ds->request->code == PW_EAP_REQUEST) &&
- (handler->eap_ds->request->type.type >= PW_EAP_MD5)) {
- eaplist_add(inst, handler);
+ if (((handler->eap_ds->request->code == PW_EAP_REQUEST) &&
+ (handler->eap_ds->request->type.type >= PW_EAP_MD5)) ||
/*
* LEAP is a little different. At Stage 4,
* At stage 6, LEAP sends an EAP-Response, which
* isn't put into the list.
*/
- } else if ((handler->eap_ds->response->code == PW_EAP_RESPONSE) &&
- (handler->eap_ds->response->type.type == PW_EAP_LEAP) &&
- (handler->eap_ds->request->code == PW_EAP_SUCCESS) &&
- (handler->eap_ds->request->type.type == 0)) {
+ ((handler->eap_ds->response->code == PW_EAP_RESPONSE) &&
+ (handler->eap_ds->response->type.type == PW_EAP_LEAP) &&
+ (handler->eap_ds->request->code == PW_EAP_SUCCESS) &&
+ (handler->eap_ds->request->type.type == 0))) {
- eaplist_add(inst, handler);
+ if (!eaplist_add(inst, handler)) {
+ eap_fail(handler);
+ eap_handler_free(handler);
+ return RLM_MODULE_FAIL;
+ }
} else {
DEBUG2(" rlm_eap: Freeing handler");