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

win32.c: rb_dir_getwd_ospath

* win32/win32.c (rb_dir_getwd_ospath): Windows implementation
  moved from dir.c.  get rid of freeing malloced memory by xfree.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59061 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-06-12 00:18:30 +00:00
parent 5aff6f2948
commit ff5e3b98a0
2 changed files with 32 additions and 8 deletions

7
dir.c
View file

@ -1081,6 +1081,7 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj)
return INT2FIX(0); return INT2FIX(0);
} }
#ifndef _WIN32
VALUE VALUE
rb_dir_getwd_ospath(void) rb_dir_getwd_ospath(void)
{ {
@ -1093,10 +1094,7 @@ rb_dir_getwd_ospath(void)
path_guard = Data_Wrap_Struct((VALUE)0, NULL, RUBY_DEFAULT_FREE, NULL); path_guard = Data_Wrap_Struct((VALUE)0, NULL, RUBY_DEFAULT_FREE, NULL);
path = my_getcwd(); path = my_getcwd();
DATA_PTR(path_guard) = path; DATA_PTR(path_guard) = path;
#ifdef _WIN32 #ifdef __APPLE__
cwd = rb_utf8_str_new_cstr(path);
OBJ_TAINT(cwd);
#elif defined __APPLE__
cwd = rb_str_normalize_ospath(path, strlen(path)); cwd = rb_str_normalize_ospath(path, strlen(path));
OBJ_TAINT(cwd); OBJ_TAINT(cwd);
#else #else
@ -1107,6 +1105,7 @@ rb_dir_getwd_ospath(void)
xfree(path); xfree(path);
return cwd; return cwd;
} }
#endif
VALUE VALUE
rb_dir_getwd(void) rb_dir_getwd(void)

View file

@ -4656,7 +4656,7 @@ clock_getres(clockid_t clock_id, struct timespec *sp)
/* License: Ruby's */ /* License: Ruby's */
static char * static char *
w32_getcwd(char *buffer, int size, UINT cp) w32_getcwd(char *buffer, int size, UINT cp, void *alloc(int, void *), void *arg)
{ {
WCHAR *p; WCHAR *p;
int wlen, len; int wlen, len;
@ -4687,7 +4687,7 @@ w32_getcwd(char *buffer, int size, UINT cp)
} }
} }
else { else {
buffer = malloc(len); buffer = (*alloc)(len, arg);
if (!buffer) { if (!buffer) {
errno = ENOMEM; errno = ENOMEM;
return NULL; return NULL;
@ -4698,18 +4698,43 @@ w32_getcwd(char *buffer, int size, UINT cp)
return buffer; return buffer;
} }
/* License: Ruby's */
static void *
getcwd_alloc(int size, void *dummy)
{
return malloc(size);
}
/* License: Ruby's */ /* License: Ruby's */
char * char *
rb_w32_getcwd(char *buffer, int size) rb_w32_getcwd(char *buffer, int size)
{ {
return w32_getcwd(buffer, size, filecp()); return w32_getcwd(buffer, size, filecp(), getcwd_alloc, NULL);
} }
/* License: Ruby's */ /* License: Ruby's */
char * char *
rb_w32_ugetcwd(char *buffer, int size) rb_w32_ugetcwd(char *buffer, int size)
{ {
return w32_getcwd(buffer, size, CP_UTF8); return w32_getcwd(buffer, size, CP_UTF8, getcwd_alloc, NULL);
}
/* License: Ruby's */
static void *
getcwd_value(int size, void *arg)
{
VALUE str = *(VALUE *)arg = rb_utf8_str_new(0, size - 1);
OBJ_TAINT(str);
return RSTRING_PTR(str);
}
/* License: Ruby's */
VALUE
rb_dir_getwd_ospath(void)
{
VALUE cwd = Qnil;
w32_getcwd(NULL, 0, CP_UTF8, getcwd_value, &cwd);
return cwd;
} }
/* License: Artistic or GPL */ /* License: Artistic or GPL */