Don't leak new listeners
authorAlan T. DeKok <aland@freeradius.org>
Thu, 11 Dec 2008 18:23:13 +0000 (19:23 +0100)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 11 Dec 2008 18:23:13 +0000 (19:23 +0100)
src/main/command.c

index 13b8c9e..a622f6c 100644 (file)
@@ -237,6 +237,19 @@ static int fr_server_domain_socket(const char *path)
        return sockfd;
 }
 
+static void command_close_socket(rad_listen_t *this)
+{
+       this->status = RAD_LISTEN_STATUS_CLOSED;
+
+       /*
+        *      This removes the socket from the event fd, so no one
+        *      will be calling us any more.
+        */
+       event_new_fd(this);
+
+       listen_free(&this);
+}
+
 
 static ssize_t cprintf(rad_listen_t *listener, const char *fmt, ...)
 {
@@ -251,10 +264,7 @@ static ssize_t cprintf(rad_listen_t *listener, const char *fmt, ...)
        if (listener->status == RAD_LISTEN_STATUS_CLOSED) return 0;
 
        len = write(listener->fd, buffer, len);
-       if (len < 0) {
-               listener->status = RAD_LISTEN_STATUS_CLOSED;
-               event_new_fd(listener);
-       }
+       if (len <= 0) command_close_socket(listener);
 
        /*
         *      FIXME: Keep writing until done?
@@ -1542,8 +1552,7 @@ static int command_domain_recv(rad_listen_t *listener,
                 */
                if ((co->offset == 0) && (co->buffer[0] == 0x04)) {
                close_socket:
-                       listener->status = RAD_LISTEN_STATUS_CLOSED;
-                       event_new_fd(listener);
+                       command_close_socket(listener);
                        return 0;
                }