On Tue, May 15, 2018 at 08:01:19PM -0400, Thomas Dickey wrote:
> On Tue, May 15, 2018 at 08:47:38PM +0200, Sven Joachim wrote:
> > CC'ing ncurses maintainer, it looks like the library might be at fault
> > here.
> ...
> > So it seems that the ncurses library did not allocate enough memory to
> > hold all the color pairs in sp->_color_pairs, resulting in the eventual
> > heap buffer overflow.
> > 
> > That's how far I have tracked the issue, hopefully Thomas Dickey can
> > investigate it further and even provide a fix.
> 
> I can reproduce this, will see...

The problem is that f-irc asks for pair-content of pairs which it did not
initialize, and in doing this, found a case I'd overlooked in the logic
for dynamically allocating the color-pair table last year.

Here's the diff to fix ncurses:

--- ncurses/base/lib_color.c    2018/03/01 15:02:12     1.137
+++ ncurses/base/lib_color.c    2018/05/16 08:24:08
@@ -938,9 +938,12 @@
     if (!ValidPair(sp, pair)) {
        result = ERR;
     } else {
-       int fg = FORE_OF(sp->_color_pairs[pair]);
-       int bg = BACK_OF(sp->_color_pairs[pair]);
+       int fg;
+       int bg;
 
+       _nc_reserve_pairs(sp, pair);
+       fg = FORE_OF(sp->_color_pairs[pair]);
+       bg = BACK_OF(sp->_color_pairs[pair]);
 #if NCURSES_EXT_FUNCS
        if (isDefaultColor(fg))
            fg = -1;

f-irc, by the way, hits that function about a hundred times more than
the worst-case (7.2 million versus 65 thousand).  The usual application
won't do anything like that...

-- 
Thomas E. Dickey <dic...@invisible-island.net>
https://invisible-island.net
ftp://ftp.invisible-island.net

Attachment: signature.asc
Description: Digital signature

Reply via email to