INN 2.3.1 and X-Trace

Katsuhiro Kondou Katsuhiro_Kondou at isc.org
Sat Oct 20 16:52:21 UTC 2001


In article <20011018.184650.59650912.kondou at isc.org>,
	Katsuhiro Kondou <Katsuhiro_Kondou at isc.org> wrote;

} } Article sent through my server has doubled Path on my server but not on the
} } other servers.
} 
} Aha, I've got it.  The path is modified by nnrpd in that case.
} I'll try to fix.

Try attached which works for me.  Tell me if it works for you also.
I'll commit if it's ok.
-- 
Katsuhiro Kondou

--- nnrpd/article.c	2001/04/23 06:29:38	1.86.2.12
+++ nnrpd/article.c	2001/10/20 16:50:11
@@ -377,7 +377,7 @@
 */
 STATIC void ARTsendmmap(SENDTYPE what)
 {
-    char		*p, *q, *r, *s, *path, *xref, *virtualpath;
+    char		*p, *q, *r, *s, *path, *xref;
     struct timeval	stv, etv;
     long		bytecount;
     char		lastchar;
@@ -455,24 +455,28 @@
 		return;
 	    }
 	}
-	virtualpath = NEW(char, VirtualPathlen + 2);
-	sprintf(virtualpath, "!%s", VirtualPath);
-	for (s = path ; s + VirtualPathlen + 1 < ARThandle->data + ARThandle->len ; s++) {
-	    if (*s != *virtualpath || !EQn(s, virtualpath, VirtualPathlen + 1))
+	for (s = path, lastchar = '\0';
+	    s + VirtualPathlen + 1 < ARThandle->data + ARThandle->len;
+	    lastchar = *s++) {
+	    if ((lastchar != '\0' && lastchar != '!') || *s != *VirtualPath ||
+		!EQn(s, VirtualPath, VirtualPathlen - 1))
 		continue;
+	    if (*(s + VirtualPathlen - 1) != '\0' &&
+		*(s + VirtualPathlen - 1) != '!')
+		continue;
 	    break;
 	}
 	if (s + VirtualPathlen + 1 < ARThandle->data + ARThandle->len) {
 	    if (xref > path) {
 	        SendIOv(q, path - q);
-	        SendIOv(s + 1, xref - (s + 1));
+	        SendIOv(s, xref - s);
 	        SendIOv(VirtualPath, VirtualPathlen - 1);
 	        SendIOv(r, p - r);
 	    } else {
 	        SendIOv(q, xref - q);
 	        SendIOv(VirtualPath, VirtualPathlen - 1);
 	        SendIOv(xref, path - xref);
-	        SendIOv(s + VirtualPathlen, p - (s + VirtualPathlen));
+	        SendIOv(s, p - s);
 	    }
 	} else {
 	    if (xref > path) {
@@ -489,7 +493,6 @@
 	        SendIOv(path, p - path);
 	    }
 	}
-	DISPOSE(virtualpath);
     } else
 	SendIOv(q, p - q);
     ARTgetsize += p - q;
@@ -520,7 +523,7 @@
 char *GetHeader(char *header, BOOL IsLines)
 {
     static char		buff[40];
-    char		*p, *q, *r, *s, *t, *virtualpath;
+    char		*p, *q, *r, *s, *t, prevchar;
     /* Bogus value here to make sure that it isn't initialized to \n */
     char		lastchar = ' ';
     char		*limit;
@@ -578,21 +581,26 @@
 		    }
 		}
 		if (pathheader && (VirtualPathlen > 0)) {
-		    virtualpath = NEW(char, VirtualPathlen + 1);
-		    sprintf(virtualpath, "!%s", VirtualPath);
-		    for (s = p ; s + VirtualPathlen + 1 < ARThandle->data + ARThandle->len ; s++) {
-			if (*s != *virtualpath || !EQn(s, virtualpath, VirtualPathlen + 1))
+		    for (s = p, prevchar = '\0';
+			s + VirtualPathlen + 1 < ARThandle->data + ARThandle->len;
+			prevchar = *s++) {
+			if ((prevchar != '\0' && prevchar != '!') ||
+			    *s != *VirtualPath ||
+			    !EQn(s, VirtualPath, VirtualPathlen - 1))
+			    continue;
+			if (*(s + VirtualPathlen - 1) != '\0' &&
+			    *(s + VirtualPathlen - 1) != '!')
 			    continue;
 			break;
 		    }
 		    if (s + VirtualPathlen + 1 < ARThandle->data + ARThandle->len) {
-			memcpy(retval, s + 1, q - (s + 1));
+			memcpy(retval, s, q - s);
+			*(retval + (int)(q - s)) = '\0';
 		    } else {
 			memcpy(retval, VirtualPath, VirtualPathlen);
 			memcpy(retval + VirtualPathlen, p, q - p);
 			*(retval + (int)(q - p) + VirtualPathlen) = '\0';
 		    }
-		    DISPOSE(virtualpath);
 		} else if (xrefheader && (VirtualPathlen > 0)) {
 		    if ((r = memchr(p, ' ', q - p)) == NULL)
 			return NULL;


More information about the inn-workers mailing list