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:
parent
bd65920c0b
commit
ea7e249079
4 changed files with 129 additions and 126 deletions
12
ChangeLog
12
ChangeLog
|
@ -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
26
dln.c
|
@ -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
211
ruby.c
|
@ -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(".");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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[];
|
||||
|
|
Loading…
Reference in a new issue