summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-04-12 01:45:27 +0000
committerocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-04-12 01:45:27 +0000
commit4c4d155e3d8861d2e85078d0d21305a26ee69a18 (patch)
tree0bd8db1082bc5278e2edb90eb7e93f841d339a06 /dir.c
parentac419876d5740a1887c1d481a3554552db11f100 (diff)
* 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
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c33
1 files changed, 22 insertions, 11 deletions
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;
}