forked from pool/ncurses
520 lines
15 KiB
Diff
520 lines
15 KiB
Diff
--- NEWS
|
|
+++ NEWS 2007-04-07 18:55:45.000000000 +0200
|
|
@@ -103,6 +103,36 @@ it is not possible to add this informati
|
|
+ modify shared-library rules to allow FreeBSD 3.x to use rpath.
|
|
+ update config.guess, config.sub
|
|
|
|
+20060407
|
|
+ > other fixes prompted by inspection for Coverity report:
|
|
+ + modify ifdef's for c++ binding to use try/catch/throw statements
|
|
+ + add a null-pointer check in tack/ansi.c request_cfss()
|
|
+ + fix a memory leak in ncurses/base/wresize.c
|
|
+ + corrected check for valid memu/meml capabilities in
|
|
+ progs/dump_entry.c when handling V_HPUX case.
|
|
+ > fixes based on Coverity report:
|
|
+ + remove dead code in test/bs.c
|
|
+ + remove dead code in test/demo_defkey.c
|
|
+ + remove an unused assignment in progs/infocmp.c
|
|
+ + fix a limit check in tack/ansi.c tools_charset()
|
|
+ + fix tack/ansi.c tools_status() to perform the VT320/VT420
|
|
+ tests in request_cfss(). The function had exited too soon.
|
|
+ + fix a memory leak in tic.c's make_namelist()
|
|
+ + fix a couple of places in tack/output.c which did not check for EOF.
|
|
+ + fix a loop-condition in test/bs.c
|
|
+ + add index checks in lib_color.c for color palettes
|
|
+ + add index checks in progs/dump_entry.c for version_filter() handling
|
|
+ of V_BSD case.
|
|
+ + fix a possible null-pointer dereference in copywin()
|
|
+ + fix a possible null-pointer dereference in waddchnstr()
|
|
+ + add a null-pointer check in _nc_expand_try()
|
|
+ + add a null-pointer check in tic.c's make_namelist()
|
|
+ + add a null-pointer check in _nc_expand_try()
|
|
+ + add null-pointer checks in test/cardfile.c
|
|
+ + fix a double-free in ncurses/tinfo/trim_sgr0.c
|
|
+ + fix a double-free in ncurses/base/wresize.c
|
|
+ + add try/catch block to c++/cursesmain.cc
|
|
+
|
|
20061217 5.6 release for upload to ftp.gnu.org
|
|
|
|
20061217
|
|
--- configure
|
|
+++ configure 2007-04-07 00:54:52.000000000 +0200
|
|
@@ -13892,7 +13892,7 @@ ac_link='$CXX -o conftest$ac_exeext $CXX
|
|
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
|
ac_main_return=return
|
|
|
|
-for ac_header in typeinfo
|
|
+for ac_header in iostream typeinfo
|
|
do
|
|
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
|
echo "$as_me:13893: checking for $ac_header" >&5
|
|
--- configure.in
|
|
+++ configure.in 2007-04-07 00:53:21.000000000 +0200
|
|
@@ -1210,7 +1210,7 @@ if test -n "$CXX" ; then
|
|
;;
|
|
esac
|
|
|
|
- AC_CHECK_HEADERS(typeinfo)
|
|
+ AC_CHECK_HEADERS(iostream typeinfo)
|
|
|
|
CF_BOOL_DECL
|
|
CF_BOOL_SIZE
|
|
--- c++/cursesmain.cc
|
|
+++ c++/cursesmain.cc 2008-04-09 17:57:56.093616466 +0200
|
|
@@ -34,6 +34,13 @@
|
|
#include "internal.h"
|
|
#include "cursesapp.h"
|
|
|
|
+#if CPP_HAS_TRY_CATCH && HAVE_IOSTREAM
|
|
+#include <iostream>
|
|
+#else
|
|
+#undef CPP_HAS_TRY_CATCH
|
|
+#define CPP_HAS_TRY_CATCH 0
|
|
+#endif
|
|
+
|
|
MODULE_ID("$Id: cursesmain.cc,v 1.13 2007/01/27 20:29:27 tom Exp $")
|
|
|
|
#if HAVE_LOCALE_H
|
|
@@ -62,8 +69,20 @@ int main(int argc, char* argv[])
|
|
|
|
A->handleArgs(argc,argv);
|
|
::endwin();
|
|
+#if CPP_HAS_TRY_CATCH
|
|
+ try {
|
|
+ res = (*A)();
|
|
+ ::endwin();
|
|
+ }
|
|
+ catch(const NCursesException &e) {
|
|
+ ::endwin();
|
|
+ std::cerr << e.message << std::endl;
|
|
+ res = e.errorno;
|
|
+ }
|
|
+#else
|
|
res = (*A)();
|
|
::endwin();
|
|
+#endif
|
|
#if NO_LEAKS
|
|
delete A;
|
|
_nc_free_and_exit(res);
|
|
--- c++/cursesp.h
|
|
+++ c++/cursesp.h 2007-04-07 02:47:22.000000000 +0200
|
|
@@ -83,7 +83,7 @@ protected:
|
|
return uptr->m_user;
|
|
}
|
|
|
|
- void OnError (int err) const THROWS((NCursesPanelException))
|
|
+ void OnError (int err) const THROWS(NCursesPanelException)
|
|
{
|
|
if (err==ERR)
|
|
THROW(new NCursesPanelException (this, err));
|
|
--- c++/etip.h.in
|
|
+++ c++/etip.h.in 2007-04-07 02:49:39.000000000 +0200
|
|
@@ -330,23 +330,33 @@ public:
|
|
inline void THROW(const NCursesException *e) {
|
|
#if defined(__GNUG__) && defined(__EXCEPTIONS)
|
|
# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
|
|
- (*lib_error_handler)(e?e->classname():"",e?e->message:"");
|
|
+ (*lib_error_handler)(e ? e->classname() : "", e ? e->message : "");
|
|
#else
|
|
- throw *e;
|
|
+#define CPP_HAS_TRY_CATCH 1
|
|
#endif
|
|
#elif defined(__SUNPRO_CC)
|
|
# if !defined(__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT < 5)
|
|
genericerror(1, ((e != 0) ? (char *)(e->message) : ""));
|
|
#else
|
|
- throw *e;
|
|
+#define CPP_HAS_TRY_CATCH 1
|
|
#endif
|
|
#else
|
|
if (e)
|
|
cerr << e->message << endl;
|
|
exit(0);
|
|
#endif
|
|
-}
|
|
|
|
-#define THROWS(s)
|
|
+#ifndef CPP_HAS_TRY_CATCH
|
|
+#define CPP_HAS_TRY_CATCH 0
|
|
+#define NCURSES_CPP_TRY /* nothing */
|
|
+#define NCURSES_CPP_CATCH(e) if (false)
|
|
+#define THROWS(s) /* nothing */
|
|
+#elif CPP_HAS_TRY_CATCH
|
|
+ throw *e;
|
|
+#define NCURSES_CPP_TRY try
|
|
+#define NCURSES_CPP_CATCH(e) catch(e)
|
|
+#define THROWS(s) throw(s)
|
|
+#endif
|
|
+}
|
|
|
|
#endif /* NCURSES_ETIP_H_incl */
|
|
--- include/ncurses_defs
|
|
+++ include/ncurses_defs 2007-04-07 00:54:16.000000000 +0200
|
|
@@ -68,6 +68,7 @@ HAVE_GPM_H
|
|
HAVE_GPP_BUILTIN_H
|
|
HAVE_GXX_BUILTIN_H
|
|
HAVE_HAS_KEY
|
|
+HAVE_IOSTREAM
|
|
HAVE_ISASCII
|
|
HAVE_ISSETUGID
|
|
HAVE_LANGINFO_CODESET
|
|
--- ncurses/base/lib_addstr.c
|
|
+++ ncurses/base/lib_addstr.c 2007-04-04 02:41:25.000000000 +0200
|
|
@@ -80,8 +80,7 @@ waddnstr(WINDOW *win, const char *astr,
|
|
NCURSES_EXPORT(int)
|
|
waddchnstr(WINDOW *win, const chtype *astr, int n)
|
|
{
|
|
- NCURSES_SIZE_T y = win->_cury;
|
|
- NCURSES_SIZE_T x = win->_curx;
|
|
+ NCURSES_SIZE_T y, x;
|
|
int code = OK;
|
|
int i;
|
|
struct ldat *line;
|
|
@@ -91,6 +90,8 @@ waddchnstr(WINDOW *win, const chtype *as
|
|
if (!win)
|
|
returnCode(ERR);
|
|
|
|
+ y = win->_cury;
|
|
+ x = win->_curx;
|
|
if (n < 0) {
|
|
const chtype *str;
|
|
n = 0;
|
|
--- ncurses/base/lib_color.c
|
|
+++ ncurses/base/lib_color.c 2007-04-04 22:32:04.000000000 +0200
|
|
@@ -56,7 +56,10 @@ NCURSES_EXPORT_VAR(int) COLORS = 0;
|
|
|
|
#define TYPE_CALLOC(type,elts) typeCalloc(type, (unsigned)(elts))
|
|
|
|
+#define MAX_PALETTE 8
|
|
+
|
|
#define OkColorHi(n) (((n) < COLORS) && ((n) < max_colors))
|
|
+#define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE)
|
|
|
|
/*
|
|
* Given a RGB range of 0..1000, we'll normally set the individual values
|
|
@@ -162,10 +165,10 @@ init_color_table(void)
|
|
|
|
tp = (hue_lightness_saturation) ? hls_palette : cga_palette;
|
|
for (n = 0; n < COLORS; n++) {
|
|
- if (n < 8) {
|
|
+ if (InPalette(n)) {
|
|
SP->_color_table[n] = tp[n];
|
|
} else {
|
|
- SP->_color_table[n] = tp[n % 8];
|
|
+ SP->_color_table[n] = tp[n % MAX_PALETTE];
|
|
if (hue_lightness_saturation) {
|
|
SP->_color_table[n].green = 100;
|
|
} else {
|
|
@@ -365,7 +368,7 @@ init_pair(short pair, short f, short b)
|
|
if (GET_SCREEN_PAIR(SP) == pair)
|
|
SET_SCREEN_PAIR(SP, (chtype) (~0)); /* force attribute update */
|
|
|
|
- if (initialize_pair) {
|
|
+ if (initialize_pair && InPalette(f) && InPalette(b)) {
|
|
const color_t *tp = hue_lightness_saturation ? hls_palette : cga_palette;
|
|
|
|
TR(TRACE_ATTRS,
|
|
--- ncurses/base/lib_overlay.c
|
|
+++ ncurses/base/lib_overlay.c 2007-04-04 02:40:12.000000000 +0200
|
|
@@ -139,8 +139,8 @@ copywin(const WINDOW *src, WINDOW *dst,
|
|
{
|
|
int sx, sy, dx, dy;
|
|
bool touched;
|
|
- attr_t bk = AttrOf(dst->_nc_bkgd);
|
|
- attr_t mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0);
|
|
+ attr_t bk;
|
|
+ attr_t mask;
|
|
|
|
T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"),
|
|
src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over));
|
|
@@ -148,6 +148,9 @@ copywin(const WINDOW *src, WINDOW *dst,
|
|
if (!src || !dst)
|
|
returnCode(ERR);
|
|
|
|
+ bk = AttrOf(dst->_nc_bkgd);
|
|
+ mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0);
|
|
+
|
|
/* make sure rectangle exists in source */
|
|
if ((sminrow + dmaxrow - dminrow) > (src->_maxy + 1) ||
|
|
(smincol + dmaxcol - dmincol) > (src->_maxx + 1)) {
|
|
--- ncurses/base/tries.c
|
|
+++ ncurses/base/tries.c 2007-04-03 22:58:30.000000000 +0200
|
|
@@ -68,7 +68,7 @@ _nc_expand_try(TRIES * tree, unsigned co
|
|
}
|
|
}
|
|
if (result != 0) {
|
|
- if ((result[len] = ptr->ch) == 0)
|
|
+ if (ptr != 0 && (result[len] = ptr->ch) == 0)
|
|
*((unsigned char *) (result + len)) = 128;
|
|
#ifdef TRACE
|
|
if (len == 0 && _nc_tracing != 0)
|
|
--- ncurses/base/wresize.c
|
|
+++ ncurses/base/wresize.c 2007-04-04 22:28:42.000000000 +0200
|
|
@@ -38,7 +38,7 @@ static int
|
|
cleanup_lines(struct ldat *data, int length)
|
|
{
|
|
while (--length >= 0)
|
|
- free(data->text);
|
|
+ free(data[length].text);
|
|
free(data);
|
|
return ERR;
|
|
}
|
|
--- ncurses/tinfo/trim_sgr0.c
|
|
+++ ncurses/tinfo/trim_sgr0.c 2007-04-04 21:29:01.000000000 +0200
|
|
@@ -247,9 +247,7 @@ _nc_trim_sgr0(TERMTYPE *tp)
|
|
if (!rewrite_sgr(on, enter_alt_charset_mode)
|
|
|| !rewrite_sgr(off, exit_alt_charset_mode)
|
|
|| !rewrite_sgr(end, exit_alt_charset_mode)) {
|
|
- FreeIfNeeded(on);
|
|
FreeIfNeeded(off);
|
|
- FreeIfNeeded(end);
|
|
} else if (similar_sgr(off, end)
|
|
&& !similar_sgr(off, on)) {
|
|
TR(TRACE_DATABASE, ("adjusting sgr(9:off) : %s", _nc_visbuf(off)));
|
|
@@ -315,8 +313,8 @@ _nc_trim_sgr0(TERMTYPE *tp)
|
|
*/
|
|
free(off);
|
|
}
|
|
- free(end);
|
|
- free(on);
|
|
+ FreeIfNeeded(end);
|
|
+ FreeIfNeeded(on);
|
|
} else {
|
|
/*
|
|
* Possibly some applications are confused if sgr0 contains rmacs,
|
|
--- progs/dump_entry.c
|
|
+++ progs/dump_entry.c 2007-04-07 17:51:47.000000000 +0200
|
|
@@ -352,14 +352,17 @@ version_filter(PredType type, PredIdx id
|
|
}
|
|
break;
|
|
|
|
+#define is_termcap(type) (idx < (int) sizeof(type##_from_termcap) && \
|
|
+ type##_from_termcap[idx])
|
|
+
|
|
case V_BSD: /* BSD */
|
|
switch (type) {
|
|
case BOOLEAN:
|
|
- return bool_from_termcap[idx];
|
|
+ return is_termcap(bool);
|
|
case NUMBER:
|
|
- return num_from_termcap[idx];
|
|
+ return is_termcap(num);
|
|
case STRING:
|
|
- return str_from_termcap[idx];
|
|
+ return is_termcap(str);
|
|
}
|
|
break;
|
|
}
|
|
@@ -788,11 +791,11 @@ fmt_entry(TERMTYPE *tterm,
|
|
* Much more work should be done on this to support dumping termcaps.
|
|
*/
|
|
if (tversion == V_HPUX) {
|
|
- if (memory_lock) {
|
|
+ if (VALID_STRING(memory_lock)) {
|
|
(void) sprintf(buffer, "meml=%s", memory_lock);
|
|
WRAP_CONCAT;
|
|
}
|
|
- if (memory_unlock) {
|
|
+ if (VALID_STRING(memory_unlock)) {
|
|
(void) sprintf(buffer, "memu=%s", memory_unlock);
|
|
WRAP_CONCAT;
|
|
}
|
|
--- progs/infocmp.c
|
|
+++ progs/infocmp.c 2007-04-04 02:51:49.000000000 +0200
|
|
@@ -1084,7 +1084,6 @@ dump_initializers(TERMTYPE *term)
|
|
}
|
|
*tp++ = '"';
|
|
*tp = '\0';
|
|
- size += (strlen(term->Strings[n]) + 1);
|
|
(void) printf("static char %-20s[] = %s;\n",
|
|
string_variable(ExtStrname(term, n, strnames)), buf);
|
|
}
|
|
--- progs/tic.c
|
|
+++ progs/tic.c 2007-04-07 17:20:35.000000000 +0200
|
|
@@ -353,11 +353,24 @@ open_input(const char *filename)
|
|
return fp;
|
|
}
|
|
|
|
+#if NO_LEAKS
|
|
+static void
|
|
+free_namelist(char **src)
|
|
+{
|
|
+ if (src != 0) {
|
|
+ int n;
|
|
+ for (n = 0; src[n] != 0; ++n)
|
|
+ free (src[n]);
|
|
+ free (src);
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
/* Parse the "-e" option-value into a list of names */
|
|
-static const char **
|
|
+static char **
|
|
make_namelist(char *src)
|
|
{
|
|
- const char **dst = 0;
|
|
+ char **dst = 0;
|
|
|
|
char *s, *base;
|
|
unsigned pass, n, nn;
|
|
@@ -374,11 +387,13 @@ make_namelist(char *src)
|
|
if ((s = stripped(buffer)) != 0) {
|
|
if (dst != 0)
|
|
dst[nn] = s;
|
|
+ else
|
|
+ free(s);
|
|
nn++;
|
|
}
|
|
}
|
|
if (pass == 1) {
|
|
- dst = typeCalloc(const char *, nn + 1);
|
|
+ dst = typeCalloc(char *, nn + 1);
|
|
rewind(fp);
|
|
}
|
|
}
|
|
@@ -401,10 +416,10 @@ make_namelist(char *src)
|
|
break;
|
|
}
|
|
if (pass == 1)
|
|
- dst = typeCalloc(const char *, nn + 1);
|
|
+ dst = typeCalloc(char *, nn + 1);
|
|
}
|
|
}
|
|
- if (showsummary) {
|
|
+ if (showsummary && (dst != 0)) {
|
|
fprintf(log_fp, "Entries that will be compiled:\n");
|
|
for (n = 0; dst[n] != 0; n++)
|
|
fprintf(log_fp, "%u:%s\n", n + 1, dst[n]);
|
|
@@ -413,7 +428,7 @@ make_namelist(char *src)
|
|
}
|
|
|
|
static bool
|
|
-matches(const char **needle, const char *haystack)
|
|
+matches(char **needle, const char *haystack)
|
|
/* does entry in needle list match |-separated field in haystack? */
|
|
{
|
|
bool code = FALSE;
|
|
@@ -468,7 +483,7 @@ main(int argc, char *argv[])
|
|
bool limited = TRUE;
|
|
char *tversion = (char *) NULL;
|
|
const char *source_file = "terminfo";
|
|
- const char **namelst = 0;
|
|
+ char **namelst = 0;
|
|
char *outdir = (char *) NULL;
|
|
bool check_only = FALSE;
|
|
bool suppress_untranslatable = FALSE;
|
|
@@ -784,6 +799,9 @@ main(int argc, char *argv[])
|
|
else
|
|
fprintf(log_fp, "No entries written\n");
|
|
}
|
|
+#if NO_LEAKS
|
|
+ free_namelist(namelst);
|
|
+#endif
|
|
cleanup();
|
|
ExitProgram(EXIT_SUCCESS);
|
|
}
|
|
--- tack/ansi.c
|
|
+++ tack/ansi.c 2007-04-07 16:49:53.000000000 +0200
|
|
@@ -309,6 +309,8 @@ request_cfss(void)
|
|
put_crlf();
|
|
for (i = 0; rqss[i].text; i++) {
|
|
ptext(rqss[i].text);
|
|
+ if (rqss[i].expect == 0)
|
|
+ continue;
|
|
j = strlen(rqss[i].text) + strlen(rqss[i].expect);
|
|
putchp(' ');
|
|
for (j++; j < 40; j++)
|
|
@@ -600,10 +602,11 @@ tools_status(
|
|
i = read_reports();
|
|
if (i != 'r' && i != 'R') {
|
|
*ch = i;
|
|
- return;
|
|
+ break;
|
|
}
|
|
} while (i);
|
|
|
|
+ /* VT320, VT420, etc. */
|
|
if (terminal_class >= 63) {
|
|
do {
|
|
i = request_cfss();
|
|
@@ -841,7 +844,7 @@ tools_charset(
|
|
bank[j] = ch;
|
|
if (ch < ' ' || ch > '/')
|
|
break;
|
|
- if (j + 1 >= (int) sizeof(bank))
|
|
+ if (j + 2 >= (int) sizeof(bank))
|
|
break;
|
|
}
|
|
if (j == 1)
|
|
--- tack/output.c
|
|
+++ tack/output.c 2007-04-07 16:39:05.000000000 +0200
|
|
@@ -740,7 +740,9 @@ wait_here(void)
|
|
/* ignore control S, but tell me about it */
|
|
while (ch == 023 || ch == 021) {
|
|
ch = getchp(STRIP_PARITY);
|
|
- if (i < (int) sizeof(cc))
|
|
+ if (ch == EOF)
|
|
+ break;
|
|
+ if (i + 1 < (int) sizeof(cc))
|
|
cc[++i] = ch;
|
|
}
|
|
put_str("\nThe terminal sent a ^S -");
|
|
@@ -778,7 +780,7 @@ read_string(
|
|
|
|
for (i = 0; i < length - 1; ) {
|
|
ch = getchp(STRIP_PARITY);
|
|
- if (ch == '\r' || ch == '\n') {
|
|
+ if (ch == '\r' || ch == '\n' || ch == EOF) {
|
|
break;
|
|
}
|
|
if (ch == '\b' || ch == 127) {
|
|
--- test/bs.c
|
|
+++ test/bs.c 2007-04-03 01:14:05.000000000 +0200
|
|
@@ -459,7 +459,7 @@ initgame(void)
|
|
do {
|
|
c = getch();
|
|
} while
|
|
- (!strchr("hjklrR", c) || c == FF);
|
|
+ (!(strchr("hjklrR", c) || c == FF));
|
|
|
|
if (c == FF) {
|
|
(void) clearok(stdscr, TRUE);
|
|
--- test/cardfile.c
|
|
+++ test/cardfile.c 2007-04-04 22:12:24.000000000 +0200
|
|
@@ -136,13 +136,15 @@ add_content(CARD * card, const char *con
|
|
if ((offset = strlen(card->content)) != 0) {
|
|
total += 1 + offset;
|
|
card->content = (char *) realloc(card->content, total + 1);
|
|
- strcpy(card->content + offset++, " ");
|
|
+ if (card->content)
|
|
+ strcpy(card->content + offset++, " ");
|
|
} else {
|
|
if (card->content != 0)
|
|
free(card->content);
|
|
card->content = (char *) malloc(total + 1);
|
|
}
|
|
- strcpy(card->content + offset, content);
|
|
+ if (card->content)
|
|
+ strcpy(card->content + offset, content);
|
|
}
|
|
}
|
|
|
|
--- test/demo_defkey.c
|
|
+++ test/demo_defkey.c 2007-04-03 01:17:56.000000000 +0200
|
|
@@ -143,13 +143,12 @@ really_define_key(WINDOW *win, const cha
|
|
code_name);
|
|
}
|
|
log_last_line(win);
|
|
+
|
|
if (vis_string != 0) {
|
|
free(vis_string);
|
|
vis_string = 0;
|
|
}
|
|
|
|
- if (vis_string != 0)
|
|
- free(vis_string);
|
|
vis_string = visible(new_string);
|
|
if ((rc = key_defined(new_string)) > 0) {
|
|
wprintw(win, "%s was bound to %s\n", vis_string, keyname(rc));
|