From 33b42f47b6645e2e2f371494802f82f68f43500a Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 9 Mar 2017 14:21:38 +0000 Subject: [PATCH 1/2] [cffLib/psCharStrings] fix IndexError with empty deltas After 2b2aca1, DictCompiler/Decompiler's `arg_delta` method unconditionally attempts to get the first item to check if it's a list, but this fails with `IndexError` when the value is empty. ``` Traceback (most recent call last): [...] File "/Users/cosimolupo/Documents/Github/ufo2ft/Lib/ufo2ft/otfPostProcessor.py", line 15, in __init__ otf.save(stream) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/ttLib/__init__.py", line 219, in save self._writeTable(tag, writer, done) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/ttLib/__init__.py", line 658, in _writeTable tabledata = self.getTableData(tag) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/ttLib/__init__.py", line 669, in getTableData return self.tables[tag].compile(self) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/ttLib/tables/C_F_F_.py", line 20, in compile self.cff.compile(f, otFont) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/cffLib.py", line 124, in compile writer.toFile(file) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/cffLib.py", line 300, in toFile endPos = pos + item.getDataLength() File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/cffLib.py", line 1858, in getDataLength return len(self.compile("getDataLength")) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/cffLib.py", line 1879, in compile data.append(arghandler(value)) File "/Users/cosimolupo/Documents/Github/fonttools/Lib/fontTools/cffLib.py", line 1910, in arg_delta val0 = value[0] IndexError: list index out of range `` --- Lib/fontTools/cffLib.py | 2 ++ Lib/fontTools/misc/psCharStrings.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py index b724c62d7..90372325a 100644 --- a/Lib/fontTools/cffLib.py +++ b/Lib/fontTools/cffLib.py @@ -1907,6 +1907,8 @@ class DictCompiler(object): data.append(self.arg_number(num)) return bytesjoin(data) def arg_delta(self, value): + if not value: + return b"" val0 = value[0] if isinstance(val0, list): data = self.arg_delta_blend(value) diff --git a/Lib/fontTools/misc/psCharStrings.py b/Lib/fontTools/misc/psCharStrings.py index 3976cbe8b..fc9ff5da1 100644 --- a/Lib/fontTools/misc/psCharStrings.py +++ b/Lib/fontTools/misc/psCharStrings.py @@ -1319,7 +1319,8 @@ class DictDecompiler(ByteCodeBase): def arg_delta(self, name): valueList = self.popall() out = [] - if isinstance(valueList[0], list): # arg_blendList() has already converted these to absolute values. + if valueList and isinstance(valueList[0], list): + # arg_blendList() has already converted these to absolute values. out = valueList else: current = 0 From 2e464766716ba912f06aa997ea71a617e61aafdc Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 9 Mar 2017 15:40:52 +0000 Subject: [PATCH 2/2] [cffLib] fix IndexError when dumping toXML empty deltas $ ttx -t CFF "font.otf" Dumping "font.otf" to "font.ttx"... Dumping 'CFF ' table... ERROR: Unhandled exception has occurred Traceback (most recent call last): File "fonttools/Lib/fontTools/ttx.py", line 384, in main process(jobs, options) File "fonttools/Lib/fontTools/ttx.py", line 358, in process action(input, output, options) File "fonttools/Lib/fontTools/misc/loggingTools.py", line 372, in wrapper return func(*args, **kwds) File "fonttools/Lib/fontTools/ttx.py", line 258, in ttDump newlinestr=options.newlinestr) File "fonttools/Lib/fontTools/ttLib/__init__.py", line 311, in saveXML self._tableToXML(tableWriter, tag, progress) File "fonttools/Lib/fontTools/ttLib/__init__.py", line 348, in _tableToXML table.toXML(writer, self, progress) File "fonttools/Lib/fontTools/ttLib/tables/C_F_F_.py", line 42, in toXML self.cff.toXML(writer, progress) File "fonttools/Lib/fontTools/cffLib.py", line 135, in toXML font.toXML(xmlWriter, progress) File "fonttools/Lib/fontTools/cffLib.py", line 2178, in toXML BaseDict.toXML(self, xmlWriter, progress) File "fonttools/Lib/fontTools/cffLib.py", line 2128, in toXML conv.xmlWrite(xmlWriter, name, value, progress) File "fonttools/Lib/fontTools/cffLib.py", line 1120, in xmlWrite value.toXML(xmlWriter, progress) File "fonttools/Lib/fontTools/cffLib.py", line 2128, in toXML conv.xmlWrite(xmlWriter, name, value, progress) File "fonttools/Lib/fontTools/cffLib.py", line 1089, in xmlWrite if isinstance(value[0], list): IndexError: list index out of range --- Lib/fontTools/cffLib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py index 90372325a..c859265ae 100644 --- a/Lib/fontTools/cffLib.py +++ b/Lib/fontTools/cffLib.py @@ -1086,7 +1086,7 @@ class NumberConverter(SimpleConverter): class ArrayConverter(SimpleConverter): def xmlWrite(self, xmlWriter, name, value, progress): - if isinstance(value[0], list): + if value and isinstance(value[0], list): xmlWriter.begintag(name) xmlWriter.newline() xmlWriter.indent()