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>
+
{
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;
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)
register intmax_t ch;
#if defined (HANDLE_MULTIBYTE)
wchar_t wc;
- size_t slen;
- int mblength;
+ size_t slen, mblength;
#endif
DECLARE_MBSTATE;
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
#! /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.
#
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'
# 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)
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)
.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
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
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;
{
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;
_rl_output_some_chars below. */
if (newwidth > 0)
{
- int count, i, j;
+ int i, j;
char *optr;
puts_face (new, new_face, newbytes);
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
* 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
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
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)
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;
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]);
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;
}
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);
}
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)
#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
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)
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);
#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
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;
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;;)
{
} 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;
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 ();