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

* 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/trunk@12847 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2007-07-26 04:38:07 +00:00
parent bd65920c0b
commit ea7e249079
4 changed files with 129 additions and 126 deletions

View file

@ -1,3 +1,15 @@
Thu Jul 26 13:37:47 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.
Tue Jul 24 10:37:04 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* io.c (rb_f_p): return nil if no argument. [ruby-dev:31285]

26
dln.c
View file

@ -1600,32 +1600,6 @@ dln_find_file(const char *fname, const char *path)
#endif
}
#if defined(__CYGWIN32__)
const char *
conv_to_posix_path(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 *

211
ruby.c
View file

@ -14,6 +14,7 @@
#ifdef __CYGWIN__
#include <windows.h>
#include <sys/cygwin.h>
#endif
#ifdef _WIN32_WCE
#include <winsock.h>
@ -114,107 +115,133 @@ usage(const char *name)
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(const 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
static void
push_include(const char *path, VALUE (*filter)(VALUE))
{
const char sep = PATH_SEP_CHAR;
const char *p, *s;
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, (*filter)(rubylib_mangled_path(p, s - p)));
p = s;
}
}
#ifdef __CYGWIN__
static void
push_include_cygwin(const char *path, VALUE (*filter)(VALUE))
{
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_str_resize(buf, len);
p = strncpy(RSTRING_PTR(buf), p, len);
}
}
if (cygwin_conv_to_posix_path(p, rubylib) == 0)
p = rubylib;
push_include(p, filter);
if (!*s) break;
p = s + 1;
}
}
#define push_include push_include_cygwin
#endif
void
ruby_push_include(const char *path, VALUE (*filter) (VALUE))
ruby_push_include(const char *path, VALUE (*filter)(VALUE))
{
const char sep = PATH_SEP_CHAR;
if (path == 0)
return;
#if defined(__CYGWIN__)
{
char rubylib[FILENAME_MAX];
conv_to_posix_path(path, rubylib, FILENAME_MAX);
path = rubylib;
}
#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,
(*filter) (rubylib_mangled_path
(p, (int)(s - p))));
p = s + 1;
}
else {
rb_ary_push(ary, (*filter) (rubylib_mangled_path2(p)));
break;
}
}
rb_ary_concat(rb_load_path, ary);
}
else {
rb_ary_push(rb_load_path, (*filter) (rubylib_mangled_path2(path)));
}
push_include(path, filter);
}
static VALUE
@ -223,7 +250,7 @@ identical_path(VALUE path)
return path;
}
void
void
ruby_incpush(const char *path)
{
ruby_push_include(path, identical_path);
@ -240,7 +267,6 @@ expand_include_path(VALUE path)
return rb_file_expand_path(path, Qnil);
}
void
ruby_incpush_expand(const char *path)
{
@ -251,22 +277,6 @@ ruby_incpush_expand(const char *path)
#define LOAD_RELATIVE 1
#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;
#ifdef CharNext /* defined as CharNext[AW] on Windows. */
p = CharNext(p);
#else
p += mblen(p, RUBY_MBCHAR_MAXSIZE);
#endif
}
}
#endif
#if defined _WIN32 || defined __CYGWIN__
static HMODULE libruby;
@ -300,8 +310,14 @@ ruby_init_loadpath(void)
#endif
libpath[sizeof(libpath) - 1] = '\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) {
@ -322,30 +338,31 @@ ruby_init_loadpath(void)
#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(".");
}
}

View file

@ -1,7 +1,7 @@
#define RUBY_VERSION "1.9.0"
#define RUBY_RELEASE_DATE "2007-07-24"
#define RUBY_RELEASE_DATE "2007-07-26"
#define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20070724
#define RUBY_RELEASE_CODE 20070726
#define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2007
#define RUBY_RELEASE_MONTH 7
#define RUBY_RELEASE_DAY 24
#define RUBY_RELEASE_DAY 26
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];