From ce68abe0b4b2a71f6c224306f741c44d0138825a Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 17 Oct 2011 18:25:04 +0000 Subject: [PATCH] * dcrt0.cc (dll_crt0_1): Copy argv before passing to main(). --- winsup/cygwin/ChangeLog | 4 ++++ winsup/cygwin/dcrt0.cc | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d250182dc..786c74258 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2011-10-17 Christopher Faylor + + * dcrt0.cc (dll_crt0_1): Copy argv before passing to main(). + 2011-10-17 Christopher Faylor * sigproc.cc (proc_terminate): Avoid setting ppid to 1 if we're execing. diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index f0980913f..dd3ff021c 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -894,7 +894,18 @@ dll_crt0_1 (void *) _setlocale_r (_REENT, LC_CTYPE, "C"); if (user_data->main) - cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr)); + { + /* Create a copy of Cygwin's version of __argv so that, if the user makes + a change to an element of argv[] it does not affect Cygwin's argv. + Changing the the contents of what argv[n] points to will still + affect Cygwin. This is similar (but not exactly like) Linux. */ + char *newargv[__argc + 1]; + char **nav = newargv; + char **oav = __argv; + while ((*nav++ = *oav++) != NULL) + continue; + cygwin_exit (user_data->main (__argc, newargv, *user_data->envptr)); + } __asm__ (" \n\ .global __cygwin_exit_return \n\ __cygwin_exit_return: \n\