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
commit2bf168affcb2b893697623d44c328730ed891e0b (patch)
tree6595688d14677380ad454914ebac05b3b7f94743 /dir.c
parent3463a11129c7f5ecd17052b152ed88214fb88e00 (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/branches/ruby_1_8@6141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/dir.c b/dir.c
index efd8f45..88fab2b 100644
--- a/dir.c
+++ b/dir.c
@@ -1053,7 +1053,7 @@ glob_helper(path, sub, flags, func, arg)
return status;
}
-static void
+static int
rb_glob2(path, flags, func, arg)
const char *path;
int flags;
@@ -1067,7 +1067,7 @@ rb_glob2(path, flags, func, arg)
strcpy(buf, path);
status = glob_helper(buf, 0, flags, func, arg);
free(buf);
- if (status) rb_jump_tag(status);
+ return status;
}
void
@@ -1076,7 +1076,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);
}
void
@@ -1085,7 +1087,9 @@ rb_globi(path, func, arg)
void (*func) _((const char*, VALUE));
VALUE arg;
{
- rb_glob2(path, FNM_CASEFOLD, func, arg);
+ int status = rb_glob2(path, FNM_CASEFOLD, func, arg);
+
+ if (status) rb_jump_tag(status);
}
static void
@@ -1103,16 +1107,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;
@@ -1122,6 +1126,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;
@@ -1155,13 +1160,16 @@ push_braces(ary, s, flags)
}
memcpy(b, t, p-t);
strcpy(b+(p-t), rbrace+1);
- 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')
@@ -1175,6 +1183,7 @@ rb_push_glob(str, flags)
char *buf;
char *t;
int nest, maxnest;
+ int status = 0;
int noescape = flags & FNM_NOESCAPE;
VALUE ary;
@@ -1204,15 +1213,19 @@ rb_push_glob(str, flags)
}
*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;
}