Updated to hostap_2_6
[mech_eap.git] / libeap / src / eap_server / eap_server_methods.c
index 9e9dc93..79ed344 100644 (file)
@@ -87,7 +87,7 @@ struct eap_method * eap_server_method_alloc(int version, int vendor,
  * eap_server_method_free - Free EAP server method structure
  * @method: Method structure allocated with eap_server_method_alloc()
  */
-void eap_server_method_free(struct eap_method *method)
+static void eap_server_method_free(struct eap_method *method)
 {
        os_free(method);
 }
@@ -95,26 +95,31 @@ void eap_server_method_free(struct eap_method *method)
 
 /**
  * eap_server_method_register - Register an EAP server method
- * @method: EAP method to register
+ * @method: EAP method to register from eap_server_method_alloc()
  * Returns: 0 on success, -1 on invalid method, or -2 if a matching EAP method
  * has already been registered
  *
  * Each EAP server method needs to call this function to register itself as a
- * supported EAP method.
+ * supported EAP method. The caller must not free the allocated method data
+ * regardless of the return value.
  */
 int eap_server_method_register(struct eap_method *method)
 {
        struct eap_method *m, *last = NULL;
 
        if (method == NULL || method->name == NULL ||
-           method->version != EAP_SERVER_METHOD_INTERFACE_VERSION)
+           method->version != EAP_SERVER_METHOD_INTERFACE_VERSION) {
+               eap_server_method_free(method);
                return -1;
+       }
 
        for (m = eap_methods; m; m = m->next) {
                if ((m->vendor == method->vendor &&
                     m->method == method->method) ||
-                   os_strcmp(m->name, method->name) == 0)
+                   os_strcmp(m->name, method->name) == 0) {
+                       eap_server_method_free(method);
                        return -2;
+               }
                last = m;
        }