commit - b6b019dddc898e17fbe439d8bf33bd85d2da3b81
commit + fb46757c48159c0b34b4d68d0061f0df8cb6ef36
blob - 6094735486083aede5007e1823e52c662c37a561
blob + 7efc5b88c0620423862882ed4a254317499fb2de
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
/* Handle Data in Connections Read-Buffer.
* Return true if a reuqest was handled, false otherwise (also returned on errors). */
#ifndef STRICT_RFC
- char *ptr1, *ptr2;
+ char *ptr1, *ptr2, *first_eol;
#endif
char *ptr;
size_t len, delta;
return false;
/* A Complete Request end with CR+LF, see RFC 2812. */
+ delta = 2;
ptr = strstr( array_start(&My_Connections[Idx].rbuf), "\r\n" );
- if( ptr ) delta = 2; /* complete request */
#ifndef STRICT_RFC
- else {
- /* Check for non-RFC-compliant request (only CR or LF)? Unfortunately,
- * there are quite a few clients that do this (incl. "mIRC" :-( */
- ptr1 = strchr( array_start(&My_Connections[Idx].rbuf), '\r' );
- ptr2 = strchr( array_start(&My_Connections[Idx].rbuf), '\n' );
+ /* Check for non-RFC-compliant request (only CR or LF)?
+ * Unfortunately, there are quite a few clients out there
+ * that do this -- e. g. mIRC, BitchX, and Trillian :-( */
+ ptr1 = strchr(array_start(&My_Connections[Idx].rbuf), '\r');
+ ptr2 = strchr(array_start(&My_Connections[Idx].rbuf), '\n');
+ if (ptr) {
+ /* Check if there is a single CR or LF _before_ the
+ * corerct CR+LF line terminator: */
+ first_eol = ptr1 < ptr2 ? ptr1 : ptr2;
+ if (first_eol < ptr) {
+ /* Single CR or LF before CR+LF found */
+ ptr = first_eol;
+ delta = 1;
+ }
+ } else if (ptr1 || ptr2) {
+ /* No CR+LF terminated command found, but single
+ * CR or LF found ... */
+ if (ptr1 && ptr2)
+ ptr = ptr1 < ptr2 ? ptr1 : ptr2;
+ else
+ ptr = ptr1 ? ptr1 : ptr2;
delta = 1;
- if( ptr1 && ptr2 ) ptr = ptr1 > ptr2 ? ptr2 : ptr1;
- else if( ptr1 ) ptr = ptr1;
- else if( ptr2 ) ptr = ptr2;
}
#endif
blob - 7be52710f9a3df471fc3264d33a507109389c157
blob + 409231ae0364f751afd60982f8c3b4ce7b1f0812
--- src/ngircd/parse.c
+++ src/ngircd/parse.c
static bool
Validate_Args(CONN_ID Idx, REQUEST *Req, bool *Closed)
{
+#ifdef STRICT_RFC
int i;
+#endif
assert( Idx >= 0 );
assert( Req != NULL );
*Closed = false;
+#ifdef STRICT_RFC
+ /* CR and LF are never allowed in command parameters.
+ * But since we do accept lines terminated only with CR or LF in
+ * "non-RFC-compliant mode" (besides the correct CR+LF combination),
+ * this check can only trigger in "strict RFC" mode; therefore we
+ * optimize it away otherwise ... */
for (i = 0; i < Req->argc; i++) {
if (strchr(Req->argv[i], '\r') || strchr(Req->argv[i], '\n')) {
Log(LOG_ERR,
return false;
}
}
+#endif
+
return true;
} /* Validate_Args */