X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Tue, 18 May 2010 10:31:36 -0400 From: Christopher Faylor To: cygwin AT cygwin DOT com Subject: Re: vfork always fail problem Message-ID: <20100518143136.GB5909@ednor.casa.cgf.cx> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <20100514192202 DOT GB8785 AT calimero DOT vinschen DOT de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Tue, May 18, 2010 at 02:47:57PM +0900, Kazuhiro Fujieda wrote: >>>> On Fri, 14 May 2010 21:22:02 +0200 >>>> Corinna Vinschen said: > >> That sounds a bit weird. The joke of using the ...W functions is that >> the string parameters are always given in UTF-16. GBK is a multibyte >> charset and can only be used in conjunction with the ...A functions. >> However, I'm on vacation so I can't test this scenario right now. > >GetModuleFileName used in pinfo_basic::pinfo_basic disturbs the >order. This function uses ANSI codepage. 'fork' for a file whose >name contains multibyte characters doesn't work well in UTF-8 locales. > >This call should be GetModuleFileNameW and the type of progname >in _pinfo should be wide characters. I attached the patch. > >2010-05-18 Kazuhiro Fujida > > * environ.cc (regopt): Change the first argument to wide char string. > (environ_init): Accommodate change to the first argument of regopt. > * exception.cc (open_stackdumpfile): Accommodate change to the type > of progname in _pinfo. > * external.cc (fillout_pinfo): Ditto. > * fhandler_process.cc (format_process_winexename): Ditto. > (format_process_stat): Ditto. > * fork.cc (fork::parent): Ditto. > * pinfo.cc (pinfo_basic::pinfo_basic): Call GetModuleFileNameW > instead of GetModuleFileName. > (pinfo::thisproc): Accommodate change to the type of progname in > _pinfo. > (pinfo_init): Ditto. > * pinfo.h (_pinfo): Change the type of progname to a wide char array. > * registry.h (reg_key::get_int): Change the first argument from > constant point to pointer to constant. > (reg_key::get_string): Ditto. Change the last argument likewise. > * registry.cc (reg_key::get_int): Accommodate change to the > declaration. > (reg_key::get_string): Ditto. > * strace.cc (strace::hello): Accommodate change to the type of > progname in _pinfo. > (strace::vsprntf): Ditto. > >Index: environ.cc >=================================================================== >RCS file: /cvs/src/src/winsup/cygwin/environ.cc,v >retrieving revision 1.182 >diff -u -r1.182 environ.cc >--- environ.cc 16 Nov 2009 20:05:49 -0000 1.182 >+++ environ.cc 18 May 2010 05:31:45 -0000 >@@ -29,6 +29,7 @@ > #include "registry.h" > #include "environ.h" > #include "child_info.h" >+#include "ntdll.h" > > extern bool dos_file_warning; > extern bool ignore_case_with_glob; >@@ -698,18 +699,24 @@ > > /* Set options from the registry. */ > static bool __stdcall >-regopt (const char *name, char *buf) >+regopt (const WCHAR *name, char *buf) > { > bool parsed_something = false; >- char lname[strlen (name) + 1]; >- strlwr (strcpy (lname, name)); >+ UNICODE_STRING lname; >+ size_t len = (wcslen(name) + 1) * sizeof (WCHAR); >+ RtlInitEmptyUnicodeString(&lname, (PWCHAR) alloca (len), len); >+ wcscpy(lname.Buffer, name); >+ RtlDowncaseUnicodeString(&lname, &lname, FALSE); > > for (int i = 0; i < 2; i++) > { > reg_key r (i, KEY_READ, CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL); > >- if (r.get_string (lname, buf, NT_MAX_PATH, "") == ERROR_SUCCESS) >+ if (r.get_string (lname.Buffer, (PWCHAR) buf, NT_MAX_PATH, L"") == ERROR_SUCCESS) > { >+ char *newp; >+ sys_wcstombs_alloc(&newp, HEAP_NOTHEAP, (PWCHAR) buf); >+ strcpy(buf, newp); > parse_options (buf); > parsed_something = true; > break; >@@ -747,7 +754,7 @@ > } > > char *tmpbuf = tp.t_get (); >- got_something_from_registry = regopt ("default", tmpbuf); >+ got_something_from_registry = regopt (L"default", tmpbuf); > if (myself->progname[0]) > got_something_from_registry = regopt (myself->progname, tmpbuf) > || got_something_from_registry; >Index: exceptions.cc >=================================================================== >RCS file: /cvs/src/src/winsup/cygwin/exceptions.cc,v >retrieving revision 1.343 >diff -u -r1.343 exceptions.cc >--- exceptions.cc 20 Apr 2010 10:44:52 -0000 1.343 >+++ exceptions.cc 18 May 2010 05:31:45 -0000 >@@ -130,24 +130,21 @@ > { > if (myself->progname[0]) > { >- const char *p; >+ const WCHAR *p; > /* write to progname.stackdump if possible */ > if (!myself->progname[0]) >- p = "unknown"; >- else if ((p = strrchr (myself->progname, '\\'))) >+ p = L"unknown"; >+ else if ((p = wcsrchr (myself->progname, L'\\'))) > p++; > else > p = myself->progname; > >- WCHAR corefile[strlen (p) + sizeof (".stackdump")]; >+ WCHAR corefile[wcslen (p) + sizeof (L".stackdump")]; ^^^^^^^^^^^^^^^^^^^^^^ No L" is needed here, AFAICT. I've checked this in, removing the L. Thanks for the patch. Appreciated. Next time maybe you could send this to cygwin-patches? cgf -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple