X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_instr.c;h=f708ecc51e4acebc22475eafa53f745fdcf3de9c;hp=d75dee9e40efa9ef7f40ec6dbe1bab20d3e2abbe;hb=fe6abf09238512f5a902bc1aeab2263d1e997396;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8 diff --git a/ncurses/base/lib_instr.c b/ncurses/base/lib_instr.c index d75dee9e..f708ecc5 100644 --- a/ncurses/base/lib_instr.c +++ b/ncurses/base/lib_instr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. * + * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -41,14 +41,14 @@ #include -MODULE_ID("$Id: lib_instr.c,v 1.14 2005/04/16 17:51:12 tom Exp $") +MODULE_ID("$Id: lib_instr.c,v 1.21 2014/02/01 22:09:27 tom Exp $") NCURSES_EXPORT(int) winnstr(WINDOW *win, char *str, int n) { int i = 0, row, col; - T((T_CALLED("winnstr(%p,%p,%d)"), win, str, n)); + T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n)); if (!str) returnCode(0); @@ -64,7 +64,7 @@ winnstr(WINDOW *win, char *str, int n) cchar_t *cell = &(win->_line[row].text[col]); wchar_t *wch; attr_t attrs; - short pair; + NCURSES_PAIRS_T pair; int n2; bool done = FALSE; mbstate_t state; @@ -78,19 +78,23 @@ winnstr(WINDOW *win, char *str, int n) if (getcchar(cell, wch, &attrs, &pair, 0) == OK) { init_mb(state); - n3 = wcstombs(0, wch, 0); - if (isEILSEQ(n3) || (n3 == 0)) { - ; - } else if ((int) (n3 + i) >= n) { - done = TRUE; - } else if ((tmp = typeCalloc(char, n3 + 10)) == 0) { - done = TRUE; - } else { - init_mb(state); - wcstombs(tmp, wch, n3); - for (i3 = 0; i3 < n3; ++i3) - str[i++] = tmp[i3]; - free(tmp); + n3 = wcstombs(0, wch, (size_t) 0); + if (!isEILSEQ(n3) && (n3 != 0)) { + size_t need = n3 + 10 + (size_t) i; + int have = (int) n3 + i; + + /* check for loop-done as well as overflow */ + if (have > n || (int) need <= 0) { + done = TRUE; + } else if ((tmp = typeCalloc(char, need)) == 0) { + done = TRUE; + } else { + init_mb(state); + wcstombs(tmp, wch, n3); + for (i3 = 0; i3 < n3; ++i3) + str[i++] = tmp[i3]; + free(tmp); + } } } free(wch); @@ -99,12 +103,10 @@ winnstr(WINDOW *win, char *str, int n) } } #else - str[i++] = CharOf(win->_line[row].text[col]); + str[i++] = (char) CharOf(win->_line[row].text[col]); #endif if (++col > win->_maxx) { - col = 0; - if (++row > win->_maxy) - break; + break; } } }