size_t changes for multibyte characters; fix for running debug trap in asynchronous pipeline; remove support for precomputed cache files for cross-compiling; more size_t and ssize_t changes to avoid overflow

This commit is contained in:
Chet Ramey
2024-06-28 14:16:29 -04:00
parent ad1f497a84
commit 5e28a1813c
20 changed files with 145 additions and 98 deletions
+44
View File
@@ -9677,3 +9677,47 @@ pathexp.c
any non-digits sort after all-digit names and are sorted
lexicographically.
Inspired by a discussion with Robert Elz <kre@munnari.oz.au>
6/21
----
lib/readline/text.c
- rl_change_case: make mlen size_t to assign the return value from
wcrtomb; change the tests of < 0 to use MB_INVALIDCH.
Report from Siteshwar Vashisht <svashisht@redhat.com>
6/26
----
trap.c
- run_debug_trap: give the terminal back to pipeline_pgrp only if
job_control is enabled; that's the only way the trap command would
have given it to a different process group
Fixes bug reported by Mark March <march@systempad.cloud>
6/27
----
configure.ac
- remove support for cached files for cross-compiling; it's too hard
to keep them up-to-date without access to the platforms
6/28
----
lib/readline/util.c
- _rl_audit_tty: make sure to close fd before returning on error
lib/sh/casemod.c
- sh_modcase: use size_t variable as return value for wcrtomb; check
for invalid wide char and copy all characters in the multibyte
character as-is if it is
lib/sh/zwrite.c
- zwrite: use size_t and ssize_t variables
builtins/evalfile.c
- _evalfile: use size_t variable for return value from strlen()
lib/readline/funmap.c
- rl_funmap_names: don't bother calling qsort if result doesn't have
any entries
All from a report by Siteshwar Vashisht <svashisht@redhat.com>
+7 -6
View File
@@ -78,7 +78,8 @@ _evalfile (const char *filename, int flags)
{
volatile int old_interactive;
procenv_t old_return_catch;
int return_val, fd, result, pflags, i, nnull;
int return_val, fd, result, pflags, nnull;
size_t i;
ssize_t nr; /* return value from read(2) */
char *string;
struct stat finfo;
@@ -101,19 +102,19 @@ _evalfile (const char *filename, int flags)
do
{
fd = open (filename, O_RDONLY);
i = errno;
if (fd < 0 && i == EINTR)
result = errno;
if (fd < 0 && result == EINTR)
QUIT;
errno = i;
errno = result;
}
while (fd < 0 && errno == EINTR && (flags & FEVAL_RETRY));
if (fd < 0 || (fstat (fd, &finfo) == -1))
{
i = errno;
result = errno;
if (fd >= 0)
close (fd);
errno = i;
errno = result;
file_error_and_exit:
if (((flags & FEVAL_ENOENTOK) == 0) || errno != ENOENT)
+2 -3
View File
@@ -1515,8 +1515,7 @@ asciicode (void)
register intmax_t ch;
#if defined (HANDLE_MULTIBYTE)
wchar_t wc;
size_t slen;
int mblength;
size_t slen, mblength;
#endif
DECLARE_MBSTATE;
@@ -1524,7 +1523,7 @@ asciicode (void)
slen = strlen (garglist->word->word+1);
wc = 0;
mblength = mbrtowc (&wc, garglist->word->word+1, slen, &state);
if (mblength > 0)
if (MB_INVALIDCH (mblength) == 0)
ch = wc; /* XXX */
else
#endif
Vendored
+25 -25
View File
@@ -1,5 +1,5 @@
#! /bin/sh
# From configure.ac for Bash 5.3, version 5.065.
# From configure.ac for Bash 5.3, version 5.066.
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.72 for bash 5.3-alpha.
#
@@ -5330,30 +5330,30 @@ SIGNAMES_H=lsignames.h
CROSS_COMPILE=
if test "x$cross_compiling" = "xyes"; then
case "${host}" in
*-cygwin*)
cross_cache=${srcdir}/cross-build/cygwin32.cache
;;
*-msys*)
cross_cache=${srcdir}/cross-build/msys32.cache
;;
*-mingw*)
cross_cache=${srcdir}/cross-build/cygwin32.cache
;;
i[3456]86-*-beos*)
cross_cache=${srcdir}/cross-build/x86-beos.cache
;;
*-qnx*)
cross_cache=${srcdir}/cross-build/qnx.cache
;;
*) echo "configure: cross-compiling for $host is not supported" >&2
;;
esac
if test -n "${cross_cache}" && test -r "${cross_cache}"; then
echo "loading cross-build cache file ${cross_cache}"
. ${cross_cache}
fi
unset cross_cache
# case "${host}" in
# *-cygwin*)
# cross_cache=${srcdir}/cross-build/cygwin32.cache
# ;;
# *-msys*)
# cross_cache=${srcdir}/cross-build/msys32.cache
# ;;
# *-mingw*)
# cross_cache=${srcdir}/cross-build/cygwin32.cache
# ;;
# i[[3456]]86-*-beos*)
# cross_cache=${srcdir}/cross-build/x86-beos.cache
# ;;
# *-qnx*)
# cross_cache=${srcdir}/cross-build/qnx.cache
# ;;
# *) echo "configure: cross-compiling for $host is not supported" >&2
# ;;
# esac
# if test -n "${cross_cache}" && test -r "${cross_cache}"; then
# echo "loading cross-build cache file ${cross_cache}"
# . ${cross_cache}
# fi
# unset cross_cache
SIGNAMES_O='signames.o'
CROSS_COMPILE='-DCROSS_COMPILING'
+25 -25
View File
@@ -21,7 +21,7 @@ dnl Process this file with autoconf to produce a configure script.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
AC_REVISION([for Bash 5.3, version 5.065])dnl
AC_REVISION([for Bash 5.3, version 5.066])dnl
define(bashvers, 5.3)
define(relstatus, alpha)
@@ -460,30 +460,30 @@ dnl Set SIGNAMES_H based on whether or not we're cross-compiling.
CROSS_COMPILE=
if test "x$cross_compiling" = "xyes"; then
case "${host}" in
*-cygwin*)
cross_cache=${srcdir}/cross-build/cygwin32.cache
;;
*-msys*)
cross_cache=${srcdir}/cross-build/msys32.cache
;;
*-mingw*)
cross_cache=${srcdir}/cross-build/cygwin32.cache
;;
i[[3456]]86-*-beos*)
cross_cache=${srcdir}/cross-build/x86-beos.cache
;;
*-qnx*)
cross_cache=${srcdir}/cross-build/qnx.cache
;;
*) echo "configure: cross-compiling for $host is not supported" >&2
;;
esac
if test -n "${cross_cache}" && test -r "${cross_cache}"; then
echo "loading cross-build cache file ${cross_cache}"
. ${cross_cache}
fi
unset cross_cache
# case "${host}" in
# *-cygwin*)
# cross_cache=${srcdir}/cross-build/cygwin32.cache
# ;;
# *-msys*)
# cross_cache=${srcdir}/cross-build/msys32.cache
# ;;
# *-mingw*)
# cross_cache=${srcdir}/cross-build/cygwin32.cache
# ;;
# i[[3456]]86-*-beos*)
# cross_cache=${srcdir}/cross-build/x86-beos.cache
# ;;
# *-qnx*)
# cross_cache=${srcdir}/cross-build/qnx.cache
# ;;
# *) echo "configure: cross-compiling for $host is not supported" >&2
# ;;
# esac
# if test -n "${cross_cache}" && test -r "${cross_cache}"; then
# echo "loading cross-build cache file ${cross_cache}"
# . ${cross_cache}
# fi
# unset cross_cache
SIGNAMES_O='signames.o'
CROSS_COMPILE='-DCROSS_COMPILING'
AC_SUBST(CROSS_COMPILE)
+2 -2
View File
@@ -9946,8 +9946,8 @@ any supplied field width and precision in terms of characters, not bytes.
.PP
Arguments to non-string format specifiers are treated as C constants,
except that a leading plus or minus sign is allowed, and if the leading
character is a single or double quote, the value is the ASCII value of
the following character.
character is a single or double quote, the value is the numeric value of
the following character, using the current locale.
.PP
The \fIformat\fP is reused as necessary to consume all of the \fIarguments\fP.
If the \fIformat\fP requires more \fIarguments\fP than are supplied, the
+2 -2
View File
@@ -5091,8 +5091,8 @@ identically to the %b format specifier if it's supplied.
Arguments to non-string format specifiers are treated as C language constants,
except that a leading plus or minus sign is allowed, and if the leading
character is a single or double quote, the value is the ASCII value of
the following character.
character is a single or double quote, the value is the numeric value of
the following character, using the current locale.
The @var{format} is reused as necessary to consume all of the @var{arguments}.
If the @var{format} requires more @var{arguments} than are supplied, the
-1
View File
@@ -1362,7 +1362,6 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text)
size_t si1, si2;
size_t len1, len2;
#if defined (HANDLE_MULTIBYTE)
int v;
size_t v1, v2;
mbstate_t ps1, ps2;
WCHAR_T wc1, wc2;
+2 -2
View File
@@ -1732,7 +1732,7 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l
{
char *ofd, *ols, *oe, *nfd, *nls, *ne;
char *ofdf, *nfdf, *olsf, *nlsf;
int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
int temp, lendiff, wsatend, od, nd, o_cpos;
int current_invis_chars;
int col_lendiff, col_temp;
int bytes_to_insert;
@@ -1863,7 +1863,7 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l
_rl_output_some_chars below. */
if (newwidth > 0)
{
int count, i, j;
int i, j;
char *optr;
puts_face (new, new_face, newbytes);
+2 -2
View File
@@ -19,7 +19,7 @@ My example shows how, using the alternate interface, you can
interactively change the prompt (which is very nice imo). Also, I
point out that you must roll your own terminal setting when using the
alternate interface because readline depreps (using your parlance) the
terminal while in the user callback. I try to demostrate what I mean
terminal while in the user callback. I try to demonstrate what I mean
with an example. I've included the program below.
To compile, I just put the program in the examples directory and made
@@ -72,7 +72,7 @@ Copyright (C) 1999 Jeff Solomon
* alternate interface. The first is the ability to interactively change the
* prompt, which can't be done using the regular interface since rl_prompt is
* read-only.
*
*
* The second feature really highlights a subtle point when using the alternate
* interface. That is, readline will not alter the terminal when inside your
* callback handler. So let's so, your callback executes a user command that
+1 -1
View File
@@ -110,7 +110,7 @@ main (int argc, char **argv)
int which;
if ((sscanf (line + 6, "%d", &which)) == 1)
{
HIST_ENTRY *entry = remove_history (which);
HIST_ENTRY *entry = remove_history (which - history_base);
if (!entry)
fprintf (stderr, "No such entry %d\n", which);
else
+10 -15
View File
@@ -94,16 +94,8 @@ invert_case_line (int count, int key)
start = rl_point;
if (count < 0)
{
direction = -1;
count = -count;
}
else
direction = 1;
/* Find the end of the range to modify. */
end = start + (count * direction);
end = start + count;
/* Force it to be within range. */
if (end > rl_end)
@@ -111,6 +103,14 @@ invert_case_line (int count, int key)
else if (end < 0)
end = -1;
if (start == end)
return 0;
/* For positive arguments, put point after the last changed character. For
negative arguments, put point before the last changed character. */
rl_point = end;
/* Swap start and end if we are moving backwards */
if (start > end)
{
int temp = start;
@@ -118,14 +118,11 @@ invert_case_line (int count, int key)
end = temp;
}
if (start == end)
return 0;
/* Tell readline that we are modifying the line, so save the undo
information. */
rl_modifying (start, end);
for (; start != end; start += direction)
for (; start != end; start++)
{
if (_rl_uppercase_p (rl_line_buffer[start]))
rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]);
@@ -133,7 +130,5 @@ invert_case_line (int count, int key)
rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]);
}
/* Move point to on top of the last character changed. */
rl_point = end - direction;
return 0;
}
+2 -1
View File
@@ -265,6 +265,7 @@ rl_funmap_names (void)
result[result_index + 1] = (char *)NULL;
}
qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
if (result)
qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
return (result);
}
+2 -1
View File
@@ -107,12 +107,13 @@ static int
utf8locale (char *lspec)
{
char *cp;
size_t len;
#if HAVE_LANGINFO_CODESET
cp = nl_langinfo (CODESET);
return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8"));
#else
size_t len;
cp = find_codeset (lspec, &len);
if (cp == 0 || len < 4 || len > 5)
+4 -4
View File
@@ -1453,8 +1453,7 @@ rl_change_case (int count, int op)
#if defined (HANDLE_MULTIBYTE)
WCHAR_T wc, nwc;
char mb[MB_LEN_MAX+1];
int mlen;
size_t m;
size_t m, mlen;
mbstate_t mps;
#endif
@@ -1532,12 +1531,13 @@ change_singlebyte:
memset (&ts, 0, sizeof (mbstate_t));
mlen = WCRTOMB (mb, nwc, &ts);
if (mlen < 0)
if (MB_INVALIDCH (mlen))
{
nwc = wc;
memset (&ts, 0, sizeof (mbstate_t));
mlen = WCRTOMB (mb, nwc, &ts);
if (mlen < 0) /* should not happen */
if (MB_INVALIDCH (mlen)) /* should not happen */
strncpy (mb, rl_line_buffer + start, mlen = m);
}
if (mlen > 0)
+4 -1
View File
@@ -536,7 +536,10 @@ _rl_audit_tty (char *string)
size = strlen (string) + 1;
if (NLMSG_SPACE (size) > MAX_AUDIT_MESSAGE_LENGTH)
return;
{
close (fd);
return;
}
memset (&req, 0, sizeof(req));
req.nlh.nlmsg_len = NLMSG_SPACE (size);
+4 -4
View File
@@ -106,8 +106,7 @@ sh_modcase (const char *string, char *pat, int flags)
#if defined (HANDLE_MULTIBYTE)
wchar_t nwc;
char mb[MB_LEN_MAX+1];
int mlen;
size_t m;
size_t m, mlen;
mbstate_t state;
#endif
@@ -249,8 +248,9 @@ singlebyte:
else
{
mlen = wcrtomb (mb, nwc, &state);
if (mlen > 0)
mb[mlen] = '\0';
if (MB_INVALIDCH (mlen))
strncpy (mb, string + start, mlen = m);
mb[mlen] = '\0';
/* Don't assume the same width */
strncpy (ret + retind, mb, mlen);
retind += mlen;
+3 -1
View File
@@ -38,7 +38,9 @@ extern int errno;
int
zwrite (int fd, char *buf, size_t nb)
{
int n, i, nt;
int nt;
size_t n;
ssize_t i;
for (n = nb, nt = 0;;)
{
+1 -1
View File
@@ -818,7 +818,7 @@ out_html(char *c)
} else if (output_possible) {
while (*c) {
outbuffer[obp++] = *c;
if (*c == '\n' || obp > HUGE_STR_MAX) {
if (*c == '\n' || obp >= HUGE_STR_MAX) {
outbuffer[obp] = '\0';
add_links(outbuffer);
obp = 0;
+3 -1
View File
@@ -1286,7 +1286,9 @@ run_debug_trap (void)
close_pgrp_pipe ();
restore_pgrp_pipe (save_pipe);
# endif
if (pipeline_pgrp > 0 && ((subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0))
/* If the trap command gave the terminal to another process group,
restore it. XXX - check running_in_background? */
if (job_control && pipeline_pgrp > 0 && ((subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0))
give_terminal_to (pipeline_pgrp, 1);
notify_and_cleanup ();