Discussion:
[newlib-cygwin] Cygwin: console: make sure EnumFontFamiliesExW loop isn't infinite
Corinna Vinschen
2018-09-07 11:50:20 UTC
Permalink
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=d83404e41808421442c8257392ecd095042cbfbf

commit d83404e41808421442c8257392ecd095042cbfbf
Author: Corinna Vinschen <***@vinschen.de>
Date: Fri Sep 7 13:49:54 2018 +0200

Cygwin: console: make sure EnumFontFamiliesExW loop isn't infinite

The current loop condition is borderline. Make sure it ends and
choose a replacement char in the unlikely case the current console
font isn't recognized at all.

Signed-off-by: Corinna Vinschen <***@vinschen.de>

Diff:
---
winsup/cygwin/fhandler_console.cc | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index ce6de6f..6a0d640 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -2016,10 +2016,16 @@ check_font (HANDLE hdl)
do
{
EnumFontFamiliesExW (cdc, &lf, enum_proc, (LPARAM) &done, 0);
- if (!done && cp > lf.lfFaceName)
+ if (!done)
*cp-- = L'\0';
}
- while (!done);
+ while (!done && cp >= lf.lfFaceName);
+ /* What, really? No recognizable font? */
+ if (!done)
+ {
+ rp_char = L'?';
+ return;
+ }
/* Yes. Check for the best replacement char. */
HFONT f = CreateFontW (0, 0, 0, 0,
cfi.FontWeight, FALSE, FALSE, FALSE,

Loading...