Module Name: src
Committed By: sjg
Date: Fri Jan 5 22:20:07 UTC 2024
Modified Files:
src/usr.bin/make: main.c
Log Message:
Cmd_Exec use tempfile if cmd is too big
To avoid blowing commandline/env limits, if "cmd"
is more than 1000 bytes, write it to a file and pass that
to shell.
Reviewed by: rillig
To generate a diff of this commit:
cvs rdiff -u -r1.606 -r1.607 src/usr.bin/make/main.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/main.c
diff -u src/usr.bin/make/main.c:1.606 src/usr.bin/make/main.c:1.607
--- src/usr.bin/make/main.c:1.606 Wed Dec 27 00:45:37 2023
+++ src/usr.bin/make/main.c Fri Jan 5 22:20:07 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.606 2023/12/27 00:45:37 sjg Exp $ */
+/* $NetBSD: main.c,v 1.607 2024/01/05 22:20:07 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -111,7 +111,7 @@
#include "trace.h"
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: main.c,v 1.606 2023/12/27 00:45:37 sjg Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.607 2024/01/05 22:20:07 sjg Exp $");
#if defined(MAKE_NATIVE)
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
"The Regents of the University of California. "
@@ -1705,14 +1705,38 @@ Cmd_Exec(const char *cmd, char **error)
char *output;
char *p;
int saved_errno;
+ char cmd_file[MAXPATHLEN];
+ size_t cmd_len;
+ int cmd_fd = -1;
if (shellPath == NULL)
Shell_Init();
+ cmd_len = strlen(cmd);
+ if (cmd_len > 1000) {
+ cmd_fd = mkTempFile(NULL, cmd_file, sizeof(cmd_file));
+ if (cmd_fd >= 0) {
+ ssize_t n;
+
+ n = write(cmd_fd, cmd, cmd_len);
+ close(cmd_fd);
+ if (n < (ssize_t)cmd_len) {
+ unlink(cmd_file);
+ cmd_fd = -1;
+ }
+ }
+ }
+
args[0] = shellName;
- args[1] = "-c";
- args[2] = cmd;
- args[3] = NULL;
+ if (cmd_fd >= 0) {
+ args[1] = cmd_file;
+ args[2] = NULL;
+ } else {
+ cmd_file[0] = '\0';
+ args[1] = "-c";
+ args[2] = cmd;
+ args[3] = NULL;
+ }
DEBUG1(VAR, "Capturing the output of command \"%s\"\n", cmd);
if (pipe(pipefds) == -1) {
@@ -1775,6 +1799,8 @@ Cmd_Exec(const char *cmd, char **error)
"Couldn't read shell's output for \"", cmd, "\"");
else
*error = NULL;
+ if (cmd_file[0] != '\0')
+ unlink(cmd_file);
return output;
}
@@ -2129,7 +2155,7 @@ getTmpdir(void)
/*
* Create and open a temp file using "pattern".
- * If out_fname is provided, set it to a copy of the filename created.
+ * If tfile is provided, set it to a copy of the filename created.
* Otherwise unlink the file once open.
*/
int