Print more on "failed to remember handler"
authoraland <aland>
Thu, 7 Feb 2008 08:51:06 +0000 (08:51 +0000)
committeraland <aland>
Thu, 7 Feb 2008 08:51:06 +0000 (08:51 +0000)
Try harder to keep a unique state.

Check return code of eaplist_add

src/modules/rlm_eap/mem.c
src/modules/rlm_eap/rlm_eap.c

index fe3d776..e62f932 100644 (file)
@@ -269,12 +269,15 @@ int eaplist_add(rlm_eap_t *inst, EAP_HANDLER *handler)
 
                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;
 
@@ -317,8 +320,10 @@ int eaplist_add(rlm_eap_t *inst, EAP_HANDLER *handler)
        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;
        }
 
index 9f4627d..dd1612b 100644 (file)
@@ -79,10 +79,8 @@ static int eap_handler_cmp(const void *a, const void *b)
        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;
@@ -355,9 +353,8 @@ static int eap_authenticate(void *instance, REQUEST *request)
         *      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,
@@ -368,12 +365,16 @@ static int eap_authenticate(void *instance, REQUEST *request)
                 *      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");