X-Git-Url: https://git.tld-linux.org/?p=packages%2Fdialog.git;a=blobdiff_plain;f=escaping_fix.patch;fp=escaping_fix.patch;h=2dffd8c1116179b0defad3cee95b5d8fec3f2f76;hp=0000000000000000000000000000000000000000;hb=b84d13e38bd45bb262e3e07c73a637f4982b8795;hpb=d0df2a057355d0453106cc75e3dc6cd51da91c29 diff --git a/escaping_fix.patch b/escaping_fix.patch new file mode 100644 index 0000000..2dffd8c --- /dev/null +++ b/escaping_fix.patch @@ -0,0 +1,134 @@ +diff -ur dialog-1.3-20160209.orig/argv.c dialog-1.3-20160209/argv.c +--- dialog-1.3-20160209.orig/argv.c 2015-05-13 00:34:39.000000000 +0000 ++++ dialog-1.3-20160209/argv.c 2016-02-11 10:41:08.705828223 +0000 +@@ -55,12 +55,18 @@ + ++count; + inparm = TRUE; + } +- } else if (!quoted && isspace(UCH(blob[n]))) { +- if (inparm) { ++ } else if (blob[n] == '\\') { ++ if (quoted && !isspace(UCH(blob[n + 1]))) { + if (pass) { +- *param++ = '\0'; ++ *param++ = blob[n]; ++ *param++ = blob[n + 1]; + } +- inparm = FALSE; ++ } ++ ++n; ++ } else if (!quoted && isspace(UCH(blob[n]))) { ++ inparm = FALSE; ++ if (pass) { ++ *param++ = '\0'; + } + } else { + if (!inparm) { +@@ -69,10 +75,6 @@ + ++count; + inparm = TRUE; + } +- if (blob[n] == '\\') { +- if (++n == length) +- break; /* The string is terminated by a backslash */ +- } + if (pass) { + *param++ = blob[n]; + } +diff -ur dialog-1.3-20160209.orig/dialog.c dialog-1.3-20160209/dialog.c +--- dialog-1.3-20160209.orig/dialog.c 2016-02-09 00:05:39.000000000 +0000 ++++ dialog-1.3-20160209/dialog.c 2016-02-11 10:41:08.707828223 +0000 +@@ -421,58 +421,49 @@ + blob[length] = '\0'; + + list = dlg_string_to_argv(blob); +- added = dlg_count_argv(list); +- if (added > 2) { +- /* *argcp arguments before the expansion of --file +- - 2 for the removal of '--file ' +- + added for the arguments contained in +- + 1 for the terminating NULL pointer */ +- size_t need = (size_t) (*argcp + added - 1); +- if (doalloc) { +- *argvp = dlg_realloc(char *, need, *argvp); +- assert_ptr(*argvp, "unescape_argv"); +- } else { +- char **newp = dlg_malloc(char *, need); +- assert_ptr(newp, "unescape_argv"); +- for (n = 0; n < *argcp; ++n) { +- newp[n] = (*argvp)[n]; ++ if ((added = dlg_count_argv(list)) != 0) { ++ if (added > 2) { ++ size_t need = (size_t) (*argcp + added + 1); ++ if (doalloc) { ++ *argvp = dlg_realloc(char *, need, *argvp); ++ assert_ptr(*argvp, "unescape_argv"); ++ } else { ++ char **newp = dlg_malloc(char *, need); ++ assert_ptr(newp, "unescape_argv"); ++ for (n = 0; n < *argcp; ++n) { ++ newp[n] = (*argvp)[n]; ++ } ++ *argvp = newp; ++ doalloc = TRUE; + } +- /* The new array is not NULL-terminated yet. */ +- *argvp = newp; +- doalloc = TRUE; ++ dialog_opts = dlg_realloc(bool, need, dialog_opts); ++ assert_ptr(dialog_opts, "unescape_argv"); + } +- dialog_opts = dlg_realloc(bool, need, dialog_opts); +- assert_ptr(dialog_opts, "unescape_argv"); +- +- /* Shift the arguments after '--file ' +- right by (added - 2) positions */ +- for (n = *argcp - 1; n >= j + 2; --n) { +- (*argvp)[n + added - 2] = (*argvp)[n]; +- dialog_opts[n + added - 2] = dialog_opts[n]; ++ if (added > 2) { ++ for (n = *argcp; n >= j + 2; --n) { ++ (*argvp)[n + added - 2] = (*argvp)[n]; ++ dialog_opts[n + added - 2] = dialog_opts[n]; ++ } ++ } else if (added == 1) { ++ for (n = j; n < *argcp; ++n) { ++ (*argvp)[n] = (*argvp)[n + 1]; ++ dialog_opts[n] = dialog_opts[n + 1]; ++ } + } +- } else if (added < 2) { +- /* 0 or 1 argument read from the included file +- -> shift the arguments after '--file ' +- left by (2 - added) positions */ +- for (n = j + added; n + 2 - added < *argcp; ++n) { +- (*argvp)[n] = (*argvp)[n + 2 - added]; +- dialog_opts[n] = dialog_opts[n + 2 - added]; ++ for (n = 0; n < added; ++n) { ++ (*argvp)[n + j] = list[n]; ++ dialog_opts[n + j] = FALSE; + } ++ *argcp += added - 2; ++ free(list); ++ --j; /* force rescan */ + } +- /* Copy the inserted arguments to *argvp */ +- for (n = 0; n < added; ++n) { +- (*argvp)[n + j] = list[n]; +- dialog_opts[n + j] = FALSE; +- } +- *argcp += added - 2; +- (*argvp)[*argcp] = 0; /* Write the NULL terminator */ +- free(list); /* No-op if 'list' is NULL */ +- /* Force rescan starting from the first inserted argument */ +- --j; +- continue; + } else { + dlg_exiterr("Cannot open --file %s", filename); + } ++ (*argvp)[*argcp] = 0; ++ ++j; ++ continue; + } else { + dlg_exiterr("No value given for --file"); + }