Magellan Linux

Annotation of /trunk/ncurses/patches/ncurses-5.6-coverity.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 714 - (hide annotations) (download)
Mon Dec 22 10:42:02 2008 UTC (15 years, 5 months ago) by niro
File size: 17546 byte(s)
added several ncurses patches

1 niro 714 # patch by Thomas E. Dickey <dickey@invisible-island.net>
2     # created Sat Apr 7 16:56:37 UTC 2007
3     # ------------------------------------------------------------------------------
4     # NEWS | 30 ++++++++++++++++++++++++++++++
5     # c++/cursesmain.cc | 19 +++++++++++++++++++
6     # c++/cursesp.h | 2 +-
7     # c++/etip.h.in | 20 +++++++++++++++-----
8     # configure | 2 +-
9     # configure.in | 2 +-
10     # include/ncurses_defs | 1 +
11     # ncurses/base/lib_addstr.c | 5 +++--
12     # ncurses/base/lib_color.c | 9 ++++++---
13     # ncurses/base/lib_overlay.c | 7 +++++--
14     # ncurses/base/tries.c | 2 +-
15     # ncurses/base/wresize.c | 2 +-
16     # ncurses/tinfo/trim_sgr0.c | 6 ++----
17     # progs/dump_entry.c | 13 ++++++++-----
18     # progs/infocmp.c | 1 -
19     # progs/tic.c | 32 +++++++++++++++++++++++++-------
20     # tack/ansi.c | 7 +++++--
21     # tack/output.c | 6 ++++--
22     # test/bs.c | 2 +-
23     # test/cardfile.c | 6 ++++--
24     # test/demo_defkey.c | 3 +--
25     # 21 files changed, 134 insertions(+), 43 deletions(-)
26     # ------------------------------------------------------------------------------
27     Index: NEWS
28     Prereq: 1.1056
29     --- ncurses-5.6+/NEWS 2006-12-17 20:36:26.000000000 +0000
30     +++ ncurses-5.6-coverity/NEWS 2007-04-07 16:55:45.000000000 +0000
31     @@ -45,6 +45,36 @@
32     Changes through 1.9.9e did not credit all contributions;
33     it is not possible to add this information.
34    
35     +20060407
36     + > other fixes prompted by inspection for Coverity report:
37     + + modify ifdef's for c++ binding to use try/catch/throw statements
38     + + add a null-pointer check in tack/ansi.c request_cfss()
39     + + fix a memory leak in ncurses/base/wresize.c
40     + + corrected check for valid memu/meml capabilities in
41     + progs/dump_entry.c when handling V_HPUX case.
42     + > fixes based on Coverity report:
43     + + remove dead code in test/bs.c
44     + + remove dead code in test/demo_defkey.c
45     + + remove an unused assignment in progs/infocmp.c
46     + + fix a limit check in tack/ansi.c tools_charset()
47     + + fix tack/ansi.c tools_status() to perform the VT320/VT420
48     + tests in request_cfss(). The function had exited too soon.
49     + + fix a memory leak in tic.c's make_namelist()
50     + + fix a couple of places in tack/output.c which did not check for EOF.
51     + + fix a loop-condition in test/bs.c
52     + + add index checks in lib_color.c for color palettes
53     + + add index checks in progs/dump_entry.c for version_filter() handling
54     + of V_BSD case.
55     + + fix a possible null-pointer dereference in copywin()
56     + + fix a possible null-pointer dereference in waddchnstr()
57     + + add a null-pointer check in _nc_expand_try()
58     + + add a null-pointer check in tic.c's make_namelist()
59     + + add a null-pointer check in _nc_expand_try()
60     + + add null-pointer checks in test/cardfile.c
61     + + fix a double-free in ncurses/tinfo/trim_sgr0.c
62     + + fix a double-free in ncurses/base/wresize.c
63     + + add try/catch block to c++/cursesmain.cc
64     +
65     20061217 5.6 release for upload to ftp.gnu.org
66    
67     20061217
68     Index: c++/cursesmain.cc
69     Prereq: 1.11
70     --- ncurses-5.6+/c++/cursesmain.cc 2003-10-25 14:53:13.000000000 +0000
71     +++ ncurses-5.6-coverity/c++/cursesmain.cc 2007-04-07 00:56:43.000000000 +0000
72     @@ -34,6 +34,13 @@
73     #include "internal.h"
74     #include "cursesapp.h"
75    
76     +#if CPP_HAS_TRY_CATCH && HAVE_IOSTREAM
77     +#include <iostream>
78     +#else
79     +#undef CPP_HAS_TRY_CATCH
80     +#define CPP_HAS_TRY_CATCH 0
81     +#endif
82     +
83     MODULE_ID("$Id: ncurses-5.6-coverity.patch,v 1.1 2008-12-22 10:40:02 niro Exp $")
84    
85     #if HAVE_LOCALE_H
86     @@ -58,8 +65,20 @@
87    
88     A->handleArgs(argc,argv);
89     ::endwin();
90     +#if CPP_HAS_TRY_CATCH
91     + try {
92     + res = (*A)();
93     + ::endwin();
94     + }
95     + catch(const NCursesException &e) {
96     + ::endwin();
97     + std::cerr << e.message << std::endl;
98     + res = e.errorno;
99     + }
100     +#else
101     res = (*A)();
102     ::endwin();
103     +#endif
104     return(res);
105     }
106     }
107     Index: c++/cursesp.h
108     Prereq: 1.26
109     --- ncurses-5.6+/c++/cursesp.h 2005-08-13 18:09:21.000000000 +0000
110     +++ ncurses-5.6-coverity/c++/cursesp.h 2007-04-07 00:47:22.000000000 +0000
111     @@ -83,7 +83,7 @@
112     return uptr->m_user;
113     }
114    
115     - void OnError (int err) const THROWS((NCursesPanelException))
116     + void OnError (int err) const THROWS(NCursesPanelException)
117     {
118     if (err==ERR)
119     THROW(new NCursesPanelException (this, err));
120     Index: c++/etip.h.in
121     Prereq: 1.32
122     --- ncurses-5.6+/c++/etip.h.in 2005-08-06 19:55:57.000000000 +0000
123     +++ ncurses-5.6-coverity/c++/etip.h.in 2007-04-07 00:49:39.000000000 +0000
124     @@ -342,23 +342,33 @@
125     inline void THROW(const NCursesException *e) {
126     #if defined(__GNUG__) && defined(__EXCEPTIONS)
127     # if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
128     - (*lib_error_handler)(e?e->classname():"",e?e->message:"");
129     + (*lib_error_handler)(e ? e->classname() : "", e ? e->message : "");
130     #else
131     - throw *e;
132     +#define CPP_HAS_TRY_CATCH 1
133     #endif
134     #elif defined(__SUNPRO_CC)
135     # if !defined(__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT < 5)
136     genericerror(1, ((e != 0) ? (char *)(e->message) : ""));
137     #else
138     - throw *e;
139     +#define CPP_HAS_TRY_CATCH 1
140     #endif
141     #else
142     if (e)
143     cerr << e->message << endl;
144     exit(0);
145     #endif
146     -}
147    
148     -#define THROWS(s)
149     +#ifndef CPP_HAS_TRY_CATCH
150     +#define CPP_HAS_TRY_CATCH 0
151     +#define NCURSES_CPP_TRY /* nothing */
152     +#define NCURSES_CPP_CATCH(e) if (false)
153     +#define THROWS(s) /* nothing */
154     +#elif CPP_HAS_TRY_CATCH
155     + throw *e;
156     +#define NCURSES_CPP_TRY try
157     +#define NCURSES_CPP_CATCH(e) catch(e)
158     +#define THROWS(s) throw(s)
159     +#endif
160     +}
161    
162     #endif /* NCURSES_ETIP_H_incl */
163     Index: configure
164     --- ncurses-5.6+/configure 2006-12-17 16:33:38.000000000 +0000
165     +++ ncurses-5.6-coverity/configure 2007-04-06 22:54:52.000000000 +0000
166     @@ -13865,7 +13865,7 @@
167     ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
168     ac_main_return=return
169    
170     -for ac_header in typeinfo
171     +for ac_header in iostream typeinfo
172     do
173     as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
174     echo "$as_me:13871: checking for $ac_header" >&5
175     Index: configure.in
176     Prereq: 1.383
177     --- ncurses-5.6+/configure.in 2006-12-17 01:26:06.000000000 +0000
178     +++ ncurses-5.6-coverity/configure.in 2007-04-06 22:53:21.000000000 +0000
179     @@ -1200,7 +1200,7 @@
180     ;;
181     esac
182    
183     - AC_CHECK_HEADERS(typeinfo)
184     + AC_CHECK_HEADERS(iostream typeinfo)
185    
186     CF_BOOL_DECL
187     CF_BOOL_SIZE
188     Index: include/ncurses_defs
189     Prereq: 1.30
190     --- ncurses-5.6+/include/ncurses_defs 2006-08-05 19:27:02.000000000 +0000
191     +++ ncurses-5.6-coverity/include/ncurses_defs 2007-04-06 22:54:16.000000000 +0000
192     @@ -68,6 +68,7 @@
193     HAVE_GPP_BUILTIN_H
194     HAVE_GXX_BUILTIN_H
195     HAVE_HAS_KEY
196     +HAVE_IOSTREAM
197     HAVE_ISASCII
198     HAVE_ISSETUGID
199     HAVE_LANGINFO_CODESET
200     Index: ncurses/base/lib_addstr.c
201     Prereq: 1.46
202     --- ncurses-5.6+/ncurses/base/lib_addstr.c 2006-05-27 19:22:19.000000000 +0000
203     +++ ncurses-5.6-coverity/ncurses/base/lib_addstr.c 2007-04-04 00:41:25.000000000 +0000
204     @@ -80,8 +80,7 @@
205     NCURSES_EXPORT(int)
206     waddchnstr(WINDOW *win, const chtype *astr, int n)
207     {
208     - NCURSES_SIZE_T y = win->_cury;
209     - NCURSES_SIZE_T x = win->_curx;
210     + NCURSES_SIZE_T y, x;
211     int code = OK;
212     int i;
213     struct ldat *line;
214     @@ -91,6 +90,8 @@
215     if (!win)
216     returnCode(ERR);
217    
218     + y = win->_cury;
219     + x = win->_curx;
220     if (n < 0) {
221     const chtype *str;
222     n = 0;
223     Index: ncurses/base/lib_color.c
224     Prereq: 1.80
225     --- ncurses-5.6+/ncurses/base/lib_color.c 2006-11-26 01:33:16.000000000 +0000
226     +++ ncurses-5.6-coverity/ncurses/base/lib_color.c 2007-04-04 20:32:04.000000000 +0000
227     @@ -56,7 +56,10 @@
228    
229     #define TYPE_CALLOC(type,elts) typeCalloc(type, (unsigned)(elts))
230    
231     +#define MAX_PALETTE 8
232     +
233     #define OkColorHi(n) (((n) < COLORS) && ((n) < max_colors))
234     +#define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE)
235    
236     /*
237     * Given a RGB range of 0..1000, we'll normally set the individual values
238     @@ -162,10 +165,10 @@
239    
240     tp = (hue_lightness_saturation) ? hls_palette : cga_palette;
241     for (n = 0; n < COLORS; n++) {
242     - if (n < 8) {
243     + if (InPalette(n)) {
244     SP->_color_table[n] = tp[n];
245     } else {
246     - SP->_color_table[n] = tp[n % 8];
247     + SP->_color_table[n] = tp[n % MAX_PALETTE];
248     if (hue_lightness_saturation) {
249     SP->_color_table[n].green = 100;
250     } else {
251     @@ -365,7 +368,7 @@
252     if (GET_SCREEN_PAIR(SP) == pair)
253     SET_SCREEN_PAIR(SP, (chtype) (~0)); /* force attribute update */
254    
255     - if (initialize_pair) {
256     + if (initialize_pair && InPalette(f) && InPalette(b)) {
257     const color_t *tp = hue_lightness_saturation ? hls_palette : cga_palette;
258    
259     T(("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)",
260     Index: ncurses/base/lib_overlay.c
261     Prereq: 1.22
262     --- ncurses-5.6+/ncurses/base/lib_overlay.c 2006-10-14 20:43:31.000000000 +0000
263     +++ ncurses-5.6-coverity/ncurses/base/lib_overlay.c 2007-04-04 00:40:12.000000000 +0000
264     @@ -139,8 +139,8 @@
265     {
266     int sx, sy, dx, dy;
267     bool touched;
268     - attr_t bk = AttrOf(dst->_nc_bkgd);
269     - attr_t mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0);
270     + attr_t bk;
271     + attr_t mask;
272    
273     T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"),
274     src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over));
275     @@ -148,6 +148,9 @@
276     if (!src || !dst)
277     returnCode(ERR);
278    
279     + bk = AttrOf(dst->_nc_bkgd);
280     + mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0);
281     +
282     /* make sure rectangle exists in source */
283     if ((sminrow + dmaxrow - dminrow) > (src->_maxy + 1) ||
284     (smincol + dmaxcol - dmincol) > (src->_maxx + 1)) {
285     Index: ncurses/base/tries.c
286     Prereq: 1.22
287     --- ncurses-5.6+/ncurses/base/tries.c 2005-11-26 20:09:18.000000000 +0000
288     +++ ncurses-5.6-coverity/ncurses/base/tries.c 2007-04-03 20:58:30.000000000 +0000
289     @@ -68,7 +68,7 @@
290     }
291     }
292     if (result != 0) {
293     - if ((result[len] = ptr->ch) == 0)
294     + if (ptr != 0 && (result[len] = ptr->ch) == 0)
295     *((unsigned char *) (result + len)) = 128;
296     #ifdef TRACE
297     if (len == 0 && _nc_tracing != 0)
298     Index: ncurses/base/wresize.c
299     Prereq: 1.24
300     --- ncurses-5.6+/ncurses/base/wresize.c 2006-10-14 20:43:31.000000000 +0000
301     +++ ncurses-5.6-coverity/ncurses/base/wresize.c 2007-04-04 20:28:42.000000000 +0000
302     @@ -38,7 +38,7 @@
303     cleanup_lines(struct ldat *data, int length)
304     {
305     while (--length >= 0)
306     - free(data->text);
307     + free(data[length].text);
308     free(data);
309     return ERR;
310     }
311     Index: ncurses/tinfo/trim_sgr0.c
312     Prereq: 1.7
313     --- ncurses-5.6+/ncurses/tinfo/trim_sgr0.c 2006-12-02 19:37:57.000000000 +0000
314     +++ ncurses-5.6-coverity/ncurses/tinfo/trim_sgr0.c 2007-04-04 19:29:01.000000000 +0000
315     @@ -247,9 +247,7 @@
316     if (!rewrite_sgr(on, enter_alt_charset_mode)
317     || !rewrite_sgr(off, exit_alt_charset_mode)
318     || !rewrite_sgr(end, exit_alt_charset_mode)) {
319     - FreeIfNeeded(on);
320     FreeIfNeeded(off);
321     - FreeIfNeeded(end);
322     } else if (similar_sgr(off, end)
323     && !similar_sgr(off, on)) {
324     TR(TRACE_DATABASE, ("adjusting sgr(9:off) : %s", _nc_visbuf(off)));
325     @@ -315,8 +313,8 @@
326     */
327     free(off);
328     }
329     - free(end);
330     - free(on);
331     + FreeIfNeeded(end);
332     + FreeIfNeeded(on);
333     } else {
334     /*
335     * Possibly some applications are confused if sgr0 contains rmacs,
336     Index: progs/dump_entry.c
337     Prereq: 1.79
338     --- ncurses-5.6+/progs/dump_entry.c 2006-09-30 20:18:15.000000000 +0000
339     +++ ncurses-5.6-coverity/progs/dump_entry.c 2007-04-07 15:51:47.000000000 +0000
340     @@ -352,14 +352,17 @@
341     }
342     break;
343    
344     +#define is_termcap(type) (idx < (int) sizeof(type##_from_termcap) && \
345     + type##_from_termcap[idx])
346     +
347     case V_BSD: /* BSD */
348     switch (type) {
349     case BOOLEAN:
350     - return bool_from_termcap[idx];
351     + return is_termcap(bool);
352     case NUMBER:
353     - return num_from_termcap[idx];
354     + return is_termcap(num);
355     case STRING:
356     - return str_from_termcap[idx];
357     + return is_termcap(str);
358     }
359     break;
360     }
361     @@ -788,11 +791,11 @@
362     * Much more work should be done on this to support dumping termcaps.
363     */
364     if (tversion == V_HPUX) {
365     - if (memory_lock) {
366     + if (VALID_STRING(memory_lock)) {
367     (void) sprintf(buffer, "meml=%s", memory_lock);
368     WRAP_CONCAT;
369     }
370     - if (memory_unlock) {
371     + if (VALID_STRING(memory_unlock)) {
372     (void) sprintf(buffer, "memu=%s", memory_unlock);
373     WRAP_CONCAT;
374     }
375     Index: progs/infocmp.c
376     Prereq: 1.85
377     --- ncurses-5.6+/progs/infocmp.c 2006-08-19 21:20:37.000000000 +0000
378     +++ ncurses-5.6-coverity/progs/infocmp.c 2007-04-04 00:51:49.000000000 +0000
379     @@ -1083,7 +1083,6 @@
380     }
381     *tp++ = '"';
382     *tp = '\0';
383     - size += (strlen(term->Strings[n]) + 1);
384     (void) printf("static char %-20s[] = %s;\n",
385     string_variable(ExtStrname(term, n, strnames)), buf);
386     }
387     Index: progs/tic.c
388     Prereq: 1.131
389     --- ncurses-5.6+/progs/tic.c 2006-12-02 22:13:17.000000000 +0000
390     +++ ncurses-5.6-coverity/progs/tic.c 2007-04-07 15:20:35.000000000 +0000
391     @@ -353,11 +353,24 @@
392     return fp;
393     }
394    
395     +#if NO_LEAKS
396     +static void
397     +free_namelist(char **src)
398     +{
399     + if (src != 0) {
400     + int n;
401     + for (n = 0; src[n] != 0; ++n)
402     + free (src[n]);
403     + free (src);
404     + }
405     +}
406     +#endif
407     +
408     /* Parse the "-e" option-value into a list of names */
409     -static const char **
410     +static char **
411     make_namelist(char *src)
412     {
413     - const char **dst = 0;
414     + char **dst = 0;
415    
416     char *s, *base;
417     unsigned pass, n, nn;
418     @@ -374,11 +387,13 @@
419     if ((s = stripped(buffer)) != 0) {
420     if (dst != 0)
421     dst[nn] = s;
422     + else
423     + free(s);
424     nn++;
425     }
426     }
427     if (pass == 1) {
428     - dst = typeCalloc(const char *, nn + 1);
429     + dst = typeCalloc(char *, nn + 1);
430     rewind(fp);
431     }
432     }
433     @@ -401,10 +416,10 @@
434     break;
435     }
436     if (pass == 1)
437     - dst = typeCalloc(const char *, nn + 1);
438     + dst = typeCalloc(char *, nn + 1);
439     }
440     }
441     - if (showsummary) {
442     + if (showsummary && (dst != 0)) {
443     fprintf(log_fp, "Entries that will be compiled:\n");
444     for (n = 0; dst[n] != 0; n++)
445     fprintf(log_fp, "%u:%s\n", n + 1, dst[n]);
446     @@ -413,7 +428,7 @@
447     }
448    
449     static bool
450     -matches(const char **needle, const char *haystack)
451     +matches(char **needle, const char *haystack)
452     /* does entry in needle list match |-separated field in haystack? */
453     {
454     bool code = FALSE;
455     @@ -468,7 +483,7 @@
456     bool limited = TRUE;
457     char *tversion = (char *) NULL;
458     const char *source_file = "terminfo";
459     - const char **namelst = 0;
460     + char **namelst = 0;
461     char *outdir = (char *) NULL;
462     bool check_only = FALSE;
463     bool suppress_untranslatable = FALSE;
464     @@ -784,6 +799,9 @@
465     else
466     fprintf(log_fp, "No entries written\n");
467     }
468     +#if NO_LEAKS
469     + free_namelist(namelst);
470     +#endif
471     cleanup();
472     ExitProgram(EXIT_SUCCESS);
473     }
474     Index: tack/ansi.c
475     Prereq: 1.10
476     --- ncurses-5.6+/tack/ansi.c 2005-09-17 19:49:16.000000000 +0000
477     +++ ncurses-5.6-coverity/tack/ansi.c 2007-04-07 14:49:53.000000000 +0000
478     @@ -309,6 +309,8 @@
479     put_crlf();
480     for (i = 0; rqss[i].text; i++) {
481     ptext(rqss[i].text);
482     + if (rqss[i].expect == 0)
483     + continue;
484     j = strlen(rqss[i].text) + strlen(rqss[i].expect);
485     putchp(' ');
486     for (j++; j < 40; j++)
487     @@ -600,10 +602,11 @@
488     i = read_reports();
489     if (i != 'r' && i != 'R') {
490     *ch = i;
491     - return;
492     + break;
493     }
494     } while (i);
495    
496     + /* VT320, VT420, etc. */
497     if (terminal_class >= 63) {
498     do {
499     i = request_cfss();
500     @@ -841,7 +844,7 @@
501     bank[j] = ch;
502     if (ch < ' ' || ch > '/')
503     break;
504     - if (j + 1 >= (int) sizeof(bank))
505     + if (j + 2 >= (int) sizeof(bank))
506     break;
507     }
508     if (j == 1)
509     Index: tack/output.c
510     Prereq: 1.11
511     --- ncurses-5.6+/tack/output.c 2006-11-26 00:16:49.000000000 +0000
512     +++ ncurses-5.6-coverity/tack/output.c 2007-04-07 14:39:05.000000000 +0000
513     @@ -740,7 +740,9 @@
514     /* ignore control S, but tell me about it */
515     while (ch == 023 || ch == 021) {
516     ch = getchp(STRIP_PARITY);
517     - if (i < (int) sizeof(cc))
518     + if (ch == EOF)
519     + break;
520     + if (i + 1 < (int) sizeof(cc))
521     cc[++i] = ch;
522     }
523     put_str("\nThe terminal sent a ^S -");
524     @@ -778,7 +780,7 @@
525    
526     for (i = 0; i < length - 1; ) {
527     ch = getchp(STRIP_PARITY);
528     - if (ch == '\r' || ch == '\n') {
529     + if (ch == '\r' || ch == '\n' || ch == EOF) {
530     break;
531     }
532     if (ch == '\b' || ch == 127) {
533     Index: test/bs.c
534     Prereq: 1.44
535     --- ncurses-5.6+/test/bs.c 2006-05-20 15:38:52.000000000 +0000
536     +++ ncurses-5.6-coverity/test/bs.c 2007-04-02 23:14:05.000000000 +0000
537     @@ -459,7 +459,7 @@
538     do {
539     c = getch();
540     } while
541     - (!strchr("hjklrR", c) || c == FF);
542     + (!(strchr("hjklrR", c) || c == FF));
543    
544     if (c == FF) {
545     (void) clearok(stdscr, TRUE);
546     Index: test/cardfile.c
547     Prereq: 1.28
548     --- ncurses-5.6+/test/cardfile.c 2006-12-10 00:30:09.000000000 +0000
549     +++ ncurses-5.6-coverity/test/cardfile.c 2007-04-04 20:12:24.000000000 +0000
550     @@ -136,13 +136,15 @@
551     if ((offset = strlen(card->content)) != 0) {
552     total += 1 + offset;
553     card->content = (char *) realloc(card->content, total + 1);
554     - strcpy(card->content + offset++, " ");
555     + if (card->content)
556     + strcpy(card->content + offset++, " ");
557     } else {
558     if (card->content != 0)
559     free(card->content);
560     card->content = (char *) malloc(total + 1);
561     }
562     - strcpy(card->content + offset, content);
563     + if (card->content)
564     + strcpy(card->content + offset, content);
565     }
566     }
567    
568     Index: test/demo_defkey.c
569     Prereq: 1.16
570     --- ncurses-5.6+/test/demo_defkey.c 2006-04-01 19:08:03.000000000 +0000
571     +++ ncurses-5.6-coverity/test/demo_defkey.c 2007-04-02 23:17:56.000000000 +0000
572     @@ -143,13 +143,12 @@
573     code_name);
574     }
575     log_last_line(win);
576     +
577     if (vis_string != 0) {
578     free(vis_string);
579     vis_string = 0;
580     }
581    
582     - if (vis_string != 0)
583     - free(vis_string);
584     vis_string = visible(new_string);
585     if ((rc = key_defined(new_string)) > 0) {
586     wprintw(win, "%s was bound to %s\n", vis_string, keyname(rc));