diff --git a/Dockerfile b/Dockerfile index 41598bb..ad6c5be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,8 @@ ARG RUBY_VERSION ENV RUBY_VERSION=${RUBY_VERSION} +COPY patches/ /tmp/ruby-patches/ + # Installs system dependencies required to run Ruby RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/cache/debconf,sharing=locked \ @@ -74,10 +76,15 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ cd / && rm -fr /src; \ export RUSTUP_HOME='/tmp/rust/rustup' CARGO_HOME='/tmp/rust/cargo';\ export PATH="$CARGO_HOME/bin:$PATH"; \ - CONFIGURE_OPTS="--disable-install-doc --enable-yjit" ruby-build ${RUBY_VERSION} /usr/local; \ + # Backport ruby/ruby#16801 to the 3.4 release line + case "${RUBY_VERSION}" in \ + 3.4.*) CONFIGURE_OPTS="--disable-install-doc --enable-yjit" ruby-build --patch ${RUBY_VERSION} /usr/local < /tmp/ruby-patches/ruby-16801.patch ;; \ + *) CONFIGURE_OPTS="--disable-install-doc --enable-yjit" ruby-build ${RUBY_VERSION} /usr/local ;; \ + esac; \ # Cleanup build dependencies rm -rf /tmp/rust; \ rm -rf /usr/local/bin/ruby-build; \ + rm -rf /tmp/ruby-patches; \ rm -rf /var/lib/apt/lists/*; \ apt-mark auto '.*' > /dev/null; \ apt-mark manual $savedAptMark > /dev/null; \ diff --git a/patches/ruby-16801.patch b/patches/ruby-16801.patch new file mode 100644 index 0000000..58506eb --- /dev/null +++ b/patches/ruby-16801.patch @@ -0,0 +1,45 @@ +Backport ruby/ruby#16801 +https://github.com/ruby/ruby/commit/493d26dcdea8b2f0ac5d28e057b401bc809e7fae + +--- a/include/ruby/onigmo.h ++++ b/include/ruby/onigmo.h +@@ -687,6 +687,8 @@ + #define ONIGERR_NEVER_ENDING_RECURSION -221 + #define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222 + #define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223 ++#define ONIGERR_TOO_MANY_RANGE_REPEAT -224 ++#define ONIGERR_TOO_MANY_NULL_CHECK -225 + #define ONIGERR_INVALID_CODE_POINT_VALUE -400 + #define ONIGERR_INVALID_WIDE_CHAR_VALUE -400 + #define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401 +--- a/regcomp.c ++++ b/regcomp.c +@@ -394,6 +394,7 @@ + r = add_mem_num(reg, reg->num_null_check); /* NULL CHECK ID */ + if (r) return r; + reg->num_null_check++; ++ if ((MemNumType)reg->num_null_check <= 0) return ONIGERR_TOO_MANY_NULL_CHECK; + } + + r = compile_tree(node, reg); +@@ -703,6 +704,7 @@ + if (r) return r; + r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */ + reg->num_repeat++; ++ if ((MemNumType)reg->num_repeat <= 0) return ONIGERR_TOO_MANY_RANGE_REPEAT; + if (r) return r; + r = add_rel_addr(reg, target_len + SIZE_OP_REPEAT_INC); + if (r) return r; +--- a/regerror.c ++++ b/regerror.c +@@ -165,6 +165,10 @@ + p = "group number is too big for capture history"; break; + case ONIGERR_INVALID_CHAR_PROPERTY_NAME: + p = "invalid character property name {%n}"; break; ++ case ONIGERR_TOO_MANY_RANGE_REPEAT: ++ p = "too many range repeat"; break; ++ case ONIGERR_TOO_MANY_NULL_CHECK: ++ p = "too many null check"; break; + case ONIGERR_TOO_MANY_CAPTURE_GROUPS: + p = "too many capture groups are specified"; break; + case ONIGERR_INVALID_CODE_POINT_VALUE: