[前][次][番号順一覧][スレッド一覧]

ruby-changes:48294

From: normal <ko1@a...>
Date: Wed, 25 Oct 2017 08:35:57 +0900 (JST)
Subject: [ruby-changes:48294] normal:r60408 (trunk): file.c: fix possible alignment bugs in r60386

normal	2017-10-25 08:35:52 +0900 (Wed, 25 Oct 2017)

  New Revision: 60408

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=60408

  Log:
    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]

  Modified files:
    trunk/file.c
Index: file.c
===================================================================
--- file.c	(revision 60407)
+++ file.c	(revision 60408)
@@ -349,16 +349,18 @@ ignored_char_p(const char *p, const char https://github.com/ruby/ruby/blob/trunk/file.c#L349
 
 #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 https://github.com/ruby/ruby/blob/trunk/file.c#L386
 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 *, vo https://github.com/ruby/ruby/blob/trunk/file.c#L395
     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 *, vo https://github.com/ruby/ruby/blob/trunk/file.c#L415
     if (v) {
 	ALLOCV_END(v);
     }
-    if (tmp != Qfalse) {
-	rb_ary_clear(tmp);
-	rb_gc_force_recycle(tmp);
-    }
     return LONG2FIX(argc);
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]