| 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 |
| |