Hi,

> I've located the problem and created a patch that works for me. If
> you
> could verify that it works for you as well that would be great.
> 
> The attached patch is against the Etch version of iproute, but
> seems to
> apply against the Sid version as well (with some offset and fuzz,
> but
> without failing).

I built etch iproute package (20061002-3) with patch applied and
resulting tc binary works without problem - at least with my tc-bad.txt
batch file. Bug seems to has been fixed, but as I employed temporary
workaround (no comments and line continuation) with my batch script
generator, I won't test patched binary in production until I have
more time.
Many thanks for your work, I'll send a message in case of any further
problems.

Regards,
Michal Pokrywka
diff -urip iproute-20061002/include/utils.h iproute-20061002.fixed2/include/utils.h
--- iproute-20061002/include/utils.h	2006-10-02 22:13:34.000000000 +0200
+++ iproute-20061002.fixed2/include/utils.h	2007-08-16 00:51:58.000000000 +0200
@@ -132,7 +132,7 @@ int print_timestamp(FILE *fp);
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 
 extern int cmdlineno;
-extern size_t getcmdline(char **line, size_t *len, FILE *in);
+extern ssize_t getcmdline(char **line, size_t *len, FILE *in);
 extern int makeargs(char *line, char *argv[], int maxargs);
 
 #endif /* __UTILS_H__ */
diff -urip iproute-20061002/lib/utils.c iproute-20061002.fixed2/lib/utils.c
--- iproute-20061002/lib/utils.c	2006-10-02 22:13:34.000000000 +0200
+++ iproute-20061002.fixed2/lib/utils.c	2007-08-16 00:49:02.000000000 +0200
@@ -578,9 +578,9 @@ int print_timestamp(FILE *fp)
 int cmdlineno;
 
 /* Like glibc getline but handle continuation lines and comments */
-size_t getcmdline(char **linep, size_t *lenp, FILE *in)
+ssize_t getcmdline(char **linep, size_t *lenp, FILE *in)
 {
-	size_t cc;
+	ssize_t cc;
 	char *cp;
 		
 	if ((cc = getline(linep, lenp, in)) < 0)
@@ -608,9 +608,11 @@ size_t getcmdline(char **linep, size_t *
 		if (cp) 
 			*cp = '\0';
 
-		*linep = realloc(*linep, strlen(*linep) + strlen(line1) + 1);
+		*lenp = strlen(*linep) + strlen(line1) + 1;
+		*linep = realloc(*linep, *lenp);
 		if (!*linep) {
 			fprintf(stderr, "Out of memory\n");
+			*lenp = 0;
 			return -1;
 		}
 		cc += cc1 - 2;

Reply via email to