Commit Diff


commit - d7b5dd1bbf44ff9c8537def6d2083891b4f7d102
commit + eb4f9eac0c35071838c9367f1204db0d0b98ad2e
blob - b60057070f5077bf71c2898368c98b21b795788f
blob + 6a7f63393c6f7177f054b991e72a15009cf6fa1c
--- src/ngircd/conf.c
+++ src/ngircd/conf.c
@@ -490,7 +490,7 @@ Conf_UnsetServer( CONN_ID Idx )
 /**
  * Set connection information for specified configured server.
  */
-GLOBAL void
+GLOBAL bool
 Conf_SetServer( int ConfServer, CONN_ID Idx )
 {
 	assert( ConfServer > NONE );
@@ -498,13 +498,15 @@ Conf_SetServer( int ConfServer, CONN_ID Idx )
 
 	if (Conf_Server[ConfServer].conn_id > NONE &&
 	    Conf_Server[ConfServer].conn_id != Idx) {
-		Log(LOG_ALERT,
-			"Trying to update connection index for already registered server \"%s\": %d/%d - ignored.",
-			Conf_Server[ConfServer].name,
-			Conf_Server[ConfServer].conn_id, Idx);
-		return;
+		Log(LOG_ERR,
+		    "Connection %d: Server configuration of \"%s\" already in use by connection %d!",
+		    Idx, Conf_Server[ConfServer].name,
+		    Conf_Server[ConfServer].conn_id);
+		Conn_Close(Idx, NULL, "Server configuration already in use", true);
+		return false;
 	}
 	Conf_Server[ConfServer].conn_id = Idx;
+	return true;
 }
 
 /**
blob - 541fdb294c4aac81114f7b8c458dc4e6f81021f2
blob + 7860f019a8928d2959ed0e31e82fc3e18c34149d
--- src/ngircd/conf.h
+++ src/ngircd/conf.h
@@ -242,7 +242,7 @@ GLOBAL bool Conf_Rehash PARAMS((void));
 GLOBAL int Conf_Test PARAMS((void));
 
 GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
-GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
+GLOBAL bool Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
 GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
 
 GLOBAL bool Conf_EnableServer PARAMS(( const char *Name, UINT16 Port ));
blob - 5d086857dcd2f634ab4ec5b506d57ddf3f9d3ce2
blob + 80b085a83e2f3e4b6108ed36c30c8358ff5ac441
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
@@ -2079,7 +2079,8 @@ New_Server( int Server , ng_ipaddr_t *dest)
 	Client_SetToken( c, TOKEN_OUTBOUND );
 
 	/* Register connection */
-	Conf_SetServer(Server, new_sock);
+	if (!Conf_SetServer(Server, new_sock))
+		return;
 	My_Connections[new_sock].sock = new_sock;
 	My_Connections[new_sock].addr = *dest;
 	My_Connections[new_sock].client = c;
blob - 79facf5e0ead3a639c475956cc1a34a46aa1d4fc
blob + 02e3ae824e2d9c644e7f009d49db33ac8314a8a0
--- src/ngircd/irc-server.c
+++ src/ngircd/irc-server.c
@@ -104,6 +104,10 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 		if (!Client_CheckID(Client, Req->argv[0]))
 			return DISCONNECTED;
 
+		/* Mark this connection as belonging to an configured server */
+		if (!Conf_SetServer(i, Client_Conn(Client)))
+			return DISCONNECTED;
+
 		Client_SetID( Client, Req->argv[0] );
 		Client_SetHops( Client, 1 );
 		Client_SetInfo( Client, Req->argv[Req->argc - 1] );
@@ -131,9 +135,6 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
 			Client_SetToken(Client, atoi(Req->argv[1]));
 		}
 
-		/* Mark this connection as belonging to an configured server */
-		Conf_SetServer(i, Client_Conn(Client));
-
 		/* Check protocol level */
 		if (Client_Type(Client) == CLIENT_GOTPASS) {
 			/* We got a "simple" PASS command, so the peer is