aboutsummaryrefslogtreecommitdiffstats
path: root/file.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-24 23:35:52 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-24 23:35:52 +0000
commit63fdcbf996c0bf23554cbb1d113486d76f64d400 (patch)
treef72b7d3eab90b5a79d720854e7e165913750687f /file.c
parent4dbad5f6ff8dcc5ebc727573c755946bda593d9c (diff)
downloadruby-63fdcbf996c0bf23554cbb1d113486d76f64d400.tar.gz
file.c: fix possible alignment bugs in r60386
* file.c (struct apply_filename): split out from struct apply_arg * file.c (apply2files): use offsetof for flex array size calculation * file.c (apply2files): avoid redundant marking with ALLOCV [ruby-core:83535] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60408 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c31
1 files changed, 8 insertions, 23 deletions
diff --git a/file.c b/file.c
index 04e88354b6..4f519c055e 100644
--- a/file.c
+++ b/file.c
@@ -349,16 +349,18 @@ ignored_char_p(const char *p, const char *e, rb_encoding *enc)
#define apply2args(n) (rb_check_arity(argc, n, UNLIMITED_ARGUMENTS), argc-=n)
+struct apply_filename {
+ const char *ptr;
+ VALUE path;
+};
+
struct apply_arg {
int i;
int argc;
int errnum;
int (*func)(const char *, void *);
void *arg;
- struct {
- const char *ptr;
- VALUE path;
- } fn[1]; /* flexible array */
+ struct apply_filename fn[1]; /* flexible array */
};
static void *
@@ -384,9 +386,8 @@ static VALUE
apply2files(int (*func)(const char *, void *), int argc, VALUE *argv, void *arg)
{
VALUE v;
- VALUE tmp = Qfalse;
- size_t size = sizeof(const char *) + sizeof(VALUE);
- const long len = (long)(sizeof(struct apply_arg) + (size * argc) - size);
+ const size_t size = sizeof(struct apply_filename);
+ const long len = (long)(offsetof(struct apply_arg, fn) + (size * argc));
struct apply_arg *aa = ALLOCV(v, len);
aa->errnum = 0;
@@ -394,24 +395,12 @@ apply2files(int (*func)(const char *, void *), int argc, VALUE *argv, void *arg)
aa->arg = arg;
aa->func = func;
- /*
- * aa is on-stack for small argc, we must ensure paths are marked
- * for large argv if aa is on the heap.
- */
- if (v) {
- tmp = rb_ary_tmp_new(argc);
- }
-
for (aa->i = 0; aa->i < argc; aa->i++) {
VALUE path = rb_get_path(argv[aa->i]);
path = rb_str_encode_ospath(path);
aa->fn[aa->i].ptr = RSTRING_PTR(path);
aa->fn[aa->i].path = path;
-
- if (tmp != Qfalse) {
- rb_ary_push(tmp, path);
- }
}
rb_thread_call_without_gvl(no_gvl_apply2files, aa, RUBY_UBF_IO, 0);
@@ -426,10 +415,6 @@ apply2files(int (*func)(const char *, void *), int argc, VALUE *argv, void *arg)
if (v) {
ALLOCV_END(v);
}
- if (tmp != Qfalse) {
- rb_ary_clear(tmp);
- rb_gc_force_recycle(tmp);
- }
return LONG2FIX(argc);
}