blob: 6b898e270bcac6d66c832a261a31244e4ba494aa [file] [log] [blame]
From 54107031fe8cdfb5d7ac0229016af95818b8adf0 Mon Sep 17 00:00:00 2001
From: Naveen M K <naveen@syrusdark.website>
Date: Mon, 7 Jun 2021 23:42:01 +0530
Subject: [PATCH] runscript: always quote args
Signed-off-by: Naveen M K <naveen@syrusdark.website>
---
.../texlive/w64_mingw_wrapper/runscript_dll.c | 43 +++++++++++++++----
1 file changed, 34 insertions(+), 9 deletions(-)
diff --git a/texk/texlive/w64_mingw_wrapper/runscript_dll.c b/texk/texlive/w64_mingw_wrapper/runscript_dll.c
index 588c84b9..395990a1 100644
--- a/texk/texlive/w64_mingw_wrapper/runscript_dll.c
+++ b/texk/texlive/w64_mingw_wrapper/runscript_dll.c
@@ -22,13 +22,44 @@ char subsys_mode[] = "CUI_MODE\n";
char err_env_var[] = "RUNSCRIPT_ERROR_MESSAGE";
char msg_buf[MAX_MSG];
+char *quote(char *data) {
+ int i, ln = strlen(data), nb;
+
+ /* We allocate twice as much space as needed to deal with worse-case
+ of having to escape everything. */
+ char *result = calloc(ln*2+3, sizeof(char));
+ char *presult = result;
+
+ *presult++ = '"';
+ for (nb=0, i=0; i < ln; i++)
+ {
+ if (data[i] == '\\')
+ nb += 1;
+ else if (data[i] == '"')
+ {
+ for (; nb > 0; nb--)
+ *presult++ = '\\';
+ *presult++ = '\\';
+ }
+ else
+ nb = 0;
+ *presult++ = data[i];
+ }
+
+ for (; nb > 0; nb--) /* Deal w trailing slashes */
+ *presult++ = '\\';
+
+ *presult++ = '"';
+ *presult++ = 0;
+ return result;
+}
+
__declspec(dllexport) int dllrunscript( int argc, char *argv[] )
{
static char own_path[MAX_PATH];
static char fpath[MAX_PATH];
char *fname, *argline, **lua_argv;
- char *quoted_argline;
int k, quoted, lua_argc;
HMODULE module_handle = NULL;
@@ -56,24 +87,20 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
argline = GetCommandLine();
if ( argline == NULL ) DIE("failed to retrieve command line string\n");
- quoted_argline = malloc((1+strlen(argline)+1 + 1)*sizeof(char));
- if ( quoted_argline == NULL ) DIE("failed to quote command line string\n");
// skip over argv[0] (it can contain embedded double quotes if launched from cmd.exe!)
for ( quoted = 0; (*argline) && ( !IS_WHITESPACE(*argline) || quoted ); argline++ )
if ( *argline == '"' ) quoted = !quoted;
while ( IS_WHITESPACE(*argline) ) argline++; // remove leading whitespace if any
- // we need to quote our string , it seems.
- snprintf(quoted_argline, (size_t)(1+strlen(argline)+1 + 1), "\"%s\"", argline);
// set up argument list for texlua script
lua_argv = (char **)malloc( (argc + 6) * sizeof(char *) );
lua_argv[lua_argc=0] = texlua_name;
lua_argv[++lua_argc] = fpath; // script to execute
- for ( k = 1; k < argc; k++ ) lua_argv[++lua_argc] = argv[k]; // copy argument list
+ for ( k = 1; k < argc; k++ ) lua_argv[++lua_argc] = quote(argv[k]); // copy argument list
lua_argv[++lua_argc] = subsys_mode; // sentinel argument
lua_argv[++lua_argc] = argc ? argv[0] : own_path; // original argv[0]
//lua_argv[++lua_argc] = argline; // unparsed arguments
- lua_argv[++lua_argc] = quoted_argline; // unparsed arguments
+ lua_argv[++lua_argc] = quote(argline); // unparsed arguments
lua_argv[++lua_argc] = NULL;
// call texlua interpreter
@@ -123,5 +150,3 @@ __declspec(dllexport) int dllwrunscript(
return dllrunscript( 0, NULL );
#endif
}
-
-
--
2.31.1.windows.1