From 4c4d155e3d8861d2e85078d0d21305a26ee69a18 Mon Sep 17 00:00:00 2001 From: ocean Date: Mon, 12 Apr 2004 01:45:27 +0000 Subject: [PATCH] * dir.c (rb_glob2, rb_glob, push_globs, push_braces, rb_push_glob): fix memory leak to occur when block is interrupted in Dir.glob. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ dir.c | 33 ++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index ced1a5d797..f1e50892ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Apr 12 10:39:50 Hirokazu Yamamoto + + * dir.c (rb_glob2, rb_glob, push_globs, push_braces, rb_push_glob): + fix memory leak to occur when block is interrupted in Dir.glob. + Sun Apr 11 19:10:13 2004 Nobuyoshi Nakada * ruby.c (require_libraries): restore source file/line after diff --git a/dir.c b/dir.c index 80411ccb87..2b9e4d194a 100644 --- a/dir.c +++ b/dir.c @@ -1325,7 +1325,7 @@ glob_helper(path, dirsep, exist, isdir, beg, end, flags, func, arg) return status; } -static void +static int rb_glob2(path, flags, func, arg) const char *path; int flags; @@ -1362,7 +1362,7 @@ rb_glob2(path, flags, func, arg) free(buf); - if (status) rb_jump_tag(status); + return status; } void @@ -1371,7 +1371,9 @@ rb_glob(path, func, arg) void (*func) _((const char*, VALUE)); VALUE arg; { - rb_glob2(path, 0, func, arg); + int status = rb_glob2(path, 0, func, arg); + + if (status) rb_jump_tag(status); } static void @@ -1389,16 +1391,16 @@ push_pattern(path, ary) } } -static void +static int push_globs(ary, s, flags) VALUE ary; const char *s; int flags; { - rb_glob2(s, flags, push_pattern, ary); + return rb_glob2(s, flags, push_pattern, ary); } -static void +static int push_braces(ary, s, flags) VALUE ary; const char *s; @@ -1408,6 +1410,7 @@ push_braces(ary, s, flags) const char *p, *t; const char *lbrace, *rbrace; int nest = 0; + int status = 0; p = s; lbrace = rbrace = 0; @@ -1441,13 +1444,16 @@ push_braces(ary, s, flags) } memcpy(b, t, p-t); strcpy(b+(p-t), Next(rbrace)); - push_braces(ary, buf, flags); + status = push_braces(ary, buf, flags); + if (status) break; } free(buf); } else { - push_globs(ary, s, flags); + status = push_globs(ary, s, flags); } + + return status; } #define isdelim(c) ((c)=='\0') @@ -1460,6 +1466,7 @@ rb_push_glob(str, flags) char *buf; const char *t; int nest, maxnest; + int status = 0; int escape = !(flags & FNM_NOESCAPE); VALUE ary; @@ -1485,20 +1492,24 @@ rb_push_glob(str, flags) p++; if (p == pend || isdelim(*p)) break; } - p = Next(p); + Inc(p); } memcpy(buf, t, p - t); buf[p - t] = '\0'; if (maxnest == 0) { - push_globs(ary, buf, flags); + status = push_globs(ary, buf, flags); + if (status) break; } else if (nest == 0) { - push_braces(ary, buf, flags); + status = push_braces(ary, buf, flags); + if (status) break; } /* else unmatched braces */ } free(buf); + if (status) rb_jump_tag(status); + return ary; }