summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--dir.c35
2 files changed, 29 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 573b0466a9..b75a2fbb01 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Apr 12 10:43:47 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
+
+ * 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.
+
Mon Apr 12 10:27:37 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
* bcc32/Makefile.sub: backport SIZEOF_TIME_T definition from 1.9.
diff --git a/dir.c b/dir.c
index efd8f4587d..88fab2b48d 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;
}