Index: macro.c
--- macro.c.orig
+++ macro.c
@@ -850,20 +850,20 @@ expand_substitute(struct place *p, struct expstate *es
 		ei = expansionitemarray_get(&es->curmacro->expansion, i);
 		switch (ei->itemtype) {
 		    case EI_STRING:
-			strcat(ret, ei->ei_string);
+			strlcat(ret, ei->ei_string, len + 1);
 			break;
 		    case EI_PARAM:
 			arg = stringarray_get(&es->args, ei->ei_param);
-			strcat(ret, arg);
+			strlcat(ret, arg, len + 1);
 			break;
 		    case EI_FILE:
-			strcat(ret, "\"");
-			strcat(ret, place_getname(p));
-			strcat(ret, "\"");
+			strlcat(ret, "\"", len + 1);
+			strlcat(ret, place_getname(p), len + 1);
+			strlcat(ret, "\"", len + 1);
 			break;
 		    case EI_LINE:
 			snprintf(numbuf, sizeof(numbuf), "%u", p->line);
-			strcat(ret, numbuf);
+			strlcat(ret, numbuf, len + 1);
 			break;
 		}
 	}
