summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--dln.c29
-rw-r--r--ruby.c202
-rw-r--r--version.h2
4 files changed, 126 insertions, 119 deletions
diff --git a/ChangeLog b/ChangeLog
index b2431d73e7..7119cb8c96 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Wed Aug 22 11:41:44 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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.
+
Wed Aug 22 11:39:31 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* intern.h (is_ruby_native_thread): removed since declared as an int
diff --git a/dln.c b/dln.c
index b405da6bff..9fd605e32e 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 39b209d9e4..5d544e7cad 100644
--- a/ruby.c
+++ b/ruby.c
@@ -15,6 +15,9 @@
#if defined _WIN32 || defined __CYGWIN__
#include <windows.h>
#endif
+#if defined __CYGWIN__
+#include <sys/cygwin.h>
+#endif
#ifdef _WIN32_WCE
#include <winsock.h>
#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 62c7d96a60..0cdfbcd598 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
#define RUBY_RELEASE_DATE "2007-08-22"
#define RUBY_VERSION_CODE 186
#define RUBY_RELEASE_CODE 20070822
-#define RUBY_PATCHLEVEL 78
+#define RUBY_PATCHLEVEL 79
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8