X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_instr.c;h=5677b57b8313827b3db3ea80cc1194415e97169b;hp=e6d1a739c94f47023e8966678f654fe2d7689214;hb=4ceb04b5e19df8964f98c7675d9448c205a2053e;hpb=3a0d9d27e0cf115ff9dcc6163c251bccaa62bd7d diff --git a/ncurses/base/lib_instr.c b/ncurses/base/lib_instr.c index e6d1a739..5677b57b 100644 --- a/ncurses/base/lib_instr.c +++ b/ncurses/base/lib_instr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2007,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2011,2013 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,7 +41,7 @@ #include -MODULE_ID("$Id: lib_instr.c,v 1.17 2009/10/24 22:55:45 tom Exp $") +MODULE_ID("$Id: lib_instr.c,v 1.20 2013/01/20 01:58:13 tom Exp $") NCURSES_EXPORT(int) winnstr(WINDOW *win, char *str, int n) @@ -78,11 +78,15 @@ winnstr(WINDOW *win, char *str, int n) if (getcchar(cell, wch, &attrs, &pair, 0) == OK) { init_mb(state); - n3 = wcstombs(0, wch, 0); + n3 = wcstombs(0, wch, (size_t) 0); if (!isEILSEQ(n3) && (n3 != 0)) { - if (((int) n3 + i) > n) { + 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, n3 + 10)) == 0) { + } else if ((tmp = typeCalloc(char, need)) == 0) { done = TRUE; } else { init_mb(state);