]> arthur.barton.de Git - ngircd.git/commitdiff
Cut off oversized IRC messages that should be sent to the network instead
authorAlexander Barton <alex@barton.de>
Sat, 2 Jul 2005 14:45:07 +0000 (14:45 +0000)
committerAlexander Barton <alex@barton.de>
Sat, 2 Jul 2005 14:45:07 +0000 (14:45 +0000)
of shuttding down the (wrong) connection. [from HEAD]

ChangeLog
src/ngircd/conn.c

index f1506666c2acfb4ad9e888fdca1e36579cc46686..e726a1233655868a94cccba1c1c79856e4d0bfdf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,8 @@
 
 ngIRCd 0.9.x
 
+  - Cut off oversized IRC messages that should be sent to the network instead
+    of shuttding down the (wrong) connection.
   - Don't generate error messages for unknown commands received before the
     client is registered with the server (like the original ircd).
   - Never run with root privileges but always switch the user ID.
@@ -608,4 +610,4 @@ ngIRCd 0.0.1, 31.12.2001
 
 
 -- 
-$Id: ChangeLog,v 1.276.2.1 2005/06/27 16:12:51 alex Exp $
+$Id: ChangeLog,v 1.276.2.2 2005/07/02 14:45:07 alex Exp $
index 627c6402b0520e0e148b014825f8de0ffc720a03..f3059186d73f1c1cbecffc4ed9a8f63dfd574966 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
+ * Copyright (c)2001-2005 Alexander Barton <alex@barton.de>
  *
  * 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
@@ -16,7 +16,7 @@
 
 #include "portab.h"
 
-static char UNUSED id[] = "$Id: conn.c,v 1.155 2005/06/26 13:43:59 alex Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.155.2.1 2005/07/02 14:45:07 alex Exp $";
 
 #include "imp.h"
 #include <assert.h>
@@ -517,6 +517,15 @@ Conn_Handler( void )
 } /* Conn_Handler */
 
 
+/**
+ * Write a text string into the socket of a connection.
+ * This function automatically appends CR+LF to the string and validates that
+ * the result is a valid IRC message (oversized messages are shortened, for
+ * example). Then it calls the Conn_Write() function to do the actual sending.
+ * @param Idx Index fo the connection.
+ * @param Format Format string, see printf().
+ * @return true on success, false otherwise.
+ */
 #ifdef PROTOTYPES
 GLOBAL bool
 Conn_WriteStr( CONN_ID Idx, char *Format, ... )
@@ -528,10 +537,6 @@ char *Format;
 va_dcl
 #endif
 {
-       /* String in Socket schreiben. CR+LF wird von dieser Funktion
-        * automatisch angehaengt. Im Fehlerfall wird dir Verbindung
-        * getrennt und false geliefert. */
-
        char buffer[COMMAND_LEN];
        bool ok;
        va_list ap;
@@ -544,15 +549,38 @@ va_dcl
 #else
        va_start( ap );
 #endif
-       if( vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) >= COMMAND_LEN - 2 )
-       {
-               Log( LOG_CRIT, "Text too long to send (connection %d)!", Idx );
-               Conn_Close( Idx, "Text too long to send!", NULL, false );
-               return false;
+
+       if (vsnprintf(buffer, COMMAND_LEN - 2, Format, ap) >= COMMAND_LEN - 2) {
+               /*
+                * The string that should be written to the socket is longer
+                * than the allowed size of COMMAND_LEN bytes (including both
+                * the CR and LF characters). This can be caused by the
+                * IRC_WriteXXX() functions when the prefix of this server had
+                * to be added to an already "quite long" command line which
+                * has been received from a regular IRC client, for example.
+                * 
+                * We are not allowed to send such "oversized" messages to
+                * other servers and clients, see RFC 2812 2.3 and 2813 3.3
+                * ("these messages SHALL NOT exceed 512 characters in length,
+                * counting all characters including the trailing CR-LF").
+                *
+                * So we have a big problem here: we should send more bytes
+                * to the network than we are allowed to and we don't know
+                * the originator (any more). The "old" behaviour of blaming
+                * the receiver ("next hop") is a bad idea (it could be just
+                * an other server only routing the message!), so the only
+                * option left is to shorten the string and to hope that the
+                * result is still somewhat useful ...
+                *                                                   -alex-
+                */
+
+               strcpy (buffer + sizeof(buffer) - strlen(CUT_TXTSUFFIX) - 2 - 1,
+                       CUT_TXTSUFFIX);
        }
 
 #ifdef SNIFFER
-       if( NGIRCd_Sniffer ) Log( LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer );
+       if (NGIRCd_Sniffer)
+               Log(LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer);
 #endif
 
        strlcat( buffer, "\r\n", sizeof( buffer ));