radius_pairmake(), to mirror radius_paircreate().
authoraland <aland>
Mon, 22 Oct 2007 08:40:47 +0000 (08:40 +0000)
committeraland <aland>
Mon, 22 Oct 2007 08:40:47 +0000 (08:40 +0000)
This is in preparation for eventually using memory pools for
VALUE_PAIR's, which should save at least 10% of CPU time, from
valgrind stats.

src/include/radiusd.h
src/main/auth.c
src/main/event.c
src/main/valuepair.c

index 6d5eb4d..4c00583 100644 (file)
@@ -428,6 +428,9 @@ int radius_callback_compare(REQUEST *req, VALUE_PAIR *request,
                            VALUE_PAIR **reply_pairs);
 VALUE_PAIR     *radius_paircreate(REQUEST *request, VALUE_PAIR **vps,
                                  int attribute, int type);
+VALUE_PAIR *radius_pairmake(REQUEST *request, VALUE_PAIR **vps,
+                           const char *attribute, const char *value,
+                           int operator);
 
 /* xlat.c */
 typedef int (*RADIUS_ESCAPE_STRING)(char *out, int outlen, const char *in);
@@ -480,8 +483,4 @@ int radius_evaluate_condition(REQUEST *request, int modreturn, int depth,
                              const char **ptr, int evaluate_it, int *presult);
 int radius_update_attrlist(REQUEST *request, CONF_SECTION *cs,
                           VALUE_PAIR *input_vps, const char *name);
-
-/* vmps.c */
-int vmps_process(REQUEST *);
-
 #endif /*RADIUSD_H*/
index 571b692..3eb6d50 100644 (file)
@@ -464,13 +464,10 @@ int rad_authenticate(REQUEST *request)
                 *      accordingly.
                 */
                case PW_AUTHENTICATION_ACK:
-                       tmp = paircreate(PW_AUTH_TYPE, PW_TYPE_INTEGER);
-                       if (tmp == NULL) {
-                               radlog(L_ERR|L_CONS, "Not enough memory");
-                               exit(1);
-                       }
-                       tmp->vp_integer = PW_AUTHTYPE_ACCEPT;
-                       pairadd(&request->config_items, tmp);
+                       tmp = radius_paircreate(request,
+                                               &request->config_items,
+                                               PW_AUTH_TYPE, PW_TYPE_INTEGER);
+                       if (tmp) tmp->vp_integer = PW_AUTHTYPE_ACCEPT;
                        break;
                /*
                 *      Challenges are punted back to the NAS without any
@@ -699,8 +696,9 @@ autz_redo:
                                 *      Remove ALL reply attributes.
                                 */
                                pairfree(&request->reply->vps);
-                               tmp = pairmake("Reply-Message", user_msg, T_OP_SET);
-                               request->reply->vps = tmp;
+                               radius_pairmake(request, &request->reply->vps,
+                                               "Reply-Message",
+                                               user_msg, T_OP_SET);
 
                                snprintf(logstr, sizeof(logstr), "Multiple logins (max %d) %s",
                                        check_item->vp_integer,
index e11242e..91ffa0e 100644 (file)
@@ -112,25 +112,6 @@ static void tv_add(struct timeval *tv, int usec_delay)
        }
 }
 
-static VALUE_PAIR * radius_pairmake(REQUEST *request, VALUE_PAIR **vps,
-                                  const char *attribute, const char *value)
-{
-       VALUE_PAIR *vp;
-
-       request = request;      /* -Wunused */
-
-       vp = pairmake(attribute, value, T_OP_SET);
-       if (!vp) {
-               radlog(L_ERR, "No memory!");
-               rad_assert("No memory" == NULL);
-               _exit(1);
-       }
-
-       pairadd(vps, vp);
-
-       return vp;
-}
-
 #ifdef WITH_SNMP
 static void snmp_inc_counters(REQUEST *request)
 {
@@ -1224,11 +1205,9 @@ static int successfully_proxied_request(REQUEST *request)
                 */
                vp = pairfind(request->proxy->vps, PW_USER_NAME);
                if (!vp) {
-                       vp = paircreate(PW_USER_NAME, PW_TYPE_STRING);
-                       if (!vp) {
-                               radlog(L_ERR|L_CONS, "no memory");
-                               exit(1);
-                       }
+                       vp = radius_paircreate(request, NULL,
+                                              PW_USER_NAME, PW_TYPE_STRING);
+                       rad_assert(vp != NULL); /* handled by above function */
                        /* Insert at the START of the list */
                        vp->next = request->proxy->vps;
                        request->proxy->vps = vp;
@@ -1436,12 +1415,11 @@ static void request_post_handler(REQUEST *request)
                 *      Post-Auth-Type = Reject
                 */
                if (request->reply->code == PW_AUTHENTICATION_REJECT) {
-                       vp = pairmake("Post-Auth-Type", "Reject", T_OP_SET);
-                       if (vp) {
-                               pairdelete(&request->config_items, PW_POST_AUTH_TYPE);
-                               pairadd(&request->config_items, vp);
-                               rad_postauth(request);
-                       } /* else no Reject section defined */
+                       pairdelete(&request->config_items, PW_POST_AUTH_TYPE);
+                       vp = radius_pairmake(request, &request->config_items,
+                                            "Post-Auth-Type", "Reject",
+                                            T_OP_SET);
+                       if (vp) rad_postauth(request);
 
                        /*
                         *      If configured, delay Access-Reject packets.
@@ -1806,8 +1784,6 @@ int received_request(rad_listen_t *listener,
                        request = NULL;
                        break;
                }
-
-
        }
 
        /*
index 6d4d398..2f105d6 100644 (file)
@@ -673,7 +673,30 @@ VALUE_PAIR *radius_paircreate(REQUEST *request, VALUE_PAIR **vps,
                _exit(1);
        }
 
-       pairadd(vps, vp);
+       if (vps) pairadd(vps, vp);
 
        return vp;
 }
+
+/*
+ *     Create a pair, and add it to a particular list of VPs
+ *
+ *     Note that this function ALWAYS returns.  If we're OOM, then
+ *     it causes the server to exit!
+ */
+VALUE_PAIR *radius_pairmake(REQUEST *request, VALUE_PAIR **vps,
+                           const char *attribute, const char *value,
+                           int operator)
+{
+       VALUE_PAIR *vp;
+
+       request = request;      /* -Wunused */
+
+       vp = pairmake(attribute, value, operator);
+       if (!vp) return NULL;
+
+       if (vps) pairadd(vps, vp);
+
+       return vp;
+}
+