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

ruby-changes:63473

From: Jeremy <ko1@a...>
Date: Fri, 30 Oct 2020 00:09:12 +0900 (JST)
Subject: [ruby-changes:63473] c0aeb98aa9 (master): Make ENV.replace handle multiple environ entries with the same key

https://git.ruby-lang.org/ruby.git/commit/?id=c0aeb98aa9

From c0aeb98aa903334f06758d39c772cb22440d8a4e Mon Sep 17 00:00:00 2001
From: Jeremy Evans <code@j...>
Date: Wed, 28 Oct 2020 15:17:49 -0700
Subject: Make ENV.replace handle multiple environ entries with the same key

While it is expected that all environment keys are unique, that is
not enforced. It is possible by manipulating environ directly you
can call a process with an environment with duplicate keys.  If
ENV.replace was passed a hash with a key where environ had a
duplicate for that key, ENV.replace would end up deleting the key
from environ.

The fix in this case is to not assume that the environment key
list has unique keys, and continue processing the entire key
list in keylist_delete.

Fixes [Bug #17254]

diff --git a/hash.c b/hash.c
index a8d6978..e0f8773 100644
--- a/hash.c
+++ b/hash.c
@@ -6448,13 +6448,16 @@ keylist_delete(VALUE keys, VALUE key) https://github.com/ruby/ruby/blob/trunk/hash.c#L6448
     long keylen, elen;
     const char *keyptr, *eptr;
     RSTRING_GETMEM(key, keyptr, keylen);
+    /* Don't stop at first key, as it is possible to have
+       multiple environment values with the same key.
+    */
     for (long i=0; i<RARRAY_LEN(keys); i++) {
         VALUE e = RARRAY_AREF(keys, i);
         RSTRING_GETMEM(e, eptr, elen);
         if (elen != keylen) continue;
         if (!ENVNMATCH(keyptr, eptr, elen)) continue;
         rb_ary_delete_at(keys, i);
-        return;
+        i--;
     }
 }
 
-- 
cgit v0.10.2


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

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