newvector should be a bool
[freeradius.git] / src / main / detail.c
index 8613055..437253c 100644 (file)
@@ -492,7 +492,7 @@ static RADIUS_PACKET *detail_poll(rad_listen_t *listener)
                         *      retry it.
                         */
                case STATE_RUNNING:
-                       if (time(NULL) < (data->running + data->retry_interval)) {
+                       if (time(NULL) < (data->running + (int)data->retry_interval)) {
                                return NULL;
                        }
 
@@ -591,7 +591,7 @@ static RADIUS_PACKET *detail_poll(rad_listen_t *listener)
                 */
                if (!strcasecmp(key, "Client-IP-Address")) {
                        data->client_ip.af = AF_INET;
-                       if (ip_hton(value, AF_INET, &data->client_ip) < 0) {
+                       if (ip_hton(&data->client_ip, AF_INET, value, false) < 0) {
                                ERROR("Failed parsing Client-IP-Address");
 
                                pairfree(&data->vps);
@@ -672,7 +672,7 @@ static RADIUS_PACKET *detail_poll(rad_listen_t *listener)
         *      Allocate the packet.  If we fail, it's a serious
         *      problem.
         */
-       packet = rad_alloc(NULL, 1);
+       packet = rad_alloc(NULL, true);
        if (!packet) {
                ERROR("FATAL: Failed allocating memory for detail");
                fr_exit(1);
@@ -797,6 +797,7 @@ void detail_free(rad_listen_t *this)
 
 #ifdef WITH_DETAIL_THREAD
        if (!check_config) {
+               ssize_t ret;
                void *arg = NULL;
 
                /*
@@ -814,14 +815,18 @@ void detail_free(rad_listen_t *this)
                /*
                 *      Wait for it to acknowledge that it's stopped.
                 */
-               if (read(data->master_pipe[0], &arg, sizeof(arg)) < 0) {
+               ret = read(data->master_pipe[0], &arg, sizeof(arg));
+               if (ret < 0) {
                        ERROR("Reader thread exited without informing the master: %s", fr_syserror(errno));
+               } else if (ret != sizeof(arg)) {
+                       ERROR("Invalid thread pointer received from reader thread during exit");
+                       ERROR("Expected %zu bytes, got %zi bytes", sizeof(arg), ret);
                }
 
                close(data->master_pipe[0]);
                close(data->master_pipe[1]);
 
-               pthread_join(data->pthread_id, &arg);
+               if (arg) pthread_join(data->pthread_id, &arg);
        }
 #endif
 
@@ -912,7 +917,6 @@ int detail_decode(UNUSED rad_listen_t *this, UNUSED REQUEST *request)
 static void *detail_handler_thread(void *arg)
 {
        char c;
-       ssize_t rcode;
        rad_listen_t *this = arg;
        listen_detail_t *data = this->data;
 
@@ -960,20 +964,13 @@ static void *detail_handler_thread(void *arg)
 
 
 static const CONF_PARSER detail_config[] = {
-       { "detail",   PW_TYPE_FILE_OUTPUT | PW_TYPE_DEPRECATED,
-         offsetof(listen_detail_t, filename), NULL,  NULL },
-       { "filename",   PW_TYPE_FILE_OUTPUT | PW_TYPE_REQUIRED,
-         offsetof(listen_detail_t, filename), NULL,  NULL },
-       { "load_factor",   PW_TYPE_INTEGER,
-         offsetof(listen_detail_t, load_factor), NULL, STRINGIFY(10)},
-       { "poll_interval",   PW_TYPE_INTEGER,
-         offsetof(listen_detail_t, poll_interval), NULL, STRINGIFY(1)},
-       { "retry_interval",   PW_TYPE_INTEGER,
-         offsetof(listen_detail_t, retry_interval), NULL, STRINGIFY(30)},
-       { "one_shot",   PW_TYPE_BOOLEAN,
-         offsetof(listen_detail_t, one_shot), NULL, NULL},
-       { "max_outstanding",   PW_TYPE_INTEGER,
-         offsetof(listen_detail_t, load_factor), NULL, NULL},
+       { "detail", FR_CONF_OFFSET(PW_TYPE_FILE_OUTPUT | PW_TYPE_DEPRECATED, listen_detail_t, filename), NULL },
+       { "filename", FR_CONF_OFFSET(PW_TYPE_FILE_OUTPUT | PW_TYPE_REQUIRED, listen_detail_t, filename), NULL },
+       { "load_factor", FR_CONF_OFFSET(PW_TYPE_INTEGER, listen_detail_t, load_factor), STRINGIFY(10) },
+       { "poll_interval", FR_CONF_OFFSET(PW_TYPE_INTEGER, listen_detail_t, poll_interval), STRINGIFY(1) },
+       { "retry_interval", FR_CONF_OFFSET(PW_TYPE_INTEGER, listen_detail_t, retry_interval), STRINGIFY(30) },
+       { "one_shot", FR_CONF_OFFSET(PW_TYPE_BOOLEAN, listen_detail_t, one_shot), NULL },
+       { "max_outstanding", FR_CONF_OFFSET(PW_TYPE_INTEGER, listen_detail_t, load_factor), NULL },
 
        { NULL, -1, 0, NULL, NULL }             /* end the list */
 };
@@ -1063,7 +1060,7 @@ int detail_parse(CONF_SECTION *cs, rad_listen_t *this)
        memset(client, 0, sizeof(*client));
        client->ipaddr.af = AF_INET;
        client->ipaddr.ipaddr.ip4addr.s_addr = INADDR_NONE;
-       client->prefix = 0;
+       client->ipaddr.prefix = 0;
        client->longname = client->shortname = data->filename;
        client->secret = client->shortname;
        client->nas_type = talloc_strdup(data, "none"); /* Part of 'data' not dynamically allocated */