Don't free struct clsrvconf members rewritein and rewriteout.
[radsecproxy.git] / radsecproxy.c
index 56abe3e..d531395 100644 (file)
@@ -52,6 +52,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <limits.h>
+#if defined(HAVE_MALLOPT)
+#include <malloc.h>
+#endif
 #ifdef SYS_SOLARIS9
 #include <fcntl.h>
 #endif
@@ -1387,6 +1390,22 @@ struct request *newrequest() {
     return rq;
 }
 
+static void
+purgedupcache(struct client *client) {
+    struct request *r;
+    struct timeval now;
+    int i;
+
+    gettimeofday(&now, NULL);
+    for (i = 0; i < MAX_REQUESTS; i++) {
+       r = client->rqs[i];
+       if (r && now.tv_sec - r->created.tv_sec > r->from->conf->dupinterval) {
+           freerq(r);
+           client->rqs[i] = NULL;
+       }
+    }
+}
+
 int addclientrq(struct request *rq) {
     struct request *r;
     struct timeval now;
@@ -1450,6 +1469,7 @@ int radsrv(struct request *rq) {
        goto exit;
     }
 
+    purgedupcache(from);
     if (!addclientrq(rq))
        goto exit;
 
@@ -2626,8 +2646,8 @@ void freeclsrvconf(struct clsrvconf *conf) {
        free(conf->rewriteusername);
     }
     free(conf->dynamiclookupcommand);
-    free(conf->rewritein);
-    free(conf->rewriteout);
+    conf->rewritein=NULL;
+    conf->rewriteout=NULL;
     if (conf->hostports)
        freehostports(conf->hostports);
     if (conf->lock) {
@@ -3348,6 +3368,10 @@ int radsecproxy_main(int argc, char **argv) {
        debugx(1, DBG_ERR, "pthread_attr_init failed");
     if (pthread_attr_setstacksize(&pthread_attr, PTHREAD_STACK_SIZE))
        debugx(1, DBG_ERR, "pthread_attr_setstacksize failed");
+#if defined(HAVE_MALLOPT)
+    if (mallopt(M_TRIM_THRESHOLD, 4 * 1024) != 1)
+       debugx(1, DBG_ERR, "mallopt failed");
+#endif
 
     for (i = 0; i < RAD_PROTOCOUNT; i++)
        protodefs[i] = protoinits[i](i);