[前][次][番号順一覧][スレッド一覧]

ruby-changes:1713

From: ko1@a...
Date: 22 Aug 2007 11:46:21 +0900
Subject: [ruby-changes:1713] shyouhei - Ruby:r13204 (ruby_1_8_6): * dln.c (conv_to_posix_path): removed.

shyouhei	2007-08-22 11:46:14 +0900 (Wed, 22 Aug 2007)

  New Revision: 13204

  Modified files:
    branches/ruby_1_8_6/ChangeLog
    branches/ruby_1_8_6/dln.c
    branches/ruby_1_8_6/ruby.c
    branches/ruby_1_8_6/version.h

  Log:
    * 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.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=13204&r2=13203
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=13204&r2=13203
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ruby.c?r1=13204&r2=13203
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/dln.c?r1=13204&r2=13203

Index: ruby_1_8_6/dln.c
===================================================================
--- ruby_1_8_6/dln.c	(revision 13203)
+++ ruby_1_8_6/dln.c	(revision 13204)
@@ -1676,35 +1676,6 @@
 #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 *
Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 13203)
+++ ruby_1_8_6/ChangeLog	(revision 13204)
@@ -1,3 +1,15 @@
+Wed Aug 22 11:41:44 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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@r...>
 
 	* intern.h (is_ruby_native_thread): removed since declared as an int
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 13203)
+++ ruby_1_8_6/version.h	(revision 13204)
@@ -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
Index: ruby_1_8_6/ruby.c
===================================================================
--- ruby_1_8_6/ruby.c	(revision 13203)
+++ ruby_1_8_6/ruby.c	(revision 13204)
@@ -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 @@
 
 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;
 }
-#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))
+
+static VALUE
+rubylib_mangled_path2(const char *s)
+{
+    return rubylib_mangled_path(s, strlen(s));
+}
 #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);
+	if (cygwin_conv_to_posix_path(p, rubylib) == 0)
+	    p = rubylib;
+	push_include(p);
+	if (!*s) break;
+	p = s + 1;
     }
-    else {
-	rb_ary_push(rb_load_path, rubylib_mangled_path2(path));
-    }
 }
 
-#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 @@
 #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 @@
 #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(".");
     }
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧]