diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-09-09 06:18:14 +0000 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-09-09 06:18:14 +0000 |
commit | ee8cd5c2f53b73410e492dd299f8b946b07e1806 (patch) | |
tree | 396d89bafd412b5e33982912cb3cb30a3111aa3a | |
parent | 4a3fb555bd3f8141225a2b5e40f2a5fd7d9484ec (diff) | |
download | packages-ee8cd5c2f53b73410e492dd299f8b946b07e1806.tar.gz packages-ee8cd5c2f53b73410e492dd299f8b946b07e1806.tar.bz2 packages-ee8cd5c2f53b73410e492dd299f8b946b07e1806.tar.xz packages-ee8cd5c2f53b73410e492dd299f8b946b07e1806.zip |
system/ruby: libedit compatibility patch [read:]
Ruby pretends editline (libedit) is readline. This is normally fine.
However, editline's readline emulation does not account for changes to
rl_instream or rl_outstream. If a Ruby application using the Readline
extension changes .input or .output, this will cause a use-after-free:
==32694== Invalid read of size 4
==32694== at 0x4070A38: fwrite (fwrite.c:32)
==32694== by 0x406F707: fputs (fputs.c:7)
==32694== by 0x660EAC7: el_wgets (in /usr/lib/libedit.so.0.0.60)
==32694== by 0x6607BDB: el_gets (in /usr/lib/libedit.so.0.0.60)
==32694== by 0x6620EDB: readline (in /usr/lib/libedit.so.0.0.60)
==32694== by 0x65DE3D3: readline_get (readline.c:346)
==32694== by 0x4DFA49B: rb_protect (eval.c:996)
==32694== by 0x65DE4FF: readline_readline (readline.c:507)
==32694== by 0x4F7AD4B: call_cfunc_m1 (vm_insnhelper.c:1723)
==32694== Address 0x67503dc is 140 bytes inside a block of size 1,264 free'd
==32694== at 0x490AFC0: free (in /usr/lib/valgrind/vgpreload_memcheck-ppc64be-linux.so)
==32694== by 0x406D44F: fclose (fclose.c:35)
==32694== by 0x65DE013: clear_rl_outstream (readline.c:365)
==32694== by 0x65DE0DF: readline_s_set_output (readline.c:599)
==32694== Block was alloc'd at
==32694== at 0x49092C0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-ppc64be-linux.so)
==32694== by 0x406BEC7: fdopen (__fdopen.c:21)
==32694== by 0x65DE103: readline_s_set_output (readline.c:603)
Since rl_instream and rl_outstream are read on each rl_initialize, and
editline's rl_initialize is smart enough to not leak memory if it is
called multiple times during program execution, we use this as a way to
force re-reading of rl_instream and rl_outstream.
I hate this patch; I really do. Better fixes are highly welcome.
-rw-r--r-- | system/ruby/APKBUILD | 6 | ||||
-rw-r--r-- | system/ruby/libedit-compat.patch | 22 |
2 files changed, 26 insertions, 2 deletions
diff --git a/system/ruby/APKBUILD b/system/ruby/APKBUILD index 1a26b65b3..e608e4637 100644 --- a/system/ruby/APKBUILD +++ b/system/ruby/APKBUILD @@ -35,7 +35,7 @@ pkgname=ruby pkgver=2.5.5 _abiver="${pkgver%.*}.0" -pkgrel=1 +pkgrel=2 pkgdesc="An object-oriented language for quick and easy programming" url="https://www.ruby-lang.org/" arch="all" @@ -68,6 +68,7 @@ source="https://cache.ruby-lang.org/pub/ruby/${pkgver%.*}/$pkgname-$pkgver.tar.x rubygems-avoid-platform-specific-gems.patch test_insns-lower-recursion-depth.patch fix-get_main_stack.patch + libedit-compat.patch " replaces="ruby-etc ruby-gems" @@ -309,4 +310,5 @@ _mvgem() { sha512sums="06b1d58536ebfacb7b56c1e6ed4b8ab816fadc4f48c845a452554cd262e7908199a30e5793f3cbaec2db56a8803aa5c6089abf7bf06c8fc47867e97870b7dfec ruby-2.5.5.tar.xz 20e7e5ee9936a93872fe1ad836dd1fde001fe4a0e7ed54c26727ad83da3ceb0e6247681d9dd4f98a69e1b0250703ed8fc682d44075780d5f47faa1d5f58d2bdb rubygems-avoid-platform-specific-gems.patch 814fe6359505b70d8ff680adf22f20a74b4dbd3fecc9a63a6c2456ee9824257815929917b6df5394ed069a6869511b8c6dce5b95b4acbbb7867c1f3a975a0150 test_insns-lower-recursion-depth.patch -e99b36940fa8fdd445d82738c70b8fc042cab042a4662cab156578aad2dac9673a96da22b6676aa36beac08070e92a7798c60d6f36eeb169216c4c51864ce2fe fix-get_main_stack.patch" +e99b36940fa8fdd445d82738c70b8fc042cab042a4662cab156578aad2dac9673a96da22b6676aa36beac08070e92a7798c60d6f36eeb169216c4c51864ce2fe fix-get_main_stack.patch +6b88fccce164db1d8beb16adeffdd7effd077e9842b7f61deddebeb39afcf9b839192b68a43ce66a1ff0c9aeaacc4f13a0ee56184c22e822cd8b10a07a1c87b2 libedit-compat.patch" diff --git a/system/ruby/libedit-compat.patch b/system/ruby/libedit-compat.patch new file mode 100644 index 000000000..601a9feea --- /dev/null +++ b/system/ruby/libedit-compat.patch @@ -0,0 +1,22 @@ +--- ruby-2.5.5/ext/readline/readline.c.old 2017-09-30 08:35:23.000000000 +0000 ++++ ruby-2.5.5/ext/readline/readline.c 2019-09-09 06:12:00.300098741 +0000 +@@ -571,6 +571,9 @@ + rb_syserr_fail(save_errno, "fdopen"); + } + rl_instream = readline_rl_instream = f; ++#ifdef HAVE_EDITLINE_READLINE_H ++ rl_initialize(); ++#endif + readline_instream = input; + } + return input; +@@ -607,6 +610,9 @@ + rb_syserr_fail(save_errno, "fdopen"); + } + rl_outstream = readline_rl_outstream = f; ++#ifdef HAVE_EDITLINE_READLINE_H ++ rl_initialize(); ++#endif + readline_outstream = output; + } + return output; |