From bc97a5086051b9cc8319e73c2977341772fbc6da Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 15 Aug 2007 22:53:15 +0000 Subject: * dln.c (conv_to_posix_path): removed. * ruby.c (rubylib_mangled_path, rubylib_mangled_path2): return VALUE instead of a pointer to static buffer. * ruby.c (push_include_cygwin): fixed buffer overflow. [ruby-dev:31297] * ruby.c (ruby_init_loadpath): not convert built-in paths. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_5@13040 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 12 ++++ dln.c | 29 --------- ruby.c | 202 +++++++++++++++++++++++++++++++++++--------------------------- version.h | 2 +- 4 files changed, 126 insertions(+), 119 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b358464ad..6286aec2c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Thu Aug 16 07:52:24 2007 Nobuyoshi Nakada + + * dln.c (conv_to_posix_path): removed. + + * ruby.c (rubylib_mangled_path, rubylib_mangled_path2): return + VALUE instead of a pointer to static buffer. + + * ruby.c (push_include_cygwin): fixed buffer overflow. + [ruby-dev:31297] + + * ruby.c (ruby_init_loadpath): not convert built-in paths. + Thu Aug 16 07:51:37 2007 Akinori MUSHA * defines.h: Pull the RUBY_MBCHAR_MAXSIZE definition from trunk, diff --git a/dln.c b/dln.c index 016d0c12a2..fd59bdab8e 100644 --- a/dln.c +++ b/dln.c @@ -1676,35 +1676,6 @@ dln_find_file(fname, path) #endif } -#if defined(__CYGWIN32__) -const char * -conv_to_posix_path(win32, posix, len) - char *win32; - char *posix; - int len; -{ - char *first = win32; - char *p = win32; - char *dst = posix; - - posix[0] = '\0'; - for (p = win32; *p; p++) - if (*p == ';') { - *p = 0; - cygwin32_conv_to_posix_path(first, posix); - posix += strlen(posix); - *posix++ = ':'; - first = p + 1; - *p = ';'; - } - if (len < strlen(first)) - fprintf(stderr, "PATH length too long: %s\n", first); - else - cygwin32_conv_to_posix_path(first, posix); - return dst; -} -#endif - static char fbuf[MAXPATHLEN]; static char * diff --git a/ruby.c b/ruby.c index 9aa062a0f2..51d8a7c845 100644 --- a/ruby.c +++ b/ruby.c @@ -15,6 +15,9 @@ #if defined _WIN32 || defined __CYGWIN__ #include #endif +#if defined __CYGWIN__ +#include +#endif #ifdef _WIN32_WCE #include #include "wince.h" @@ -109,127 +112,141 @@ NULL extern VALUE rb_load_path; -#define STATIC_FILE_LENGTH 255 +#ifndef CharNext /* defined as CharNext[AW] on Windows. */ +#define CharNext(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) +#endif + +#if defined DOSISH || defined __CYGWIN__ +static inline void +translate_char(char *p, int from, int to) +{ + while (*p) { + if ((unsigned char)*p == from) + *p = to; + p = CharNext(p); + } +} +#endif #if defined _WIN32 || defined __CYGWIN__ || defined __DJGPP__ -static char * -rubylib_mangle(s, l) - char *s; - unsigned int l; +static VALUE +rubylib_mangled_path(const char *s, unsigned int l) { static char *newp, *oldp; static int newl, oldl, notfound; - static char newsub[STATIC_FILE_LENGTH+1]; + char *ptr; + VALUE ret; if (!newp && !notfound) { newp = getenv("RUBYLIB_PREFIX"); if (newp) { - char *s; - - oldp = newp; + oldp = newp = strdup(newp); while (*newp && !ISSPACE(*newp) && *newp != ';') { - newp++; oldl++; /* Skip digits. */ + newp = CharNext(newp); /* Skip digits. */ } + oldl = newp - oldp; while (*newp && (ISSPACE(*newp) || *newp == ';')) { - newp++; /* Skip whitespace. */ + newp = CharNext(newp); /* Skip whitespace. */ } newl = strlen(newp); - if (newl == 0 || oldl == 0 || newl > STATIC_FILE_LENGTH) { + if (newl == 0 || oldl == 0) { rb_fatal("malformed RUBYLIB_PREFIX"); } - strcpy(newsub, newp); - s = newsub; - while (*s) { - if (*s == '\\') *s = '/'; - s++; - } + translate_char(newp, '\\', '/'); } else { notfound = 1; } } - if (l == 0) { - l = strlen(s); - } if (!newp || l < oldl || strncasecmp(oldp, s, oldl) != 0) { - static char ret[STATIC_FILE_LENGTH+1]; - strncpy(ret, s, l); - ret[l] = 0; - return ret; + return rb_str_new(s, l); } - if (l + newl - oldl > STATIC_FILE_LENGTH || newl > STATIC_FILE_LENGTH) { - rb_fatal("malformed RUBYLIB_PREFIX"); - } - strcpy(newsub + newl, s + oldl); - newsub[l + newl - oldl] = 0; - return newsub; + ret = rb_str_new(0, l + newl - oldl); + ptr = RSTRING_PTR(ret); + memcpy(ptr, newp, newl); + memcpy(ptr + newl, s + oldl, l - oldl); + ptr[l + newl - oldl] = 0; + return ret; +} + +static VALUE +rubylib_mangled_path2(const char *s) +{ + return rubylib_mangled_path(s, strlen(s)); } -#define rubylib_mangled_path(s, l) rb_str_new2(rubylib_mangle((s), (l))) -#define rubylib_mangled_path2(s) rb_str_new2(rubylib_mangle((s), 0)) #else -#define rubylib_mangled_path(s, l) rb_str_new((s), (l)) -#define rubylib_mangled_path2(s) rb_str_new2(s) +#define rubylib_mangled_path rb_str_new +#define rubylib_mangled_path2 rb_str_new2 #endif -void -ruby_incpush(path) +static void push_include _((const char *path)); + +static void +push_include(path) const char *path; { const char sep = PATH_SEP_CHAR; + const char *p, *s; - if (path == 0) return; -#if defined(__CYGWIN__) - { - char rubylib[FILENAME_MAX]; - conv_to_posix_path(path, rubylib, FILENAME_MAX); - path = rubylib; + p = path; + while (*p) { + while (*p == sep) + p++; + if (!*p) break; + for (s = p; *s && *s != sep; s = CharNext(s)); + rb_ary_push(rb_load_path, rubylib_mangled_path(p, s - p)); + p = s; } -#endif - if (strchr(path, sep)) { - const char *p, *s; - VALUE ary = rb_ary_new(); - - p = path; - while (*p) { - while (*p == sep) p++; - if ((s = strchr(p, sep)) != 0) { - rb_ary_push(ary, rubylib_mangled_path(p, (int)(s-p))); - p = s + 1; +} + +#ifdef __CYGWIN__ +static void +push_include_cygwin(const char *path) +{ + const char *p, *s; + char rubylib[FILENAME_MAX]; + VALUE buf = 0; + + p = path; + while (*p) { + unsigned int len; + while (*p == ';') + p++; + if (!*p) break; + for (s = p; *s && *s != ';'; s = CharNext(s)); + len = s - p; + if (*s) { + if (!buf) { + buf = rb_str_new(p, len); + p = RSTRING_PTR(buf); } else { - rb_ary_push(ary, rubylib_mangled_path2(p)); - break; + rb_str_resize(buf, len); + p = strncpy(RSTRING_PTR(buf), p, len); } } - rb_ary_concat(rb_load_path, ary); - } - else { - rb_ary_push(rb_load_path, rubylib_mangled_path2(path)); + if (cygwin_conv_to_posix_path(p, rubylib) == 0) + p = rubylib; + push_include(p); + if (!*s) break; + p = s + 1; } } -#if defined DOSISH || defined __CYGWIN__ -#define LOAD_RELATIVE 1 +#define push_include push_include_cygwin #endif -#if defined DOSISH || defined __CYGWIN__ -static inline void translate_char _((char *, int, int)); - -static inline void -translate_char(p, from, to) - char *p; - int from, to; +void +ruby_incpush(path) + const char *path; { - while (*p) { - if ((unsigned char)*p == from) - *p = to; -#ifdef CharNext /* defined as CharNext[AW] on Windows. */ - p = CharNext(p); -#else - p += mblen(p, MB_CUR_MAX); -#endif - } + if (path == 0) + return; + push_include(path); } + +#if defined DOSISH || defined __CYGWIN__ +#define LOAD_RELATIVE 1 #endif void @@ -260,13 +277,19 @@ ruby_init_loadpath() #endif libpath[FILENAME_MAX] = '\0'; -#if defined DOSISH || defined __CYGWIN__ +#if defined DOSISH translate_char(libpath, '\\', '/'); +#elif defined __CYGWIN__ + { + char rubylib[FILENAME_MAX]; + cygwin_conv_to_posix_path(libpath, rubylib); + strncpy(libpath, rubylib, sizeof(libpath)); + } #endif p = strrchr(libpath, '/'); if (p) { *p = 0; - if (p-libpath > 3 && !strcasecmp(p-4, "/bin")) { + if (p - libpath > 3 && !strcasecmp(p - 4, "/bin")) { p -= 4; *p = 0; } @@ -282,30 +305,31 @@ ruby_init_loadpath() #else #define RUBY_RELATIVE(path) (path) #endif +#define incpush(path) rb_ary_push(rb_load_path, rubylib_mangled_path2(path)) if (rb_safe_level() == 0) { ruby_incpush(getenv("RUBYLIB")); } #ifdef RUBY_SEARCH_PATH - ruby_incpush(RUBY_RELATIVE(RUBY_SEARCH_PATH)); + incpush(RUBY_RELATIVE(RUBY_SEARCH_PATH)); #endif - ruby_incpush(RUBY_RELATIVE(RUBY_SITE_LIB2)); + incpush(RUBY_RELATIVE(RUBY_SITE_LIB2)); #ifdef RUBY_SITE_THIN_ARCHLIB - ruby_incpush(RUBY_RELATIVE(RUBY_SITE_THIN_ARCHLIB)); + incpush(RUBY_RELATIVE(RUBY_SITE_THIN_ARCHLIB)); #endif - ruby_incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB)); - ruby_incpush(RUBY_RELATIVE(RUBY_SITE_LIB)); + incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB)); + incpush(RUBY_RELATIVE(RUBY_SITE_LIB)); - ruby_incpush(RUBY_RELATIVE(RUBY_LIB)); + incpush(RUBY_RELATIVE(RUBY_LIB)); #ifdef RUBY_THIN_ARCHLIB - ruby_incpush(RUBY_RELATIVE(RUBY_THIN_ARCHLIB)); + incpush(RUBY_RELATIVE(RUBY_THIN_ARCHLIB)); #endif - ruby_incpush(RUBY_RELATIVE(RUBY_ARCHLIB)); + incpush(RUBY_RELATIVE(RUBY_ARCHLIB)); if (rb_safe_level() == 0) { - ruby_incpush("."); + incpush("."); } } diff --git a/version.h b/version.h index 3d1da5b528..097c86a7da 100644 --- a/version.h +++ b/version.h @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2007-08-16" #define RUBY_VERSION_CODE 185 #define RUBY_RELEASE_CODE 20070816 -#define RUBY_PATCHLEVEL 88 +#define RUBY_PATCHLEVEL 89 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 -- cgit v1.2.3