Module Name:    src
Committed By:   rillig
Date:           Mon Jul 20 15:44:12 UTC 2020

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

Log Message:
make(1): fix type of VarPattern.lhsLen and rhsLen

String length is measured in size_t, not int.


To generate a diff of this commit:
cvs rdiff -u -r1.280 -r1.281 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.280 src/usr.bin/make/var.c:1.281
--- src/usr.bin/make/var.c:1.280	Mon Jul 20 15:15:32 2020
+++ src/usr.bin/make/var.c	Mon Jul 20 15:44:12 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.280 2020/07/20 15:15:32 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.281 2020/07/20 15:44:12 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.280 2020/07/20 15:15:32 rillig Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.281 2020/07/20 15:44:12 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)var.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: var.c,v 1.280 2020/07/20 15:15:32 rillig Exp $");
+__RCSID("$NetBSD: var.c,v 1.281 2020/07/20 15:44:12 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -266,15 +266,14 @@ typedef struct {
 				 * several space-separated words). */
 } Var_Parse_State;
 
-/* struct passed as 'void *' to VarSubstitute() for ":S/lhs/rhs/",
- * to VarSYSVMatch() for ":lhs=rhs". */
+/* struct passed as 'void *' to VarSubstitute() for ":S/lhs/rhs/" */
 typedef struct {
-    const char   *lhs;		/* String to match */
-    int		  leftLen;	/* Length of string */
-    const char   *rhs;		/* Replacement string (w/ &'s removed) */
-    int		  rightLen;	/* Length of replacement */
+    const char	*lhs;
+    size_t	lhsLen;
+    const char	*rhs;
+    size_t	rhsLen;
     VarPatternFlags pflags;
-} VarPattern;
+} VarSubstituteArgs;
 
 /* struct passed as 'void *' to VarLoopExpand() for ":@tvar@str@" */
 typedef struct {
@@ -1352,55 +1351,54 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSE
 	      void *data)
 {
     size_t wordLen = strlen(word);
-    VarPattern *pattern = data;
-    const VarPatternFlags pflags = pattern->pflags;
+    VarSubstituteArgs *args = data;
+    const VarPatternFlags pflags = args->pflags;
 
     if ((pflags & (VARP_SUB_ONE | VARP_SUB_MATCHED)) ==
 	(VARP_SUB_ONE | VARP_SUB_MATCHED))
 	goto nosub;
 
-    if (pattern->pflags & VARP_MATCH_START) {
-	if (strncmp(word, pattern->lhs, pattern->leftLen) != 0)
+    if (args->pflags & VARP_MATCH_START) {
+	if (strncmp(word, args->lhs, args->lhsLen) != 0)
 	    goto nosub;
 
-	if (pattern->pflags & VARP_MATCH_END) {
-	    if (wordLen != (size_t)pattern->leftLen)
+	if (args->pflags & VARP_MATCH_END) {
+	    if (wordLen != args->lhsLen)
 		goto nosub;
 
-	    SepBuf_AddBytes(buf, pattern->rhs, pattern->rightLen);
-	    pattern->pflags |= VARP_SUB_MATCHED;
+	    SepBuf_AddBytes(buf, args->rhs, args->rhsLen);
+	    args->pflags |= VARP_SUB_MATCHED;
 	} else {
-	    SepBuf_AddBytes(buf, pattern->rhs, pattern->rightLen);
-	    SepBuf_AddBytes(buf, word + pattern->leftLen,
-			    wordLen - pattern->leftLen);
-	    pattern->pflags |= VARP_SUB_MATCHED;
+	    SepBuf_AddBytes(buf, args->rhs, args->rhsLen);
+	    SepBuf_AddBytes(buf, word + args->lhsLen, wordLen - args->lhsLen);
+	    args->pflags |= VARP_SUB_MATCHED;
 	}
 	return;
     }
 
-    if (pattern->pflags & VARP_MATCH_END) {
-	if (wordLen < (size_t)pattern->leftLen)
+    if (args->pflags & VARP_MATCH_END) {
+	if (wordLen < args->lhsLen)
 	    goto nosub;
-	const char *start = word + (wordLen - pattern->leftLen);
-	if (memcmp(start, pattern->lhs, pattern->leftLen) != 0)
+	const char *start = word + (wordLen - args->lhsLen);
+	if (memcmp(start, args->lhs, args->lhsLen) != 0)
 	    goto nosub;
 
 	SepBuf_AddBytes(buf, word, start - word);
-	SepBuf_AddBytes(buf, pattern->rhs, pattern->rightLen);
-	pattern->pflags |= VARP_SUB_MATCHED;
+	SepBuf_AddBytes(buf, args->rhs, args->rhsLen);
+	args->pflags |= VARP_SUB_MATCHED;
 	return;
     }
 
     /* unanchored */
     const char *cp;
-    while ((cp = Str_FindSubstring(word, pattern->lhs)) != NULL) {
+    while ((cp = Str_FindSubstring(word, args->lhs)) != NULL) {
 	SepBuf_AddBytes(buf, word, cp - word);
-	SepBuf_AddBytes(buf, pattern->rhs, pattern->rightLen);
-	wordLen -= (cp - word) + pattern->leftLen;
-	word = cp + pattern->leftLen;
-	if (wordLen == 0 || !(pattern->pflags & VARP_SUB_GLOBAL))
+	SepBuf_AddBytes(buf, args->rhs, args->rhsLen);
+	wordLen -= (cp - word) + args->lhsLen;
+	word = cp + args->lhsLen;
+	if (wordLen == 0 || !(args->pflags & VARP_SUB_GLOBAL))
 	    break;
-	pattern->pflags |= VARP_SUB_MATCHED;
+	args->pflags |= VARP_SUB_MATCHED;
     }
 nosub:
     SepBuf_AddBytes(buf, word, wordLen);
@@ -1896,12 +1894,12 @@ VarRange(const char *str, int ac)
 static char *
 ParseModifierPart(GNode *ctxt, const char **tstr, int delim,
 		  VarEvalFlags eflags, VarPatternFlags *mpflags,
-		  int *length, VarPattern *pattern)
+		  size_t *length, VarSubstituteArgs *subst)
 {
     const char *cp;
     char *rstr;
     Buffer buf;
-    int junk;
+    size_t junk;
     VarEvalFlags errnum = eflags & VARE_UNDEFERR;
 
     Buf_Init(&buf, 0);
@@ -1916,7 +1914,7 @@ ParseModifierPart(GNode *ctxt, const cha
      */
     for (cp = *tstr; *cp != '\0' && *cp != delim; cp++) {
 	Boolean is_escaped = cp[0] == '\\' && (cp[1] == delim ||
-	    cp[1] == '\\' || cp[1] == '$' || (pattern && cp[1] == '&'));
+	    cp[1] == '\\' || cp[1] == '$' || (subst != NULL && cp[1] == '&'));
 	if (is_escaped) {
 	    Buf_AddByte(&buf, cp[1]);
 	    cp++;
@@ -1974,8 +1972,8 @@ ParseModifierPart(GNode *ctxt, const cha
 			Buf_AddByte(&buf, *cp);
 		}
 	    }
-	} else if (pattern && *cp == '&')
-	    Buf_AddBytes(&buf, pattern->leftLen, pattern->lhs);
+	} else if (subst != NULL && *cp == '&')
+	    Buf_AddBytes(&buf, subst->lhsLen, subst->lhs);
 	else
 	    Buf_AddByte(&buf, *cp);
     }
@@ -2480,11 +2478,8 @@ ApplyModifier_Match(ApplyModifiersState 
 static Boolean
 ApplyModifier_Subst(ApplyModifiersState *st)
 {
-    VarPattern 	    pattern;
-    Var_Parse_State tmpparsestate;
-
-    pattern.pflags = 0;
-    tmpparsestate = st->parsestate;
+    VarSubstituteArgs args;
+    Var_Parse_State tmpparsestate = st->parsestate;
     st->delim = st->tstr[1];
     st->tstr += 2;
 
@@ -2492,23 +2487,24 @@ ApplyModifier_Subst(ApplyModifiersState 
      * If pattern begins with '^', it is anchored to the
      * start of the word -- skip over it and flag pattern.
      */
+    args.pflags = 0;
     if (*st->tstr == '^') {
-	pattern.pflags |= VARP_MATCH_START;
+	args.pflags |= VARP_MATCH_START;
 	st->tstr++;
     }
 
     st->cp = st->tstr;
-    pattern.lhs = ParseModifierPart(
-	st->ctxt, &st->cp, st->delim, st->eflags,
-	&pattern.pflags, &pattern.leftLen, NULL);
-    if (pattern.lhs == NULL)
+    char *lhs = ParseModifierPart(st->ctxt, &st->cp, st->delim, st->eflags,
+				  &args.pflags, &args.lhsLen, NULL);
+    if (lhs == NULL)
 	return FALSE;
+    args.lhs = lhs;
 
-    pattern.rhs = ParseModifierPart(
-	st->ctxt, &st->cp, st->delim, st->eflags,
-	NULL, &pattern.rightLen, &pattern);
-    if (pattern.rhs == NULL)
+    char *rhs = ParseModifierPart(st->ctxt, &st->cp, st->delim, st->eflags,
+				  NULL, &args.rhsLen, &args);
+    if (rhs == NULL)
 	return FALSE;
+    args.rhs = rhs;
 
     /*
      * Check for global substitution. If 'g' after the final
@@ -2518,10 +2514,10 @@ ApplyModifier_Subst(ApplyModifiersState 
     for (;; st->cp++) {
 	switch (*st->cp) {
 	case 'g':
-	    pattern.pflags |= VARP_SUB_GLOBAL;
+	    args.pflags |= VARP_SUB_GLOBAL;
 	    continue;
 	case '1':
-	    pattern.pflags |= VARP_SUB_ONE;
+	    args.pflags |= VARP_SUB_ONE;
 	    continue;
 	case 'W':
 	    tmpparsestate.oneBigWord = TRUE;
@@ -2531,12 +2527,11 @@ ApplyModifier_Subst(ApplyModifiersState 
     }
 
     st->termc = *st->cp;
-    st->newStr = VarModify(
-	st->ctxt, &tmpparsestate, st->nstr, VarSubstitute, &pattern);
+    st->newStr = VarModify(st->ctxt, &tmpparsestate, st->nstr,
+			   VarSubstitute, &args);
 
-    /* Free the two strings. */
-    free(UNCONST(pattern.lhs));
-    free(UNCONST(pattern.rhs));
+    free(lhs);
+    free(rhs);
     st->delim = '\0';
     return TRUE;
 }

Reply via email to