- Update patches from 1 - 10 to 1 - 13 - Update of rootfile not required - Changelog of patches 11 Some systems (e.g., macOS) send signals early on in interactive initialization, so readline should retry a failed open of the init file. 12 If a user happens to bind do-lowercase-version to something that isn't a capital letter, so _rl_to_lower doesn't change anything and the result is still bound to do-lowercase-version, readline can recurse infinitely. 13 When readline is accumulating bytes until it reads a complete multibyte character, reading a byte that makes the multibyte character invalid can result in discarding the bytes in the partial character.
Signed-off-by: Adolf Belka adolf.belka@ipfire.org --- lfs/readline | 2 +- src/patches/readline/readline82-011 | 75 +++++++++ src/patches/readline/readline82-012 | 93 +++++++++++ src/patches/readline/readline82-013 | 234 ++++++++++++++++++++++++++++ 4 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 src/patches/readline/readline82-011 create mode 100644 src/patches/readline/readline82-012 create mode 100644 src/patches/readline/readline82-013
diff --git a/lfs/readline b/lfs/readline index 05d140de1..cfe4cbf18 100644 --- a/lfs/readline +++ b/lfs/readline @@ -72,7 +72,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) @$(PREBUILD) @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
- for i in $$(seq 1 10); do \ + for i in $$(seq 1 13); do \ cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/readline/readline82-$$(printf "%03d" "$${i}") || exit 1; \ done
diff --git a/src/patches/readline/readline82-011 b/src/patches/readline/readline82-011 new file mode 100644 index 000000000..3ad7a8ffd --- /dev/null +++ b/src/patches/readline/readline82-011 @@ -0,0 +1,75 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 8.2 +Patch-ID: readline82-011 + +Bug-Reported-by: Grisha Levit grishalevit@gmail.com +Bug-Reference-ID: CAMu=BrqWa_iNkiEwchpFmtrUhFrAanOO8pjy7VCKqRKUvqdsbw@mail.gmail.com +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2024-02/msg00075.html + +Bug-Description: + +Patch (apply with `patch -p0'): + +Some systems (e.g., macOS) send signals early on in interactive initialization, +so readline should retry a failed open of the init file. + +*** ../readline-8.2-patched/bind.c Wed Feb 9 11:02:22 2022 +--- bind.c Tue Apr 23 15:07:13 2024 +*************** +*** 979,987 **** + int i, file; + +! file = -1; +! if (((file = open (filename, O_RDONLY, 0666)) < 0) || (fstat (file, &finfo) < 0)) + { + if (file >= 0) + close (file); + return ((char *)NULL); + } +--- 969,986 ---- + int i, file; + +! file = open (filename, O_RDONLY, 0666); +! /* If the open is interrupted, retry once */ +! if (file < 0 && errno == EINTR) + { ++ RL_CHECK_SIGNALS (); ++ file = open (filename, O_RDONLY, 0666); ++ } ++ ++ if ((file < 0) || (fstat (file, &finfo) < 0)) ++ { ++ i = errno; + if (file >= 0) + close (file); ++ errno = i; + return ((char *)NULL); + } +*************** +*** 992,999 **** +--- 991,1001 ---- + if (file_size != finfo.st_size || file_size + 1 < file_size) + { ++ i = errno; + if (file >= 0) + close (file); + #if defined (EFBIG) + errno = EFBIG; ++ #else ++ errno = i; + #endif + return ((char *)NULL); + +*** ../readline-8.2/patchlevel 2013-11-15 08:11:11.000000000 -0500 +--- patchlevel 2014-03-21 08:28:40.000000000 -0400 +*************** +*** 1,3 **** + # Do not edit -- exists only for use by patch + +! 10 +--- 1,3 ---- + # Do not edit -- exists only for use by patch + +! 11 diff --git a/src/patches/readline/readline82-012 b/src/patches/readline/readline82-012 new file mode 100644 index 000000000..cbcb4cdaf --- /dev/null +++ b/src/patches/readline/readline82-012 @@ -0,0 +1,93 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 8.2 +Patch-ID: readline82-012 + +Bug-Reported-by: Grisha Levit grishalevit@gmail.com +Bug-Reference-ID: CAMu=BroaH+41uumYt89FPqt8Fsatj-d6mZzmPV2HZYjtcbvbvw@mail.gmail.com +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-readline/2023-11/msg00019.html + +Bug-Description: + +If a user happens to bind do-lowercase-version to something that isn't a +capital letter, so _rl_to_lower doesn't change anything and the result is +still bound to do-lowercase-version, readline can recurse infinitely. + +Patch (apply with `patch -p0'): + +*** ../readline-8.2-patched/readline.c Thu Aug 11 18:35:37 2022 +--- readline.c Fri Feb 2 12:05:36 2024 +*************** +*** 900,905 **** + /* Special case rl_do_lowercase_version (). */ + if (func == rl_do_lowercase_version) +! /* Should we do anything special if key == ANYOTHERKEY? */ +! return (_rl_dispatch (_rl_to_lower ((unsigned char)key), map)); + + rl_executing_keymap = map; +--- 912,926 ---- + /* Special case rl_do_lowercase_version (). */ + if (func == rl_do_lowercase_version) +! { +! /* Should we do anything special if key == ANYOTHERKEY? */ +! newkey = _rl_to_lower ((unsigned char)key); +! if (newkey != key) +! return (_rl_dispatch (newkey, map)); +! else +! { +! rl_ding (); /* gentle failure */ +! return 0; +! } +! } + + rl_executing_keymap = map; +*************** +*** 1110,1114 **** + func = m[ANYOTHERKEY].function; + if (type == ISFUNC && func == rl_do_lowercase_version) +! r = _rl_dispatch (_rl_to_lower ((unsigned char)key), map); + else if (type == ISFUNC) + { +--- 1131,1139 ---- + func = m[ANYOTHERKEY].function; + if (type == ISFUNC && func == rl_do_lowercase_version) +! { +! int newkey = _rl_to_lower ((unsigned char)key); +! /* check that there is actually a lowercase version to avoid infinite recursion */ +! r = (newkey != key) ? _rl_dispatch (newkey, map) : 1; +! } + else if (type == ISFUNC) + { + +*** ../readline-8.2-patched/isearch.c Thu Aug 11 18:35:37 2022 +--- isearch.c Fri Feb 2 12:05:36 2024 +*************** +*** 429,433 **** + f = cxt->keymap[c].function; + if (f == rl_do_lowercase_version) +! f = cxt->keymap[_rl_to_lower (c)].function; + } + +--- 431,439 ---- + f = cxt->keymap[c].function; + if (f == rl_do_lowercase_version) +! { +! f = cxt->keymap[_rl_to_lower (c)].function; +! if (f == rl_do_lowercase_version) +! f = rl_insert; +! } + } + + +*** ../readline-8.2/patchlevel 2013-11-15 08:11:11.000000000 -0500 +--- patchlevel 2014-03-21 08:28:40.000000000 -0400 +*************** +*** 1,3 **** + # Do not edit -- exists only for use by patch + +! 11 +--- 1,3 ---- + # Do not edit -- exists only for use by patch + +! 12 diff --git a/src/patches/readline/readline82-013 b/src/patches/readline/readline82-013 new file mode 100644 index 000000000..cb4164fbe --- /dev/null +++ b/src/patches/readline/readline82-013 @@ -0,0 +1,234 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 8.2 +Patch-ID: readline82-013 + +Bug-Reported-by: Grisha Levit grishalevit@gmail.com +Bug-Reference-ID: <CAMu=Brrv5qKY6LPfw8PxqNXNO8rNsZo0Fb=BcFb-uHObWPqnrw@mail.gmail. +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2023-04/msg00082.html + +Bug-Description: + +When readline is accumulating bytes until it reads a complete multibyte +character, reading a byte that makes the multibyte character invalid can +result in discarding the bytes in the partial character. + +Patch (apply with `patch -p0'): + +*** ../readline-8.2-patched/text.c Mon May 1 09:37:52 2023 +--- text.c Mon May 29 12:22:29 2023 +*************** +*** 86,90 **** + rl_insert_text (const char *string) + { +! register int i, l; + + l = (string && *string) ? strlen (string) : 0; +--- 86,91 ---- + rl_insert_text (const char *string) + { +! register int i; +! size_t l; + + l = (string && *string) ? strlen (string) : 0; +*************** +*** 705,709 **** + /* Insert the character C at the current location, moving point forward. + If C introduces a multibyte sequence, we read the whole sequence and +! then insert the multibyte char into the line buffer. */ + int + _rl_insert_char (int count, int c) +--- 706,714 ---- + /* Insert the character C at the current location, moving point forward. + If C introduces a multibyte sequence, we read the whole sequence and +! then insert the multibyte char into the line buffer. +! If C == 0, we immediately insert any pending partial multibyte character, +! assuming that we have read a character that doesn't map to self-insert. +! This doesn't completely handle characters that are part of a multibyte +! character but map to editing functions. */ + int + _rl_insert_char (int count, int c) +*************** +*** 719,727 **** + #endif + + if (count <= 0) + return 0; + +! #if defined (HANDLE_MULTIBYTE) +! if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + incoming[0] = c; +--- 724,749 ---- + #endif + ++ #if !defined (HANDLE_MULTIBYTE) + if (count <= 0) + return 0; ++ #else ++ if (count < 0) ++ return 0; ++ if (count == 0) ++ { ++ if (pending_bytes_length == 0) ++ return 0; ++ if (stored_count <= 0) ++ stored_count = count; ++ else ++ count = stored_count; + +! memcpy (incoming, pending_bytes, pending_bytes_length); +! incoming[pending_bytes_length] = '\0'; +! incoming_length = pending_bytes_length; +! pending_bytes_length = 0; +! memset (&ps, 0, sizeof (mbstate_t)); +! } +! else if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + incoming[0] = c; +*************** +*** 731,734 **** +--- 753,759 ---- + else if (_rl_utf8locale && (c & 0x80) == 0) + { ++ if (pending_bytes_length) ++ _rl_insert_char (0, 0); ++ + incoming[0] = c; + incoming[1] = '\0'; +*************** +*** 765,769 **** + incoming_length = 1; + pending_bytes_length--; +! memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ +--- 790,795 ---- + incoming_length = 1; + pending_bytes_length--; +! if (pending_bytes_length) +! memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ +*************** +*** 828,832 **** +--- 854,862 ---- + xfree (string); + ++ #if defined (HANDLE_MULTIBYTE) ++ return (pending_bytes_length != 0); ++ #else + return 0; ++ #endif + } + +*************** +*** 861,864 **** +--- 891,896 ---- + incoming_length = 0; + stored_count = 0; ++ ++ return (pending_bytes_length != 0); + #else /* !HANDLE_MULTIBYTE */ + char str[TEXT_COUNT_MAX+1]; +*************** +*** 874,880 **** + count -= decreaser; + } +- #endif /* !HANDLE_MULTIBYTE */ + + return 0; + } + +--- 906,912 ---- + count -= decreaser; + } + + return 0; ++ #endif /* !HANDLE_MULTIBYTE */ + } + +*************** +*** 904,910 **** + stored_count = 0; + } +! #endif +! + return 0; + } + +--- 936,944 ---- + stored_count = 0; + } +! +! return (pending_bytes_length != 0); +! #else + return 0; ++ #endif + } + +*************** +*** 984,987 **** +--- 1018,1026 ---- + } + ++ /* If we didn't insert n and there are pending bytes, we need to insert ++ them if _rl_insert_char didn't do that on its own. */ ++ if (r == 1 && rl_insert_mode == RL_IM_INSERT) ++ r = _rl_insert_char (0, 0); /* flush partial multibyte char */ ++ + if (n != (unsigned short)-2) /* -2 = sentinel value for having inserted N */ + { +*************** +*** 1055,1058 **** +--- 1094,1099 ---- + rl_quoted_insert (int count, int key) + { ++ int r; ++ + /* Let's see...should the callback interface futz with signal handling? */ + #if defined (HANDLE_SIGNALS) +*************** +*** 1073,1085 **** + if (count < 0) + { +- int r; +- + do + r = _rl_insert_next (1); + while (r == 0 && ++count < 0); +- return r; + } + +! return _rl_insert_next (count); + } + +--- 1114,1128 ---- + if (count < 0) + { + do + r = _rl_insert_next (1); + while (r == 0 && ++count < 0); + } ++ else ++ r = _rl_insert_next (count); + +! if (r == 1) +! _rl_insert_char (0, 0); /* insert partial multibyte character */ +! +! return r; + } + + +*** ../readline-8.2/patchlevel 2013-11-15 08:11:11.000000000 -0500 +--- patchlevel 2014-03-21 08:28:40.000000000 -0400 +*************** +*** 1,3 **** + # Do not edit -- exists only for use by patch + +! 12 +--- 1,3 ---- + # Do not edit -- exists only for use by patch + +! 13