From 12b5b81a975e2190aebe762b10ceadccd439a45a Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 15 Dec 2003 04:07:03 +0000 Subject: * dir.c (check_dirname): check string safety and remove extraneous trailing directory separators. [ruby-dev:22279] * file.c: extern rb_path_next, rb_path_skip_prefix, rb_path_last_separator, rb_path_end. * intern.h: prototypes for rb_path_next, rb_path_skip_prefix, rb_path_last_separator, rb_path_end. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++++++ dir.c | 37 +++++++++++++++++++------------------ file.c | 18 ++++++++++-------- intern.h | 4 ++++ 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5c62a6602d..36910886f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Mon Dec 15 13:06:58 2003 Nobuyoshi Nakada + + * dir.c (check_dirname): check string safety and remove extraneous + trailing directory separators. [ruby-dev:22279] + + * file.c: extern rb_path_next, rb_path_skip_prefix, + rb_path_last_separator, rb_path_end. + + * intern.h: prototypes for rb_path_next, rb_path_skip_prefix, + rb_path_last_separator, rb_path_end. + Mon Dec 15 09:27:46 2003 NAKAMURA Usaku * ext/openssl/ossl_pkcs12.c (ossl_pkcs12_initialize): first argument diff --git a/dir.c b/dir.c index d16e311a11..e1764c7582 100644 --- a/dir.c +++ b/dir.c @@ -87,21 +87,10 @@ char *strchr _((char*,char)); #if defined DOSISH #define isdirsep(c) ((c) == '/' || (c) == '\\') -static const char * -find_dirsep(s) - const char *s; -{ - while (*s) { - if (isdirsep(*s)) - return s; - s = CharNext(s); - } - return 0; -} #else #define isdirsep(c) ((c) == '/') -#define find_dirsep(s) strchr(s, '/') #endif +#define find_dirsep(s) rb_path_next(s) static char * range(pat, test, flags) @@ -509,13 +498,27 @@ dir_s_getwd(dir) return cwd; } +static void check_dirname _((volatile VALUE *)); +static void +check_dirname(dir) + volatile VALUE *dir; +{ + char *path, *pend; + + SafeStringValue(*dir); + rb_secure(2); + path = RSTRING(*dir)->ptr; + if (*(path && pend = rb_path_end(rb_path_skip_prefix(path)))) { + *dir = rb_str_new(path, pend - path); + } +} + static VALUE dir_s_chroot(dir, path) VALUE dir, path; { #if defined(HAVE_CHROOT) && !defined(__CHECKER__) - rb_secure(2); - SafeStringValue(path); + check_dirname(&path); if (chroot(RSTRING(path)->ptr) == -1) rb_sys_fail(RSTRING(path)->ptr); @@ -543,8 +546,7 @@ dir_s_mkdir(argc, argv, obj) mode = 0777; } - SafeStringValue(path); - rb_secure(2); + check_dirname(&path); #ifndef _WIN32 if (mkdir(RSTRING(path)->ptr, mode) == -1) rb_sys_fail(RSTRING(path)->ptr); @@ -560,8 +562,7 @@ static VALUE dir_s_rmdir(obj, dir) VALUE obj, dir; { - SafeStringValue(dir); - rb_secure(2); + check_dirname(&dir); if (rmdir(RSTRING(dir)->ptr) < 0) rb_sys_fail(RSTRING(dir)->ptr); diff --git a/file.c b/file.c index cfa52e76bd..f338db646d 100644 --- a/file.c +++ b/file.c @@ -1459,7 +1459,8 @@ skiproot(path) return (char *)path; } -static inline char * +#define nextdirsep rb_path_next +char * nextdirsep(s) const char *s; { @@ -1469,11 +1470,12 @@ nextdirsep(s) return (char *)s; } -#if defined(DOSISH_UNC) || defined(DOSISH_DRIVE_LETTER) -static inline char * +#define skipprefix rb_path_skip_prefix +char * skipprefix(path) const char *path; { +#if defined(DOSISH_UNC) || defined(DOSISH_DRIVE_LETTER) #ifdef DOSISH_UNC if (isdirsep(path[0]) && isdirsep(path[1])) { if (*(path = nextdirsep(path + 2))) @@ -1484,14 +1486,13 @@ skipprefix(path) #ifdef DOSISH_DRIVE_LETTER if (has_drive_letter(path)) return (char *)(path + 2); +#endif #endif return (char *)path; } -#else -#define skipprefix(path) (path) -#endif -static char * +#define strrdirsep rb_path_last_separator +char * strrdirsep(path) const char *path; { @@ -1510,7 +1511,8 @@ strrdirsep(path) return last; } -static char * +#define chompdirsep rb_path_end +char * chompdirsep(path) const char *path; { diff --git a/intern.h b/intern.h index 3aa96e5816..6cdba0840e 100644 --- a/intern.h +++ b/intern.h @@ -222,6 +222,10 @@ VALUE rb_file_s_expand_path _((int, VALUE *)); void rb_file_const _((const char*, VALUE)); int rb_find_file_ext _((VALUE*, const char* const*)); VALUE rb_find_file _((VALUE)); +char *rb_path_next _((const char *)); +char *rb_path_skip_prefix _((const char *)); +char *rb_path_last_separator _((const char *)); +char *rb_path_end _((const char *)); /* gc.c */ NORETURN(void rb_memerror __((void))); int ruby_stack_check _((void)); -- cgit v1.2.3