1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) r45521,r45523,r45551: [Backport #9699]

win32.c: wchar conversion

	* win32/win32.c (rb_w32_wstr_to_mbstr, rb_w32_mbstr_to_wstr): make
  WCHAR/mb conversion functions public.
	* dln.c (dln_load): use wchar version to load a library in
	  non-ascii path on Windows.  based on the patch by Bugra Barin
	  <bugrabarin AT hotmail.com> in [ruby-core:61845].  [Bug #9699]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@46450 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2014-06-16 15:42:56 +00:00
parent 7fd56bd30f
commit 12285fc109
8 changed files with 54 additions and 12 deletions

View file

@ -1,3 +1,9 @@
Tue Jun 17 00:37:15 2014 Bugra Barin <bugrabarin@hotmail.com>
* dln.c (dln_load): use wchar version to load a library in
non-ascii path on Windows. based on the patch by Bugra Barin
<bugrabarin AT hotmail.com> in [ruby-core:61845]. [Bug #9699]
Tue Jun 17 00:26:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* process.c (obj2uid, obj2gid): now getpwnam_r() and getgrnam_r()

15
dln.c
View file

@ -1255,20 +1255,25 @@ dln_load(const char *file)
#if defined _WIN32 && !defined __CYGWIN__
HINSTANCE handle;
char winfile[MAXPATHLEN];
WCHAR *winfile;
char message[1024];
void (*init_fct)();
char *buf;
if (strlen(file) >= MAXPATHLEN) dln_loaderror("filename too long");
/* Load the file as an object one */
init_funcname(&buf, file);
strlcpy(winfile, file, sizeof(winfile));
/* Convert the file path to wide char */
winfile = rb_w32_mbstr_to_wstr(CP_UTF8, file, -1, NULL);
if (!winfile) {
dln_memerror();
}
/* Load file */
if ((handle = LoadLibrary(winfile)) == NULL) {
handle = LoadLibraryW(winfile);
free(winfile);
if (!handle) {
error = dln_strerror();
goto failed;
}

View file

@ -0,0 +1,4 @@
void
Init_empty(void)
{
}

View file

@ -0,0 +1,3 @@
if $mingw or $mswin
create_makefile("-test-/win32/dln/empty")
end

View file

@ -772,6 +772,8 @@ int rb_w32_wait_events_blocking(HANDLE *events, int num, DWORD timeout);
int rb_w32_time_subtract(struct timeval *rest, const struct timeval *wait);
int rb_w32_wrap_io_handle(HANDLE, int);
int rb_w32_unwrap_io_handle(int);
WCHAR *rb_w32_mbstr_to_wstr(UINT, const char *, int, long *);
char *rb_w32_wstr_to_mbstr(UINT, const WCHAR *, int, long *);
/*
== ***CAUTION***

View file

@ -1,4 +1,6 @@
require 'test/unit'
require 'tmpdir'
require 'rbconfig'
require_relative '../../ruby/envutil'
module Bug
@ -8,6 +10,26 @@ module Bug
bug = '[Bug #6303]'
assert_in_out_err(['-r-test-/win32/dln', '-eexit'], '', [], [], bug, timeout: 10)
end
def test_nonascii_load
bug9699 = '[ruby-core:61845] [Bug #9699]'
so = "-test-/win32/dln/empty." + RbConfig::CONFIG["DLEXT"]
so = $:.find {|d| d = ::File.join(d, so); break d if ::File.exist?(d)}
assert_not_nil(so)
Dir.mkdir(dir = ::File.join(testdir = Dir.mktmpdir("test"), "\u{30c6 30b9 30c8}"))
::File.copy_stream(so, ::File.join(dir, ::File.basename(so)))
assert_separately(['-', bug9699, testdir, ::File.basename(so)], <<-'end;')
bug, dir, so = *ARGV
assert_nothing_raised(LoadError, bug) do
require ::File.join(dir, "\u{30c6 30b9 30c8}", so)
end
end;
ensure
::File.unlink(::File.join(dir, ::File.basename(so))) rescue nil
Dir.rmdir(dir) rescue nil
Dir.rmdir(testdir) rescue nil
end
end
end
end if /mswin|mingw/ =~ RUBY_PLATFORM

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.1.2"
#define RUBY_RELEASE_DATE "2014-06-17"
#define RUBY_PATCHLEVEL 130
#define RUBY_PATCHLEVEL 131
#define RUBY_RELEASE_YEAR 2014
#define RUBY_RELEASE_MONTH 6

View file

@ -1197,8 +1197,8 @@ is_batch(const char *cmd)
}
static UINT filecp(void);
static WCHAR *mbstr_to_wstr(UINT, const char *, int, long *);
static char *wstr_to_mbstr(UINT, const WCHAR *, int, long *);
#define mbstr_to_wstr rb_w32_mbstr_to_wstr
#define wstr_to_mbstr rb_w32_wstr_to_mbstr
#define acp_to_wstr(str, plen) mbstr_to_wstr(CP_ACP, str, -1, plen)
#define wstr_to_acp(str, plen) wstr_to_mbstr(CP_ACP, str, -1, plen)
#define filecp_to_wstr(str, plen) mbstr_to_wstr(filecp(), str, -1, plen)
@ -1952,8 +1952,8 @@ filecp(void)
}
/* License: Ruby's */
static char *
wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen, long *plen)
char *
rb_w32_wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen, long *plen)
{
char *ptr;
int len = WideCharToMultiByte(cp, 0, wstr, clen, NULL, 0, NULL, NULL);
@ -1968,8 +1968,8 @@ wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen, long *plen)
}
/* License: Ruby's */
static WCHAR *
mbstr_to_wstr(UINT cp, const char *str, int clen, long *plen)
WCHAR *
rb_w32_mbstr_to_wstr(UINT cp, const char *str, int clen, long *plen)
{
WCHAR *ptr;
int len = MultiByteToWideChar(cp, 0, str, clen, NULL, 0);