summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-core/ncurses/ncurses/0001-patch-20230408-CVE-2023-29491.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-core/ncurses/ncurses/0001-patch-20230408-CVE-2023-29491.patch')
-rw-r--r--meta-openbmc-mods/meta-common/recipes-core/ncurses/ncurses/0001-patch-20230408-CVE-2023-29491.patch1432
1 files changed, 1432 insertions, 0 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-core/ncurses/ncurses/0001-patch-20230408-CVE-2023-29491.patch b/meta-openbmc-mods/meta-common/recipes-core/ncurses/ncurses/0001-patch-20230408-CVE-2023-29491.patch
new file mode 100644
index 000000000..6e4301e35
--- /dev/null
+++ b/meta-openbmc-mods/meta-common/recipes-core/ncurses/ncurses/0001-patch-20230408-CVE-2023-29491.patch
@@ -0,0 +1,1432 @@
+From 50dd6dac94847a1aec06deb324eedef627f1829c Mon Sep 17 00:00:00 2001
+From: Saravanan Palanisamy <saravanan.palanisamy@intel.com>
+Date: Wed, 24 May 2023 12:45:20 +0000
+Subject: [PATCH] ncurses 6.4 - patch 20230408 (for CVE-2023-29491)
+
+From eb51b1ea1f75a0ec17c9c5937cb28df1e8eeec56 Mon Sep 17 00:00:00 2001
+From: "Thomas E. Dickey" <dickey@invisible-island.net>
+Date: Sun, 9 Apr 2023 00:08:25 +0000
+Subject: [PATCH 1/1] ncurses 6.4 - patch 20230408
+
++ document limitations of tparm, and error-returns in curs_terminfo.3x
++ document limitations of tgoto, and error-returns in curs_termcap.3x
++ add xterm+focus to alacritty+common (patch by Christian Duerr).
++ add "-v" option to tput, to show warnings.
+> improve checks for malformed terminfo data (report/analysis by
+ Jonathan Bar Or, Michael Pearse, Emanuele Cozzi).
+ + make the parameter type/count checks in _nc_tiparm() more stringent
+ + update tgoto() to account for _nc_tiparm() changes
+ + add checks in tparm() and tiparm() for misuse of string parameters
+ + add special cases in tput to handle extensions Cs/Ms parameters
+ + ignore compiled-terminfo where the array sizes exceed the standard
+
+Note:
+Did not cherrypick below changes from original patch as it is not applicable
+Intel OpenBMC:
+ package/debian-mingw/changelog
+ package/debian-mingw64/changelog
+ package/debian/changelog
+ package/mingw-ncurses.nsi
+ package/mingw-ncurses.spec
+---
+ NEWS | 15 ++-
+ VERSION | 2 +-
+ dist.mk | 4 +-
+ doc/html/man/adacurses6-config.1.html | 2 +-
+ doc/html/man/captoinfo.1m.html | 2 +-
+ doc/html/man/clear.1.html | 2 +-
+ doc/html/man/curs_termcap.3x.html | 141 +++++++++++++++-----------
+ doc/html/man/curs_terminfo.3x.html | 41 +++++++-
+ doc/html/man/form.3x.html | 2 +-
+ doc/html/man/infocmp.1m.html | 2 +-
+ doc/html/man/infotocap.1m.html | 2 +-
+ doc/html/man/menu.3x.html | 2 +-
+ doc/html/man/ncurses.3x.html | 2 +-
+ doc/html/man/ncurses6-config.1.html | 2 +-
+ doc/html/man/panel.3x.html | 2 +-
+ doc/html/man/tabs.1.html | 2 +-
+ doc/html/man/terminfo.5.html | 2 +-
+ doc/html/man/tic.1m.html | 2 +-
+ doc/html/man/toe.1m.html | 2 +-
+ doc/html/man/tput.1.html | 2 +-
+ doc/html/man/tset.1.html | 2 +-
+ man/curs_termcap.3x | 26 ++++-
+ man/curs_terminfo.3x | 41 +++++++-
+ misc/terminfo.src | 9 +-
+ ncurses/tinfo/lib_tgoto.c | 14 ++-
+ ncurses/tinfo/lib_tparm.c | 120 +++++++++++++++++++---
+ ncurses/tinfo/read_entry.c | 7 +-
+ package/ncurses.spec | 2 +-
+ package/ncursest.spec | 2 +-
+ progs/tic.c | 10 +-
+ progs/tparm_type.c | 13 ++-
+ progs/tparm_type.h | 6 +-
+ progs/tput.c | 61 +++++++++--
+ 33 files changed, 418 insertions(+), 128 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index 66e63a39..ab0c10a2 100644
+--- a/NEWS
++++ b/NEWS
+@@ -26,7 +26,7 @@
+ -- sale, use or other dealings in this Software without prior written --
+ -- authorization. --
+ -------------------------------------------------------------------------------
+--- $Id: NEWS,v 1.3895 2022/12/31 20:43:21 tom Exp $
++-- $Id: NEWS,v 1.3929 2023/04/08 22:24:09 tom Exp $
+ -------------------------------------------------------------------------------
+
+ This is a log of changes that ncurses has gone through since Zeyd started
+@@ -46,6 +46,19 @@ See the AUTHORS file for the corresponding full names.
+ Changes through 1.9.9e did not credit all contributions;
+ it is not possible to add this information.
+
++20230408
++ + document limitations of tparm, and error-returns in curs_terminfo.3x
++ + document limitations of tgoto, and error-returns in curs_termcap.3x
++ + add xterm+focus to alacritty+common (patch by Christian Duerr).
++ + add "-v" option to tput, to show warnings.
++ > improve checks for malformed terminfo data (report/analysis by
++ Jonathan Bar Or, Michael Pearse, Emanuele Cozzi).
++ + make the parameter type/count checks in _nc_tiparm() more stringent
++ + update tgoto() to account for _nc_tiparm() changes
++ + add checks in tparm() and tiparm() for misuse of string parameters
++ + add special cases in tput to handle extensions Cs/Ms parameters
++ + ignore compiled-terminfo where the array sizes exceed the standard
++
+ 20221231 6.4 release for upload to ftp.gnu.org
+ + update release notes
+ + regenerate llib-* files.
+diff --git a/VERSION b/VERSION
+index e2dff67c..78269eab 100644
+--- a/VERSION
++++ b/VERSION
+@@ -1 +1 @@
+-5:0:10 6.4 20221231
++5:0:10 6.4 20230408
+diff --git a/dist.mk b/dist.mk
+index ee07796b..a2986a57 100644
+--- a/dist.mk
++++ b/dist.mk
+@@ -26,7 +26,7 @@
+ # use or other dealings in this Software without prior written #
+ # authorization. #
+ ##############################################################################
+-# $Id: dist.mk,v 1.1519 2022/12/31 20:43:21 tom Exp $
++# $Id: dist.mk,v 1.1534 2023/04/08 13:33:20 tom Exp $
+ # Makefile for creating ncurses distributions.
+ #
+ # This only needs to be used directly as a makefile by developers, but
+@@ -38,7 +38,7 @@ SHELL = /bin/sh
+ # These define the major/minor/patch versions of ncurses.
+ NCURSES_MAJOR = 6
+ NCURSES_MINOR = 4
+-NCURSES_PATCH = 20221231
++NCURSES_PATCH = 20230408
+
+ # We don't append the patch to the version, since this only applies to releases
+ VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
+diff --git a/doc/html/man/adacurses6-config.1.html b/doc/html/man/adacurses6-config.1.html
+index 90587e45..fe563fe2 100644
+--- a/doc/html/man/adacurses6-config.1.html
++++ b/doc/html/man/adacurses6-config.1.html
+@@ -126,7 +126,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/captoinfo.1m.html b/doc/html/man/captoinfo.1m.html
+index ab99a7cf..2c914951 100644
+--- a/doc/html/man/captoinfo.1m.html
++++ b/doc/html/man/captoinfo.1m.html
+@@ -199,7 +199,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+ </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+diff --git a/doc/html/man/clear.1.html b/doc/html/man/clear.1.html
+index 74f5198b..243d57ed 100644
+--- a/doc/html/man/clear.1.html
++++ b/doc/html/man/clear.1.html
+@@ -150,7 +150,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="tput.1.html">tput(1)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>, <STRONG>xterm(1)</STRONG>.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/curs_termcap.3x.html b/doc/html/man/curs_termcap.3x.html
+index 9cd555ec..32699b3c 100644
+--- a/doc/html/man/curs_termcap.3x.html
++++ b/doc/html/man/curs_termcap.3x.html
+@@ -1,6 +1,6 @@
+ <!--
+ ****************************************************************************
+- * Copyright 2018-2022,2022 Thomas E. Dickey *
++ * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 1998-2017,2018 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -27,7 +27,7 @@
+ * sale, use or other dealings in this Software without prior written *
+ * authorization. *
+ ****************************************************************************
+- * @Id: curs_termcap.3x,v 1.56 2022/02/12 20:05:11 tom Exp @
++ * @Id: curs_termcap.3x,v 1.57 2023/04/08 21:43:01 tom Exp @
+ -->
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+ <HTML>
+@@ -148,27 +148,32 @@
+ first parameter is merely a placeholder.
+
+ <STRONG>o</STRONG> Normally the ncurses library is compiled with terminfo support. In
+- that case, <STRONG>tgoto</STRONG> uses <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> (a more capable formatter).
++ that case, <STRONG>tgoto</STRONG> uses an internal version of <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> (a more ca-
++ pable formatter).
+
+- However, <STRONG>tparm</STRONG> is not a <EM>termcap</EM> feature, and portable <EM>termcap</EM> ap-
++ With terminfo support, <STRONG>tgoto</STRONG> is able to use some of the terminfo
++ features, but not all. In particular, it allows only numeric pa-
++ rameters; <STRONG>tparm</STRONG> supports string parameters.
++
++ However, <STRONG>tparm</STRONG> is not a <EM>termcap</EM> feature, and portable <EM>termcap</EM> ap-
+ plications should not rely upon its availability.
+
+- The <STRONG>tputs</STRONG> routine is described on the <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG> manual page.
++ The <STRONG>tputs</STRONG> routine is described on the <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG> manual page.
+ It can retrieve capabilities by either termcap or terminfo name.
+
+
+ </PRE><H3><a name="h3-Global-Variables">Global Variables</a></H3><PRE>
+- The variables <STRONG>PC</STRONG>, <STRONG>UP</STRONG> and <STRONG>BC</STRONG> are set by <STRONG>tgetent</STRONG> to the terminfo entry's
++ The variables <STRONG>PC</STRONG>, <STRONG>UP</STRONG> and <STRONG>BC</STRONG> are set by <STRONG>tgetent</STRONG> to the terminfo entry's
+ data for <STRONG>pad_char</STRONG>, <STRONG>cursor_up</STRONG> and <STRONG>backspace_if_not_bs</STRONG>, respectively. <STRONG>UP</STRONG>
+- is not used by ncurses. <STRONG>PC</STRONG> is used in the <STRONG>tdelay_output</STRONG> function. <STRONG>BC</STRONG>
+- is used in the <STRONG>tgoto</STRONG> emulation. The variable <STRONG>ospeed</STRONG> is set by ncurses
++ is not used by ncurses. <STRONG>PC</STRONG> is used in the <STRONG>tdelay_output</STRONG> function. <STRONG>BC</STRONG>
++ is used in the <STRONG>tgoto</STRONG> emulation. The variable <STRONG>ospeed</STRONG> is set by ncurses
+ in a system-specific coding to reflect the terminal speed.
+
+
+ </PRE><H3><a name="h3-Releasing-Memory">Releasing Memory</a></H3><PRE>
+- The termcap functions provide no means for freeing memory, because
+- legacy termcap implementations used only the buffer areas provided by
+- the caller via <STRONG>tgetent</STRONG> and <STRONG>tgetstr</STRONG>. Those buffers are unused in ter-
++ The termcap functions provide no means for freeing memory, because
++ legacy termcap implementations used only the buffer areas provided by
++ the caller via <STRONG>tgetent</STRONG> and <STRONG>tgetstr</STRONG>. Those buffers are unused in ter-
+ minfo.
+
+ On the other hand, terminfo allocates memory. It uses <STRONG>setupterm</STRONG> to re-
+@@ -178,41 +183,55 @@
+ <STRONG>del_curterm(cur_term);</STRONG>
+
+
+- to free this memory, but there is an additional complication with
+- ncurses. It uses a fixed-size <EM>pool</EM> of storage locations, one per set-
+- ting of the <STRONG>TERM</STRONG> variable when <STRONG>tgetent</STRONG> is called. The <STRONG>screen(1)</STRONG> pro-
++ to free this memory, but there is an additional complication with
++ ncurses. It uses a fixed-size <EM>pool</EM> of storage locations, one per set-
++ ting of the <STRONG>TERM</STRONG> variable when <STRONG>tgetent</STRONG> is called. The <STRONG>screen(1)</STRONG> pro-
+ gram relies upon this arrangement, to improve its performance.
+
+- An application which uses only the low-level termcap functions could
++ An application which uses only the low-level termcap functions could
+ free the memory using <STRONG>del_curterm</STRONG>, because the pool is freed using oth-
+ er functions (see <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>).
+
+
+ </PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+- Except where explicitly noted, routines that return an integer return
+- <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> (SVr4 only specifies "an integer value other
++ Except where explicitly noted, routines that return an integer return
++ <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> (SVr4 only specifies "an integer value other
+ than <STRONG>ERR</STRONG>") upon successful completion.
+
+ Routines that return pointers return <STRONG>NULL</STRONG> on error.
+
++ A few special cases apply:
++
++ <STRONG>o</STRONG> If the terminal database has not been initialized, these return an
++ error.
++
++ <STRONG>o</STRONG> The calls with a string parameter (<STRONG>tgoto</STRONG>, <STRONG>tputs</STRONG>) check if the
++ string is null, or cancelled. Those return an error.
++
++ <STRONG>o</STRONG> A call to <STRONG>tgoto</STRONG> using a capability with string parameters is an er-
++ ror.
++
++ <STRONG>o</STRONG> A call to <STRONG>tgoto</STRONG> using a capability with no parameters, or more than
++ two is an error.
++
+
+ </PRE><H2><a name="h2-BUGS">BUGS</a></H2><PRE>
+- If you call <STRONG>tgetstr</STRONG> to fetch <STRONG>ca</STRONG> or any other parameterized string, be
+- aware that it will be returned in terminfo notation, not the older and
++ If you call <STRONG>tgetstr</STRONG> to fetch <STRONG>ca</STRONG> or any other parameterized string, be
++ aware that it will be returned in terminfo notation, not the older and
+ not-quite-compatible termcap notation. This will not cause problems if
+- all you do with it is call <STRONG>tgoto</STRONG> or <STRONG>tparm</STRONG>, which both expand terminfo-
+- style strings as terminfo. (The <STRONG>tgoto</STRONG> function, if configured to sup-
+- port termcap, will check if the string is indeed terminfo-style by
+- looking for "%p" parameters or "$&lt;..&gt;" delays, and invoke a termcap-
++ all you do with it is call <STRONG>tgoto</STRONG> or <STRONG>tparm</STRONG>, which both expand terminfo-
++ style strings as terminfo. (The <STRONG>tgoto</STRONG> function, if configured to sup-
++ port termcap, will check if the string is indeed terminfo-style by
++ looking for "%p" parameters or "$&lt;..&gt;" delays, and invoke a termcap-
+ style parser if the string does not appear to be terminfo).
+
+- Because terminfo conventions for representing padding in string capa-
++ Because terminfo conventions for representing padding in string capa-
+ bilities differ from termcap's, users can be surprised:
+
+ <STRONG>o</STRONG> <STRONG>tputs("50")</STRONG> in a terminfo system will put out a literal "50" rather
+ than busy-waiting for 50 milliseconds.
+
+- <STRONG>o</STRONG> However, if ncurses is configured to support termcap, it may also
++ <STRONG>o</STRONG> However, if ncurses is configured to support termcap, it may also
+ have been configured to support the BSD-style padding.
+
+ In that case, <STRONG>tputs</STRONG> inspects strings passed to it, looking for dig-
+@@ -221,9 +240,9 @@
+ <STRONG>tputs("50")</STRONG> in a termcap system may wait for 50 milliseconds rather
+ than put out a literal "50"
+
+- Note that termcap has nothing analogous to terminfo's <STRONG>sgr</STRONG> string. One
+- consequence of this is that termcap applications assume <STRONG>me</STRONG> (terminfo
+- <STRONG>sgr0</STRONG>) does not reset the alternate character set. This implementation
++ Note that termcap has nothing analogous to terminfo's <STRONG>sgr</STRONG> string. One
++ consequence of this is that termcap applications assume <STRONG>me</STRONG> (terminfo
++ <STRONG>sgr0</STRONG>) does not reset the alternate character set. This implementation
+ checks for, and modifies the data shown to the termcap interface to ac-
+ commodate termcap's limitation in this respect.
+
+@@ -231,22 +250,22 @@
+ </PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+
+ </PRE><H3><a name="h3-Standards">Standards</a></H3><PRE>
+- These functions are provided for supporting legacy applications, and
++ These functions are provided for supporting legacy applications, and
+ should not be used in new programs:
+
+ <STRONG>o</STRONG> The XSI Curses standard, Issue 4 describes these functions. Howev-
+- er, they are marked TO BE WITHDRAWN and may be removed in future
++ er, they are marked TO BE WITHDRAWN and may be removed in future
+ versions.
+
+ <STRONG>o</STRONG> X/Open Curses, Issue 5 (December 2007) marked the termcap interface
+ (along with <STRONG>vwprintw</STRONG> and <STRONG>vwscanw</STRONG>) as withdrawn.
+
+- Neither the XSI Curses standard nor the SVr4 man pages documented the
+- return values of <STRONG>tgetent</STRONG> correctly, though all three were in fact re-
+- turned ever since SVr1. In particular, an omission in the XSI Curses
+- documentation has been misinterpreted to mean that <STRONG>tgetent</STRONG> returns <STRONG>OK</STRONG>
+- or <STRONG>ERR</STRONG>. Because the purpose of these functions is to provide compati-
+- bility with the <EM>termcap</EM> library, that is a defect in XCurses, Issue 4,
++ Neither the XSI Curses standard nor the SVr4 man pages documented the
++ return values of <STRONG>tgetent</STRONG> correctly, though all three were in fact re-
++ turned ever since SVr1. In particular, an omission in the XSI Curses
++ documentation has been misinterpreted to mean that <STRONG>tgetent</STRONG> returns <STRONG>OK</STRONG>
++ or <STRONG>ERR</STRONG>. Because the purpose of these functions is to provide compati-
++ bility with the <EM>termcap</EM> library, that is a defect in XCurses, Issue 4,
+ Version 2 rather than in ncurses.
+
+
+@@ -254,68 +273,68 @@
+ External variables are provided for support of certain termcap applica-
+ tions. However, termcap applications' use of those variables is poorly
+ documented, e.g., not distinguishing between input and output. In par-
+- ticular, some applications are reported to declare and/or modify <STRONG>os-</STRONG>
++ ticular, some applications are reported to declare and/or modify <STRONG>os-</STRONG>
+ <STRONG>peed</STRONG>.
+
+- The comment that only the first two characters of the <STRONG>id</STRONG> parameter are
++ The comment that only the first two characters of the <STRONG>id</STRONG> parameter are
+ used escapes many application developers. The original BSD 4.2 termcap
+ library (and historical relics thereof) did not require a trailing null
+- NUL on the parameter name passed to <STRONG>tgetstr</STRONG>, <STRONG>tgetnum</STRONG> and <STRONG>tgetflag</STRONG>.
+- Some applications assume that the termcap interface does not require
++ NUL on the parameter name passed to <STRONG>tgetstr</STRONG>, <STRONG>tgetnum</STRONG> and <STRONG>tgetflag</STRONG>.
++ Some applications assume that the termcap interface does not require
+ the trailing NUL for the parameter name. Taking into account these is-
+ sues:
+
+- <STRONG>o</STRONG> As a special case, <STRONG>tgetflag</STRONG> matched against a single-character
+- identifier provided that was at the end of the terminal descrip-
++ <STRONG>o</STRONG> As a special case, <STRONG>tgetflag</STRONG> matched against a single-character
++ identifier provided that was at the end of the terminal descrip-
+ tion. You should not rely upon this behavior in portable programs.
+- This implementation disallows matches against single-character ca-
++ This implementation disallows matches against single-character ca-
+ pability names.
+
+- <STRONG>o</STRONG> This implementation disallows matches by the termcap interface
++ <STRONG>o</STRONG> This implementation disallows matches by the termcap interface
+ against extended capability names which are longer than two charac-
+ ters.
+
+ The BSD termcap function <STRONG>tgetent</STRONG> returns the text of a termcap entry in
+- the buffer passed as an argument. This library (like other terminfo
++ the buffer passed as an argument. This library (like other terminfo
+ implementations) does not store terminal descriptions as text. It sets
+ the buffer contents to a null-terminated string.
+
+
+ </PRE><H3><a name="h3-Other-Compatibility">Other Compatibility</a></H3><PRE>
+- This library includes a termcap.h header, for compatibility with other
+- implementations. But the header is rarely used because the other im-
++ This library includes a termcap.h header, for compatibility with other
++ implementations. But the header is rarely used because the other im-
+ plementations are not strictly compatible.
+
+ The original BSD termcap (through 4.3BSD) had no header file which gave
+ function prototypes, because that was a feature of ANSI C. BSD termcap
+- was written several years before C was standardized. However, there
++ was written several years before C was standardized. However, there
+ were two different termcap.h header files in the BSD sources:
+
+- <STRONG>o</STRONG> One was used internally by the <STRONG>jove</STRONG> editor in 2BSD through 4.4BSD.
++ <STRONG>o</STRONG> One was used internally by the <STRONG>jove</STRONG> editor in 2BSD through 4.4BSD.
+ It defined global symbols for the termcap variables which it used.
+
+- <STRONG>o</STRONG> The other appeared in 4.4BSD Lite Release 2 (mid-1993) as part of
++ <STRONG>o</STRONG> The other appeared in 4.4BSD Lite Release 2 (mid-1993) as part of
+ <EM>libedit</EM> (also known as the <EM>editline</EM> library). The CSRG source his-
+- tory shows that this was added in mid-1992. The <EM>libedit</EM> header
+- file was used internally, as a convenience for compiling the <EM>edit-</EM>
++ tory shows that this was added in mid-1992. The <EM>libedit</EM> header
++ file was used internally, as a convenience for compiling the <EM>edit-</EM>
+ <EM>line</EM> library. It declared function prototypes, but no global vari-
+ ables.
+
+- The header file from <EM>libedit</EM> was added to NetBSD's termcap library in
++ The header file from <EM>libedit</EM> was added to NetBSD's termcap library in
+ mid-1994.
+
+- Meanwhile, GNU termcap was under development, starting in 1990. The
+- first release (termcap 1.0) in 1991 included a termcap.h header. The
+- second release (termcap 1.1) in September 1992 modified the header to
++ Meanwhile, GNU termcap was under development, starting in 1990. The
++ first release (termcap 1.0) in 1991 included a termcap.h header. The
++ second release (termcap 1.1) in September 1992 modified the header to
+ use <STRONG>const</STRONG> for the function prototypes in the header where one would ex-
+- pect the parameters to be read-only. This was a difference versus the
+- original BSD termcap. The prototype for <STRONG>tputs</STRONG> also differed, but in
++ pect the parameters to be read-only. This was a difference versus the
++ original BSD termcap. The prototype for <STRONG>tputs</STRONG> also differed, but in
+ that instance, it was <EM>libedit</EM> which differed from BSD termcap.
+
+ A copy of GNU termcap 1.3 was bundled with <EM>bash</EM> in mid-1993, to support
+ the <STRONG>readline(3)</STRONG> library.
+
+- A termcap.h file was provided in ncurses 1.8.1 (November 1993). That
++ A termcap.h file was provided in ncurses 1.8.1 (November 1993). That
+ reflected influence by <STRONG>emacs(1)</STRONG> (rather than <STRONG>jove(1)</STRONG>) and GNU termcap:
+
+ <STRONG>o</STRONG> it provided declarations for a few global symbols used by <STRONG>emacs</STRONG>
+@@ -325,8 +344,8 @@
+ <STRONG>o</STRONG> a prototype for <STRONG>tparam</STRONG> (a GNU termcap feature) was provided.
+
+ Later (in mid-1996) the <STRONG>tparam</STRONG> function was removed from ncurses. As a
+- result, there are differences between any of the four implementations,
+- which must be taken into account by programs which can work with all
++ result, there are differences between any of the four implementations,
++ which must be taken into account by programs which can work with all
+ termcap library interfaces.
+
+
+diff --git a/doc/html/man/curs_terminfo.3x.html b/doc/html/man/curs_terminfo.3x.html
+index c50d7db3..480cafce 100644
+--- a/doc/html/man/curs_terminfo.3x.html
++++ b/doc/html/man/curs_terminfo.3x.html
+@@ -1,6 +1,6 @@
+ <!--
+ ****************************************************************************
+- * Copyright 2018-2022,2022 Thomas E. Dickey *
++ * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -27,7 +27,7 @@
+ * sale, use or other dealings in this Software without prior written *
+ * authorization. *
+ ****************************************************************************
+- * @Id: curs_terminfo.3x,v 1.82 2022/06/04 22:47:05 tom Exp @
++ * @Id: curs_terminfo.3x,v 1.83 2023/04/08 22:54:21 tom Exp @
+ * ***************************************************************************
+ * ***************************************************************************
+ * ***************************************************************************
+@@ -83,6 +83,9 @@
+ <STRONG>int</STRONG> <STRONG>restartterm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>term</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>filedes</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>errret</EM><STRONG>);</STRONG>
+
+ <STRONG>char</STRONG> <STRONG>*tparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
++ <EM>or</EM>
++ <STRONG>char</STRONG> <STRONG>*tparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>long</STRONG> <EM>p1</EM> <EM>...</EM> <STRONG>long</STRONG> <EM>p9</EM><STRONG>);</STRONG>
++
+ <STRONG>int</STRONG> <STRONG>tputs(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>affcnt</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>putc</EM><STRONG>)(int));</STRONG>
+ <STRONG>int</STRONG> <STRONG>putp(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+
+@@ -398,6 +401,11 @@
+ the initial windows (stdscr, curscr, newscr). Other error con-
+ ditions are documented above.
+
++ <STRONG>tparm</STRONG>
++ returns a null if the capability would require unexpected pa-
++ rameters, e.g., too many, too few, or incorrect types (strings
++ where integers are expected, or vice versa).
++
+ <STRONG>tputs</STRONG>
+ returns an error if the string parameter is null. It does not
+ detect I/O errors: X/Open states that <STRONG>tputs</STRONG> ignores the return
+@@ -466,7 +474,6 @@
+ <STRONG>Function</STRONG> <STRONG>Description</STRONG>
+ -------------------------------------------
+ tigetflag get boolean entry for given <EM>id</EM>
+-
+ tigetnum get numeric entry for given <EM>id</EM>
+ tigetstr get string entry for given <EM>id</EM>
+
+@@ -568,6 +575,34 @@
+ In response to review comments by Thomas E. Dickey, X/Open Curses
+ Issue 7 proposed the <STRONG>tiparm</STRONG> function in mid-2009.
+
++ While <STRONG>tiparm</STRONG> is always provided in ncurses, the older form is only
++ available as a build-time configuration option. If not specially
++ configured, <STRONG>tparm</STRONG> is the same as <STRONG>tiparm</STRONG>.
++
++ Both forms of <STRONG>tparm</STRONG> have drawbacks:
++
++ <STRONG>o</STRONG> Most of the calls to <STRONG>tparm</STRONG> use only one or two parameters. Passing
++ nine on each call is awkward.
++
++ Using <STRONG>long</STRONG> for the numeric parameter type is a workaround to make
++ the parameter use the same amount of stack as a pointer. That ap-
++ proach dates back to the mid-1980s, before C was standarized.
++ Since then, there is a standard (and pointers are not required to
++ fit in a long).
++
++ <STRONG>o</STRONG> Providing the right number of parameters for a variadic function
++ such as <STRONG>tiparm</STRONG> can be a problem, in particular for string parame-
++ ters. However, only a few terminfo capabilities use string parame-
++ ters (e.g., the ones used for programmable function keys).
++
++ The ncurses library checks usage of these capabilities, and returns
++ an error if the capability mishandles string parameters. But it
++ cannot check if a calling program provides strings in the right
++ places for the <STRONG>tparm</STRONG> calls.
++
++ The <STRONG><A HREF="tput.3x.html">tput(3x)</A></STRONG> program checks its use of these capabilities with a
++ table, so that it calls <STRONG>tparm</STRONG> correctly.
++
+
+ </PRE><H3><a name="h3-Special-TERM-treatment">Special TERM treatment</a></H3><PRE>
+ If configured to use the terminal-driver, e.g., for the MinGW port,
+diff --git a/doc/html/man/form.3x.html b/doc/html/man/form.3x.html
+index 422171c8..9551b458 100644
+--- a/doc/html/man/form.3x.html
++++ b/doc/html/man/form.3x.html
+@@ -248,7 +248,7 @@
+ <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> and related pages whose names begin "form_" for detailed
+ descriptions of the entry points.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/infocmp.1m.html b/doc/html/man/infocmp.1m.html
+index 81b95ac5..a72af34b 100644
+--- a/doc/html/man/infocmp.1m.html
++++ b/doc/html/man/infocmp.1m.html
+@@ -514,7 +514,7 @@
+
+ https://invisible-island.net/ncurses/tctest.html
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+ </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+diff --git a/doc/html/man/infotocap.1m.html b/doc/html/man/infotocap.1m.html
+index 1ea690cb..1ab52071 100644
+--- a/doc/html/man/infotocap.1m.html
++++ b/doc/html/man/infotocap.1m.html
+@@ -91,7 +91,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+ </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+diff --git a/doc/html/man/menu.3x.html b/doc/html/man/menu.3x.html
+index a8f2c961..8f4641bf 100644
+--- a/doc/html/man/menu.3x.html
++++ b/doc/html/man/menu.3x.html
+@@ -223,7 +223,7 @@
+ <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> and related pages whose names begin "menu_" for detailed
+ descriptions of the entry points.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/ncurses.3x.html b/doc/html/man/ncurses.3x.html
+index ab2b69d1..9cf27bf5 100644
+--- a/doc/html/man/ncurses.3x.html
++++ b/doc/html/man/ncurses.3x.html
+@@ -60,7 +60,7 @@
+ method of updating character screens with reasonable optimization.
+ This implementation is "new curses" (ncurses) and is the approved
+ replacement for 4.4BSD classic curses, which has been discontinued.
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+ The <STRONG>ncurses</STRONG> library emulates the curses library of System V Release 4
+ UNIX, and XPG4 (X/Open Portability Guide) curses (also known as XSI
+diff --git a/doc/html/man/ncurses6-config.1.html b/doc/html/man/ncurses6-config.1.html
+index 0f64e3de..9cd27f50 100644
+--- a/doc/html/man/ncurses6-config.1.html
++++ b/doc/html/man/ncurses6-config.1.html
+@@ -113,7 +113,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/panel.3x.html b/doc/html/man/panel.3x.html
+index 761a0fbd..0fd84723 100644
+--- a/doc/html/man/panel.3x.html
++++ b/doc/html/man/panel.3x.html
+@@ -281,7 +281,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>,
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+ </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+diff --git a/doc/html/man/tabs.1.html b/doc/html/man/tabs.1.html
+index 3e9f0f9d..228e17d8 100644
+--- a/doc/html/man/tabs.1.html
++++ b/doc/html/man/tabs.1.html
+@@ -252,7 +252,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/terminfo.5.html b/doc/html/man/terminfo.5.html
+index 23b27bfb..88986bf7 100644
+--- a/doc/html/man/terminfo.5.html
++++ b/doc/html/man/terminfo.5.html
+@@ -106,7 +106,7 @@
+ have, by specifying how to perform screen operations, and by specifying
+ padding requirements and initialization sequences.
+
+- This manual describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This manual describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+ </PRE><H3><a name="h3-Terminfo-Entry-Syntax">Terminfo Entry Syntax</a></H3><PRE>
+diff --git a/doc/html/man/tic.1m.html b/doc/html/man/tic.1m.html
+index cced3343..6c12f037 100644
+--- a/doc/html/man/tic.1m.html
++++ b/doc/html/man/tic.1m.html
+@@ -469,7 +469,7 @@
+ <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>, <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>, <STRONG><A HREF="toe.1m.html">toe(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>,
+ <STRONG><A HREF="term.5.html">term(5)</A></STRONG>. <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>. <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+ </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+diff --git a/doc/html/man/toe.1m.html b/doc/html/man/toe.1m.html
+index a9151184..38859624 100644
+--- a/doc/html/man/toe.1m.html
++++ b/doc/html/man/toe.1m.html
+@@ -171,7 +171,7 @@
+ <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>, <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>, <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>,
+ <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/tput.1.html b/doc/html/man/tput.1.html
+index 6a330a55..ee231640 100644
+--- a/doc/html/man/tput.1.html
++++ b/doc/html/man/tput.1.html
+@@ -545,7 +545,7 @@
+ </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+ <STRONG><A HREF="clear.1.html">clear(1)</A></STRONG>, <STRONG>stty(1)</STRONG>, <STRONG><A HREF="tabs.1.html">tabs(1)</A></STRONG>, <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>, <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/doc/html/man/tset.1.html b/doc/html/man/tset.1.html
+index c610a8c8..19396d91 100644
+--- a/doc/html/man/tset.1.html
++++ b/doc/html/man/tset.1.html
+@@ -391,7 +391,7 @@
+ <STRONG>csh(1)</STRONG>, <STRONG>sh(1)</STRONG>, <STRONG>stty(1)</STRONG>, <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>, <STRONG>tty(4)</STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>,
+ <STRONG>ttys(5)</STRONG>, <STRONG>environ(7)</STRONG>
+
+- This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
++ This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
+
+
+
+diff --git a/man/curs_termcap.3x b/man/curs_termcap.3x
+index e073d940..1630658d 100644
+--- a/man/curs_termcap.3x
++++ b/man/curs_termcap.3x
+@@ -1,5 +1,5 @@
+ .\"***************************************************************************
+-.\" Copyright 2018-2022,2022 Thomas E. Dickey *
++.\" Copyright 2018-2022,2023 Thomas E. Dickey *
+ .\" Copyright 1998-2017,2018 Free Software Foundation, Inc. *
+ .\" *
+ .\" Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -27,7 +27,7 @@
+ .\" authorization. *
+ .\"***************************************************************************
+ .\"
+-.\" $Id: curs_termcap.3x,v 1.56 2022/02/12 20:05:11 tom Exp $
++.\" $Id: curs_termcap.3x,v 1.57 2023/04/08 21:43:01 tom Exp $
+ .TH curs_termcap 3X ""
+ .ie \n(.g .ds `` \(lq
+ .el .ds `` ``
+@@ -173,7 +173,13 @@ It does this also for calls requiring only a single parameter.
+ In that case, the first parameter is merely a placeholder.
+ .bP
+ Normally the ncurses library is compiled with terminfo support.
+-In that case, \fBtgoto\fP uses \fBtparm\fP(3X) (a more capable formatter).
++In that case, \fBtgoto\fP uses an internal version of
++\fBtparm\fP(3X) (a more capable formatter).
++.IP
++With terminfo support, \fBtgoto\fP is able to use some of the terminfo
++features, but not all.
++In particular, it allows only numeric parameters;
++\fBtparm\fP supports string parameters.
+ .IP
+ However, \fBtparm\fP is not a \fItermcap\fP feature,
+ and portable \fItermcap\fP applications should not rely upon its availability.
+@@ -229,6 +235,20 @@ routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+ completion.
+ .PP
+ Routines that return pointers return \fBNULL\fP on error.
++.PP
++A few special cases apply:
++.bP
++If the terminal database has not been initialized,
++these return an error.
++.bP
++The calls with a string parameter (\fBtgoto\fP, \fBtputs\fP)
++check if the string is null, or cancelled.
++Those return an error.
++.bP
++A call to \fBtgoto\fP using a capability with string parameters is an error.
++.bP
++A call to \fBtgoto\fP using a capability with no parameters,
++or more than two is an error.
+ .SH BUGS
+ If you call \fBtgetstr\fP to fetch \fBca\fP or any other parameterized string,
+ be aware that it will be returned in terminfo notation, not the older and
+diff --git a/man/curs_terminfo.3x b/man/curs_terminfo.3x
+index 00ae1349..5ea01ee6 100644
+--- a/man/curs_terminfo.3x
++++ b/man/curs_terminfo.3x
+@@ -1,5 +1,5 @@
+ .\"***************************************************************************
+-.\" Copyright 2018-2022,2022 Thomas E. Dickey *
++.\" Copyright 2018-2022,2023 Thomas E. Dickey *
+ .\" Copyright 1998-2016,2017 Free Software Foundation, Inc. *
+ .\" *
+ .\" Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -27,7 +27,7 @@
+ .\" authorization. *
+ .\"***************************************************************************
+ .\"
+-.\" $Id: curs_terminfo.3x,v 1.82 2022/06/04 22:47:05 tom Exp $
++.\" $Id: curs_terminfo.3x,v 1.83 2023/04/08 22:54:21 tom Exp $
+ .TH curs_terminfo 3X ""
+ .ie \n(.g .ds `` \(lq
+ .el .ds `` ``
+@@ -86,6 +86,10 @@
+ .sp
+ \fBchar *tparm(const char *\fIstr\fB, ...);\fR
+ .br
++ \fIor\fP
++.br
++\fBchar *tparm(const char *\fIstr\fB, long \fIp1 ... \fBlong \fIp9\fB);\fR
++.sp
+ \fBint tputs(const char *\fIstr\fB, int \fIaffcnt\fB, int (*\fIputc\fB)(int));\fR
+ .br
+ \fBint putp(const char *\fIstr\fB);\fR
+@@ -463,6 +467,11 @@ if it cannot allocate enough memory, or
+ create the initial windows (stdscr, curscr, newscr).
+ Other error conditions are documented above.
+ .TP 5
++\fBtparm\fP
++returns a null if the capability would require unexpected parameters,
++e.g., too many, too few, or incorrect types
++(strings where integers are expected, or vice versa).
++.TP 5
+ \fBtputs\fP
+ returns an error if the string parameter is null.
+ It does not detect I/O errors:
+@@ -663,6 +672,34 @@ zeroes are fine for this purpose.
+ .IP
+ In response to review comments by Thomas E. Dickey,
+ X/Open Curses Issue 7 proposed the \fBtiparm\fP function in mid-2009.
++.IP
++While \fBtiparm\fP is always provided in ncurses,
++the older form is only available as a build-time configuration option.
++If not specially configured, \fBtparm\fP is the same as \fBtiparm\fP.
++.PP
++Both forms of \fBtparm\fP have drawbacks:
++.bP
++Most of the calls to \fBtparm\fP use only one or two parameters.
++Passing nine on each call is awkward.
++.IP
++Using \fBlong\fP for the numeric parameter type is a workaround
++to make the parameter use the same amount of stack as a pointer.
++That approach dates back to the mid-1980s, before C was standarized.
++Since then, there is a standard
++(and pointers are not required to fit in a long).
++.bP
++Providing the right number of parameters for a variadic function
++such as \fBtiparm\fP can be a problem, in particular for string parameters.
++However, only a few terminfo capabilities use string parameters
++(e.g., the ones used for programmable function keys).
++.IP
++The ncurses library checks usage of these capabilities,
++and returns an error if the capability mishandles string parameters.
++But it cannot check if a calling program provides strings in the right
++places for the \fBtparm\fP calls.
++.IP
++The \fBtput\fR(3X) program checks its use of these capabilities with a table,
++so that it calls \fBtparm\fP correctly.
+ .SS Special TERM treatment
+ .PP
+ If configured to use the terminal-driver,
+diff --git a/misc/terminfo.src b/misc/terminfo.src
+index ef78948a..07713a81 100644
+--- a/misc/terminfo.src
++++ b/misc/terminfo.src
+@@ -6,8 +6,8 @@
+ # Report bugs and new terminal descriptions to
+ # bug-ncurses@gnu.org
+ #
+-# $Revision: 1.1041 $
+-# $Date: 2022/12/29 20:11:56 $
++# $Revision: 1.1057 $
++# $Date: 2023/04/08 21:08:00 $
+ #
+ # The original header is preserved below for reference. It is noted that there
+ # is a "newer" version which differs in some cosmetic details (but actually
+@@ -7756,7 +7756,7 @@ alacritty+common|base fragment for alacritty,
+ use=xterm-basic, use=xterm+app, use=ansi+rep,
+ use=xterm+tmux, use=ecma+strikeout, use=xterm+sl-twm,
+ use=ecma+italics, use=xterm+pce2, use=xterm+pcc2,
+- use=xterm+pcf2, use=bracketed+paste,
++ use=xterm+pcf2, use=bracketed+paste, use=xterm+focus,
+
+ #### Kitty
+ # https://github.com/kovidgoyal/kitty
+@@ -27717,4 +27717,7 @@ v3220|LANPAR Vision II model 3220/3221/3222,
+ # + correct PS vs PE names in bracketed+paste (report by Bram Moolenaar)
+ # -TD
+ #
++# 2023-04-08
++# + add xterm+focus to alacritty+common (patch by Christian Duerr).
++#
+ ######## SHANTIH! SHANTIH! SHANTIH!
+diff --git a/ncurses/tinfo/lib_tgoto.c b/ncurses/tinfo/lib_tgoto.c
+index 9cf5e100..084a322f 100644
+--- a/ncurses/tinfo/lib_tgoto.c
++++ b/ncurses/tinfo/lib_tgoto.c
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2018-2019,2020 Thomas E. Dickey *
++ * Copyright 2018-2020,2023 Thomas E. Dickey *
+ * Copyright 2000-2008,2012 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -36,7 +36,7 @@
+ #include <ctype.h>
+ #include <termcap.h>
+
+-MODULE_ID("$Id: lib_tgoto.c,v 1.21 2020/05/27 23:55:56 tom Exp $")
++MODULE_ID("$Id: lib_tgoto.c,v 1.22 2023/04/08 13:48:58 tom Exp $")
+
+ #if !PURE_TERMINFO
+ static bool
+@@ -207,6 +207,14 @@ tgoto(const char *string, int x, int y)
+ result = tgoto_internal(string, x, y);
+ else
+ #endif
+- result = TIPARM_2(string, y, x);
++ if ((result = TIPARM_2(string, y, x)) == NULL) {
++ /*
++ * Because termcap did not provide a more general solution such as
++ * tparm(), it was necessary to handle single-parameter capabilities
++ * using tgoto(). The internal _nc_tiparm() function returns a NULL
++ * for that case; retry for the single-parameter case.
++ */
++ result = TIPARM_1(string, y);
++ }
+ returnPtr(result);
+ }
+diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c
+index d9bdfd8f..8988a3d4 100644
+--- a/ncurses/tinfo/lib_tparm.c
++++ b/ncurses/tinfo/lib_tparm.c
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2018-2020,2021 Thomas E. Dickey *
++ * Copyright 2018-2021,2023 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -53,7 +53,7 @@
+ #include <ctype.h>
+ #include <tic.h>
+
+-MODULE_ID("$Id: lib_tparm.c,v 1.137 2021/11/20 23:29:15 tom Exp $")
++MODULE_ID("$Id: lib_tparm.c,v 1.141 2023/04/08 18:24:18 tom Exp $")
+
+ /*
+ * char *
+@@ -1086,6 +1086,64 @@ tparam_internal(TPARM_STATE *tps, const char *string, TPARM_DATA *data)
+ return (TPS(out_buff));
+ }
+
++#ifdef CUR
++/*
++ * Only a few standard capabilities accept string parameters. The others that
++ * are parameterized accept only numeric parameters.
++ */
++static bool
++check_string_caps(TPARM_DATA *data, const char *string)
++{
++ bool result = FALSE;
++
++#define CHECK_CAP(name) (VALID_STRING(name) && !strcmp(name, string))
++
++ /*
++ * Disallow string parameters unless we can check them against a terminal
++ * description.
++ */
++ if (cur_term != NULL) {
++ int want_type = 0;
++
++ if (CHECK_CAP(pkey_key))
++ want_type = 2; /* function key #1, type string #2 */
++ else if (CHECK_CAP(pkey_local))
++ want_type = 2; /* function key #1, execute string #2 */
++ else if (CHECK_CAP(pkey_xmit))
++ want_type = 2; /* function key #1, transmit string #2 */
++ else if (CHECK_CAP(plab_norm))
++ want_type = 2; /* label #1, show string #2 */
++ else if (CHECK_CAP(pkey_plab))
++ want_type = 6; /* function key #1, type string #2, show string #3 */
++#if NCURSES_XNAMES
++ else {
++ char *check;
++
++ check = tigetstr("Cs");
++ if (CHECK_CAP(check))
++ want_type = 1; /* style #1 */
++
++ check = tigetstr("Ms");
++ if (CHECK_CAP(check))
++ want_type = 3; /* storage unit #1, content #2 */
++ }
++#endif
++
++ if (want_type == data->tparm_type) {
++ result = TRUE;
++ } else {
++ T(("unexpected string-parameter"));
++ }
++ }
++ return result;
++}
++
++#define ValidCap() (myData.tparm_type == 0 || \
++ check_string_caps(&myData, string))
++#else
++#define ValidCap() 1
++#endif
++
+ #if NCURSES_TPARM_VARARGS
+
+ NCURSES_EXPORT(char *)
+@@ -1100,7 +1158,7 @@ tparm(const char *string, ...)
+ tps->tname = "tparm";
+ #endif /* TRACE */
+
+- if (tparm_setup(cur_term, string, &myData) == OK) {
++ if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
+ va_list ap;
+
+ va_start(ap, string);
+@@ -1135,7 +1193,7 @@ tparm(const char *string,
+ tps->tname = "tparm";
+ #endif /* TRACE */
+
+- if (tparm_setup(cur_term, string, &myData) == OK) {
++ if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
+
+ myData.param[0] = a1;
+ myData.param[1] = a2;
+@@ -1166,7 +1224,7 @@ tiparm(const char *string, ...)
+ tps->tname = "tiparm";
+ #endif /* TRACE */
+
+- if (tparm_setup(cur_term, string, &myData) == OK) {
++ if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
+ va_list ap;
+
+ va_start(ap, string);
+@@ -1179,7 +1237,25 @@ tiparm(const char *string, ...)
+ }
+
+ /*
+- * The internal-use flavor ensures that the parameters are numbers, not strings
++ * The internal-use flavor ensures that parameters are numbers, not strings.
++ * In addition to ensuring that they are numbers, it ensures that the parameter
++ * count is consistent with intended usage.
++ *
++ * Unlike the general-purpose tparm/tiparm, these internal calls are fairly
++ * well defined:
++ *
++ * expected == 0 - not applicable
++ * expected == 1 - set color, or vertical/horizontal addressing
++ * expected == 2 - cursor addressing
++ * expected == 4 - initialize color or color pair
++ * expected == 9 - set attributes
++ *
++ * Only for the last case (set attributes) should a parameter be optional.
++ * Also, a capability which calls for more parameters than expected should be
++ * ignored.
++ *
++ * Return a null if the parameter-checks fail. Otherwise, return a pointer to
++ * the formatted capability string.
+ */
+ NCURSES_EXPORT(char *)
+ _nc_tiparm(int expected, const char *string, ...)
+@@ -1189,22 +1265,36 @@ _nc_tiparm(int expected, const char *string, ...)
+ char *result = NULL;
+
+ _nc_tparm_err = 0;
++ T((T_CALLED("_nc_tiparm(%d, %s, ...)"), expected, _nc_visbuf(string)));
+ #ifdef TRACE
+ tps->tname = "_nc_tiparm";
+ #endif /* TRACE */
+
+- if (tparm_setup(cur_term, string, &myData) == OK
+- && myData.num_actual <= expected
+- && myData.tparm_type == 0) {
+- va_list ap;
++ if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
++ if (myData.num_actual == 0) {
++ T(("missing parameter%s, expected %s%d",
++ expected > 1 ? "s" : "",
++ expected == 9 ? "up to " : "",
++ expected));
++ } else if (myData.num_actual > expected) {
++ T(("too many parameters, have %d, expected %d",
++ myData.num_actual,
++ expected));
++ } else if (expected != 9 && myData.num_actual != expected) {
++ T(("expected %d parameters, have %d",
++ myData.num_actual,
++ expected));
++ } else {
++ va_list ap;
+
+- va_start(ap, string);
+- tparm_copy_valist(&myData, FALSE, ap);
+- va_end(ap);
++ va_start(ap, string);
++ tparm_copy_valist(&myData, FALSE, ap);
++ va_end(ap);
+
+- result = tparam_internal(tps, string, &myData);
++ result = tparam_internal(tps, string, &myData);
++ }
+ }
+- return result;
++ returnPtr(result);
+ }
+
+ /*
+diff --git a/ncurses/tinfo/read_entry.c b/ncurses/tinfo/read_entry.c
+index 2b1875ed..9c6e9b0e 100644
+--- a/ncurses/tinfo/read_entry.c
++++ b/ncurses/tinfo/read_entry.c
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2018-2021,2022 Thomas E. Dickey *
++ * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -42,7 +42,7 @@
+
+ #include <tic.h>
+
+-MODULE_ID("$Id: read_entry.c,v 1.164 2022/05/08 00:11:44 tom Exp $")
++MODULE_ID("$Id: read_entry.c,v 1.165 2023/04/08 20:14:49 tom Exp $")
+
+ #define MyNumber(n) (short) LOW_MSB(n)
+
+@@ -323,6 +323,9 @@ _nc_read_termtype(TERMTYPE2 *ptr, char *buffer, int limit)
+ || bool_count < 0
+ || num_count < 0
+ || str_count < 0
++ || bool_count > BOOLCOUNT
++ || num_count > NUMCOUNT
++ || str_count > STRCOUNT
+ || str_size < 0) {
+ returnDB(TGETENT_NO);
+ }
+diff --git a/package/ncurses.spec b/package/ncurses.spec
+index 72d4e245..a7572864 100644
+--- a/package/ncurses.spec
++++ b/package/ncurses.spec
+@@ -1,7 +1,7 @@
+ Summary: shared libraries for terminal handling
+ Name: ncurses6
+ Version: 6.4
+-Release: 20221231
++Release: 20230408
+ License: X11
+ Group: Development/Libraries
+ Source: ncurses-%{version}-%{release}.tgz
+diff --git a/package/ncursest.spec b/package/ncursest.spec
+index 8729842d..f1d073d1 100644
+--- a/package/ncursest.spec
++++ b/package/ncursest.spec
+@@ -1,7 +1,7 @@
+ Summary: Curses library with POSIX thread support.
+ Name: ncursest6
+ Version: 6.4
+-Release: 20221231
++Release: 20230408
+ License: X11
+ Group: Development/Libraries
+ Source: ncurses-%{version}-%{release}.tgz
+diff --git a/progs/tic.c b/progs/tic.c
+index 93a0b491..7ae61677 100644
+--- a/progs/tic.c
++++ b/progs/tic.c
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2018-2021,2022 Thomas E. Dickey *
++ * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 1998-2017,2018 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -49,7 +49,7 @@
+ #include <parametrized.h>
+ #include <transform.h>
+
+-MODULE_ID("$Id: tic.c,v 1.320 2022/09/17 18:55:28 tom Exp $")
++MODULE_ID("$Id: tic.c,v 1.321 2023/04/08 15:51:57 tom Exp $")
+
+ #define STDIN_NAME "<stdin>"
+
+@@ -2270,9 +2270,15 @@ check_1_infotocap(const char *name, NCURSES_CONST char *value, int count)
+
+ _nc_reset_tparm(NULL);
+ switch (actual) {
++ case Str:
++ result = TPARM_1(value, strings[1]);
++ break;
+ case Num_Str:
+ result = TPARM_2(value, numbers[1], strings[2]);
+ break;
++ case Str_Str:
++ result = TPARM_2(value, strings[1], strings[2]);
++ break;
+ case Num_Str_Str:
+ result = TPARM_3(value, numbers[1], strings[2], strings[3]);
+ break;
+diff --git a/progs/tparm_type.c b/progs/tparm_type.c
+index 3da4a077..4fed96a5 100644
+--- a/progs/tparm_type.c
++++ b/progs/tparm_type.c
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2020 Thomas E. Dickey *
++ * Copyright 2020,2023 Thomas E. Dickey *
+ * Copyright 2014,2015 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -33,7 +33,7 @@
+
+ #include <tparm_type.h>
+
+-MODULE_ID("$Id: tparm_type.c,v 1.4 2020/10/24 17:30:32 tom Exp $")
++MODULE_ID("$Id: tparm_type.c,v 1.5 2023/04/08 15:57:01 tom Exp $")
+
+ /*
+ * Lookup the type of call we should make to tparm(). This ignores the actual
+@@ -47,6 +47,7 @@ tparm_type(const char *name)
+ {code, {longname} }, \
+ {code, {ti} }, \
+ {code, {tc} }
++#define XD(code, onlyname) TD(code, onlyname, onlyname, onlyname)
+ TParams result = Numbers;
+ /* *INDENT-OFF* */
+ static const struct {
+@@ -58,6 +59,10 @@ tparm_type(const char *name)
+ TD(Num_Str, "pkey_xmit", "pfx", "px"),
+ TD(Num_Str, "plab_norm", "pln", "pn"),
+ TD(Num_Str_Str, "pkey_plab", "pfxl", "xl"),
++#if NCURSES_XNAMES
++ XD(Str, "Cs"),
++ XD(Str_Str, "Ms"),
++#endif
+ };
+ /* *INDENT-ON* */
+
+@@ -80,12 +85,16 @@ guess_tparm_type(int nparam, char **p_is_s)
+ case 1:
+ if (!p_is_s[0])
+ result = Numbers;
++ if (p_is_s[0])
++ result = Str;
+ break;
+ case 2:
+ if (!p_is_s[0] && !p_is_s[1])
+ result = Numbers;
+ if (!p_is_s[0] && p_is_s[1])
+ result = Num_Str;
++ if (p_is_s[0] && p_is_s[1])
++ result = Str_Str;
+ break;
+ case 3:
+ if (!p_is_s[0] && !p_is_s[1] && !p_is_s[2])
+diff --git a/progs/tparm_type.h b/progs/tparm_type.h
+index 7c102a30..2f7bd077 100644
+--- a/progs/tparm_type.h
++++ b/progs/tparm_type.h
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2020 Thomas E. Dickey *
++ * Copyright 2020,2023 Thomas E. Dickey *
+ * Copyright 2014 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -32,7 +32,7 @@
+ ****************************************************************************/
+
+ /*
+- * $Id: tparm_type.h,v 1.3 2020/10/24 17:11:33 tom Exp $
++ * $Id: tparm_type.h,v 1.4 2023/04/08 15:41:20 tom Exp $
+ *
+ * determine expected/actual number of parameters to setup for tparm
+ */
+@@ -45,8 +45,10 @@
+ typedef enum {
+ Other = -1
+ ,Numbers = 0
++ ,Str
+ ,Num_Str
+ ,Num_Str_Str
++ ,Str_Str
+ } TParams;
+
+ extern TParams tparm_type(const char *name);
+diff --git a/progs/tput.c b/progs/tput.c
+index 4cd0c5ba..41508b72 100644
+--- a/progs/tput.c
++++ b/progs/tput.c
+@@ -1,5 +1,5 @@
+ /****************************************************************************
+- * Copyright 2018-2021,2022 Thomas E. Dickey *
++ * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+@@ -47,12 +47,15 @@
+ #include <transform.h>
+ #include <tty_settings.h>
+
+-MODULE_ID("$Id: tput.c,v 1.99 2022/02/26 23:19:31 tom Exp $")
++MODULE_ID("$Id: tput.c,v 1.102 2023/04/08 16:26:36 tom Exp $")
+
+ #define PUTS(s) fputs(s, stdout)
+
+ const char *_nc_progname = "tput";
+
++static bool opt_v = FALSE; /* quiet, do not show warnings */
++static bool opt_x = FALSE; /* clear scrollback if possible */
++
+ static bool is_init = FALSE;
+ static bool is_reset = FALSE;
+ static bool is_clear = FALSE;
+@@ -81,6 +84,7 @@ usage(const char *optstring)
+ KEEP(" -S << read commands from standard input")
+ KEEP(" -T TERM use this instead of $TERM")
+ KEEP(" -V print curses-version")
++ KEEP(" -v verbose, show warnings")
+ KEEP(" -x do not try to clear scrollback")
+ KEEP("")
+ KEEP("Commands:")
+@@ -148,7 +152,7 @@ exit_code(int token, int value)
+ * Returns nonzero on error.
+ */
+ static int
+-tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
++tput_cmd(int fd, TTY * settings, int argc, char **argv, int *used)
+ {
+ NCURSES_CONST char *name;
+ char *s;
+@@ -231,7 +235,9 @@ tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
+ } else if (VALID_STRING(s)) {
+ if (argc > 1) {
+ int k;
++ int narg;
+ int analyzed;
++ int provided;
+ int popcount;
+ long numbers[1 + NUM_PARM];
+ char *strings[1 + NUM_PARM];
+@@ -271,14 +277,45 @@ tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
+
+ popcount = 0;
+ _nc_reset_tparm(NULL);
++ /*
++ * Count the number of numeric parameters which are provided.
++ */
++ provided = 0;
++ for (narg = 1; narg < argc; ++narg) {
++ char *ending = NULL;
++ long check = strtol(argv[narg], &ending, 10);
++ if (check < 0 || ending == argv[narg] || *ending != '\0')
++ break;
++ provided = narg;
++ }
+ switch (paramType) {
++ case Str:
++ s = TPARM_1(s, strings[1]);
++ analyzed = 1;
++ if (provided == 0 && argc >= 1)
++ provided++;
++ break;
++ case Str_Str:
++ s = TPARM_2(s, strings[1], strings[2]);
++ analyzed = 2;
++ if (provided == 0 && argc >= 1)
++ provided++;
++ if (provided == 1 && argc >= 2)
++ provided++;
++ break;
+ case Num_Str:
+ s = TPARM_2(s, numbers[1], strings[2]);
+ analyzed = 2;
++ if (provided == 1 && argc >= 2)
++ provided++;
+ break;
+ case Num_Str_Str:
+ s = TPARM_3(s, numbers[1], strings[2], strings[3]);
+ analyzed = 3;
++ if (provided == 1 && argc >= 2)
++ provided++;
++ if (provided == 2 && argc >= 3)
++ provided++;
+ break;
+ case Numbers:
+ analyzed = _nc_tparm_analyze(NULL, s, p_is_s, &popcount);
+@@ -316,7 +353,13 @@ tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
+ if (analyzed < popcount) {
+ analyzed = popcount;
+ }
+- *used += analyzed;
++ if (opt_v && (analyzed != provided)) {
++ fprintf(stderr, "%s: %s parameters for \"%s\"\n",
++ _nc_progname,
++ (analyzed < provided ? "extra" : "missing"),
++ argv[0]);
++ }
++ *used += provided;
+ }
+
+ /* use putp() in order to perform padding */
+@@ -339,7 +382,6 @@ main(int argc, char **argv)
+ int used;
+ TTY old_settings;
+ TTY tty_settings;
+- bool opt_x = FALSE; /* clear scrollback if possible */
+ bool is_alias;
+ bool need_tty;
+
+@@ -348,7 +390,7 @@ main(int argc, char **argv)
+
+ term = getenv("TERM");
+
+- while ((c = getopt(argc, argv, is_alias ? "T:Vx" : "ST:Vx")) != -1) {
++ while ((c = getopt(argc, argv, is_alias ? "T:Vvx" : "ST:Vvx")) != -1) {
+ switch (c) {
+ case 'S':
+ cmdline = FALSE;
+@@ -361,6 +403,9 @@ main(int argc, char **argv)
+ case 'V':
+ puts(curses_version());
+ ExitProgram(EXIT_SUCCESS);
++ case 'v': /* verbose */
++ opt_v = TRUE;
++ break;
+ case 'x': /* do not try to clear scrollback */
+ opt_x = TRUE;
+ break;
+@@ -404,7 +449,7 @@ main(int argc, char **argv)
+ usage(NULL);
+ while (argc > 0) {
+ tty_settings = old_settings;
+- code = tput_cmd(fd, &tty_settings, opt_x, argc, argv, &used);
++ code = tput_cmd(fd, &tty_settings, argc, argv, &used);
+ if (code != 0)
+ break;
+ argc -= used;
+@@ -439,7 +484,7 @@ main(int argc, char **argv)
+ while (argnum > 0) {
+ int code;
+ tty_settings = old_settings;
+- code = tput_cmd(fd, &tty_settings, opt_x, argnum, argnow, &used);
++ code = tput_cmd(fd, &tty_settings, argnum, argnow, &used);
+ if (code != 0) {
+ if (result == 0)
+ result = ErrSystem(0); /* will return value >4 */
+--
+2.17.1
+