summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2006-04-25 08:29:36 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2006-04-25 08:29:36 (GMT)
commit29fd0ac98c568926da12b00ea63d88c6d98985f7 (patch)
treee517a54cd20a4fec721d021592e16aacac4e30ba
parent1899aa0c63592f33a10e92fcdb0679ac99e84576 (diff)
downloadtk-29fd0ac98c568926da12b00ea63d88c6d98985f7.zip
tk-29fd0ac98c568926da12b00ea63d88c6d98985f7.tar.gz
tk-29fd0ac98c568926da12b00ea63d88c6d98985f7.tar.bz2
Fix problems caused when XServer returns invalid font names. [Bug 1475865]
-rw-r--r--ChangeLog5
-rw-r--r--unix/tkUnixFont.c22
2 files changed, 25 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index c4ac4e8..fcd01b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-25 Donal K. Fellows <donal.k.fellows@man.ac.uk>
+
+ * unix/tkUnixFont.c (TkpGetFontFamilies): Fix crash caused when the
+ XServer returns invalid font names. [Bug 1475865]
+
2006-04-22 Daniel Steffen <das@users.sourceforge.net>
* macosx/tkMacOSXEmbed.c:
diff --git a/unix/tkUnixFont.c b/unix/tkUnixFont.c
index 1de1b1f..66f8550 100644
--- a/unix/tkUnixFont.c
+++ b/unix/tkUnixFont.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkUnixFont.c,v 1.18.2.4 2005/04/12 22:05:47 hobbs Exp $
+ * RCS: @(#) $Id: tkUnixFont.c,v 1.18.2.5 2006/04/25 08:29:36 dkf Exp $
*/
#include "tkUnixInt.h"
@@ -850,8 +850,26 @@ TkpGetFontFamilies(interp, tkwin)
Tcl_InitHashTable(&familyTable, TCL_STRING_KEYS);
nameList = ListFonts(Tk_Display(tkwin), "*", &numNames);
for (i = 0; i < numNames; i++) {
+ char *familyEnd;
+
+ family = strchr(nameList[i] + 1, '-');
+ if (family == NULL) {
+ /*
+ * Apparently, sometimes ListFonts() can return a font name with
+ * zero or one '-' character in it. This is probably indicative of
+ * a server misconfiguration, but crashing because of it is a very
+ * bad idea anyway. [Bug 1475865]
+ */
+
+ continue;
+ }
+ family++; /* Advance to char after '-'. */
+ familyEnd = strchr(family, '-');
+ if (familyEnd == NULL) {
+ continue; /* See comment above. */
+ }
+ *familyEnd = '\0';
family = strchr(nameList[i] + 1, '-') + 1;
- strchr(family, '-')[0] = '\0';
Tcl_CreateHashEntry(&familyTable, family, &new);
}
XFreeFontNames(nameList);