Module Name:    src
Committed By:   rillig
Date:           Thu Nov  2 06:09:07 UTC 2023

Modified Files:
        src/usr.bin/make: var.c

Log Message:
make: when comparing substrings, don't read beyond the substring's end

Right now, Substring_Words terminates each word with a '\0', but that's
an implementation detail that is not required by the interface, so don't
rely on it.


To generate a diff of this commit:
cvs rdiff -u -r1.1067 -r1.1068 src/usr.bin/make/var.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.1067 src/usr.bin/make/var.c:1.1068
--- src/usr.bin/make/var.c:1.1067	Thu Nov  2 05:55:22 2023
+++ src/usr.bin/make/var.c	Thu Nov  2 06:09:07 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1067 2023/11/02 05:55:22 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1068 2023/11/02 06:09:07 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -139,7 +139,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1067 2023/11/02 05:55:22 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1068 2023/11/02 06:09:07 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -3382,10 +3382,19 @@ SubNumDesc(const void *sa, const void *s
 }
 
 static int
+Substring_Cmp(Substring a, Substring b)
+{
+	for (; a.start < a.end && b.start < b.end; a.start++, b.start++)
+		if (a.start[0] != b.start[0])
+			return (unsigned char)a.start[0]
+			    - (unsigned char)b.start[0];
+	return (int)((a.end - a.start) - (b.end - b.start));
+}
+
+static int
 SubStrAsc(const void *sa, const void *sb)
 {
-	return strcmp(
-	    ((const Substring *)sa)->start, ((const Substring *)sb)->start);
+	return Substring_Cmp(*(const Substring *)sa, *(const Substring *)sb);
 }
 
 static int

Reply via email to