]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Only close "unrelated" sockets in forked child processes
authorAlexander Barton <alex@barton.de>
Wed, 7 Sep 2011 12:51:16 +0000 (14:51 +0200)
committerAlexander Barton <alex@barton.de>
Wed, 7 Sep 2011 12:51:16 +0000 (14:51 +0200)
This fixes the problem that ngIRCd can't do any IDENT lookups because
of the socket has already been closed in the child process.

The bug has been introduced starting with ngIRCd 17 ... :-(
(commit ID 6ebb31ab35e)

src/ngircd/conn.c
src/ngircd/conn.h
src/ngircd/irc-login.c
src/ngircd/proc.c
src/ngircd/resolve.c

index 407da1a3b0837ac2bd99c16054175a4b4070e006..aa754eb482ae5c38f224adee20c9ac129751f19e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -435,12 +435,13 @@ Conn_Exit( void )
  * they don't hold connections open that the main process wants to close.
  */
 GLOBAL void
-Conn_CloseAllSockets(void)
+Conn_CloseAllSockets(int ExceptOf)
 {
        CONN_ID idx;
 
        for(idx = 0; idx < Pool_Size; idx++) {
-               if(My_Connections[idx].sock > NONE)
+               if(My_Connections[idx].sock > NONE &&
+                  My_Connections[idx].sock != ExceptOf)
                        close(My_Connections[idx].sock);
        }
 }
index c813729f9331e1c3897ed32f44505f851f782604..251da2a07ddff28452d68559a35f039b6e14c676 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -106,7 +106,7 @@ GLOBAL long WCounter;
 GLOBAL void Conn_Init PARAMS((void ));
 GLOBAL void Conn_Exit PARAMS(( void ));
 
-GLOBAL void Conn_CloseAllSockets PARAMS((void));
+GLOBAL void Conn_CloseAllSockets PARAMS((int ExceptOf));
 
 GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
 GLOBAL void Conn_ExitListeners PARAMS(( void ));
index 0577cd9c0a94877532d7d594a2bb780e62c96598..884a06becee921df8f4ab42248e619853492cf85 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -959,6 +959,7 @@ Hello_User(CLIENT * Client)
        } else {
                /* Sub process */
                Log_Init_Subprocess("Auth");
+               Conn_CloseAllSockets(NONE);
                result = PAM_Authenticate(Client);
                if (write(pipefd[1], &result, sizeof(result)) != sizeof(result))
                        Log_Subprocess(LOG_ERR,
index fd2df1d947c51a773a9447a04e159e4a15afd8a4..7addb47ef30c804e889b6a49d390e2505ae8e1b2 100644 (file)
@@ -79,7 +79,6 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                signal(SIGALRM, Proc_GenericSignalHandler);
                close(pipefds[0]);
                alarm(timeout);
-               Conn_CloseAllSockets();
                return 0;
        }
 
index 9b17af9cb202209b4b5e79c53c50d316a2df3105..c7e600381e81b571ded2cd343887529418e7d59c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2009 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -75,7 +75,8 @@ Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
        } else if( pid == 0 ) {
                /* Sub process */
                Log_Init_Subprocess("Resolver");
-               Do_ResolveAddr( Addr, identsock, pipefd[1]);
+               Conn_CloseAllSockets(identsock);
+               Do_ResolveAddr(Addr, identsock, pipefd[1]);
                Log_Exit_Subprocess("Resolver");
                exit(0);
        }
@@ -104,6 +105,7 @@ Resolve_Name( PROC_STAT *s, const char *Host, void (*cbfunc)(int, short))
        } else if( pid == 0 ) {
                /* Sub process */
                Log_Init_Subprocess("Resolver");
+               Conn_CloseAllSockets(NONE);
                Do_ResolveName(Host, pipefd[1]);
                Log_Exit_Subprocess("Resolver");
                exit(0);