mirror of
git://slackware.nl/current.git
synced 2024-12-30 10:24:23 +01:00
f2ee5ebc09
a/bash-5.2.037-x86_64-1.txz: Upgraded. a/dracut-103-x86_64-3.txz: Rebuilt. Don't search for systemd services. Thanks to LuckyCyborg. d/git-2.46.2-x86_64-1.txz: Upgraded. kde/krita-5.2.5-x86_64-1.txz: Upgraded. l/gtk4-4.16.2-x86_64-1.txz: Upgraded. l/harfbuzz-10.0.0-x86_64-1.txz: Upgraded. n/netatalk-3.2.10-x86_64-1.txz: Upgraded. xap/mpv-0.39.0-x86_64-1.txz: Upgraded.
237 lines
5.8 KiB
Text
237 lines
5.8 KiB
Text
BASH PATCH REPORT
|
|
=================
|
|
|
|
Bash-Release: 5.2
|
|
Patch-ID: bash52-036
|
|
|
|
Bug-Reported-by: Grisha Levit <grishalevit@gmail.com>
|
|
Bug-Reference-ID: <CAMu=Brrv5qKY6LPfw8PxqNXNO8rNsZo0Fb=BcFb-uHObWPqnrw@mail.gmail.com>
|
|
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'):
|
|
|
|
*** ../bash-5.2-patched/lib/readline/text.c Mon May 1 09:37:52 2023
|
|
--- lib/readline/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;
|
|
}
|
|
|
|
*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
|
|
--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
|
|
***************
|
|
*** 26,30 ****
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 35
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|
|
--- 26,30 ----
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 36
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|