From 5ab86fdbc4e00a7133f00b6b89639cf48b62e326 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Wed, 23 Jan 2019 02:49:08 +0000 Subject: user/fontforge: fix PyMalloc usage, segfaults on 32-bit --- user/fontforge/APKBUILD | 9 +- user/fontforge/python3.patch | 197 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 user/fontforge/python3.patch diff --git a/user/fontforge/APKBUILD b/user/fontforge/APKBUILD index 16a69b3b6..949fb702c 100644 --- a/user/fontforge/APKBUILD +++ b/user/fontforge/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: A. Wilcox pkgname=fontforge pkgver=2.0.20170731 -pkgrel=0 +pkgrel=1 pkgdesc="Open source font editor" url="https://fontforge.github.io/en-US/" arch="all" @@ -12,7 +12,9 @@ makedepends="freetype-dev giflib-dev glib-dev libjpeg-turbo-dev libuninameslist-dev libpng-dev libx11-dev libxml2-dev pango-dev python3-dev tiff-dev zlib-dev" subpackages="$pkgname-dev $pkgname-doc $pkgname-lang" -source="https://github.com/fontforge/fontforge/releases/download/${pkgver/2.0./}/fontforge-dist-${pkgver/2.0./}.tar.xz" +source="https://github.com/fontforge/fontforge/releases/download/${pkgver/2.0./}/fontforge-dist-${pkgver/2.0./}.tar.xz + python3.patch + " build() { cd "$builddir" @@ -37,4 +39,5 @@ package() { make DESTDIR="$pkgdir" install } -sha512sums="26f7a40714460716a24dd0229fdb027f3766bcc48db64b8993436ddcb6277898f9f3b67ad4fc0be515b2b38e01370d1c7d9ee3c6ece1be862b7d8c9882411f11 fontforge-dist-20170731.tar.xz" +sha512sums="26f7a40714460716a24dd0229fdb027f3766bcc48db64b8993436ddcb6277898f9f3b67ad4fc0be515b2b38e01370d1c7d9ee3c6ece1be862b7d8c9882411f11 fontforge-dist-20170731.tar.xz +0ca2f3d10a54e4ccb0737ba8e4e768a75e536f70f8892bfe8c23daa5d542d58a1dd4991a982748dcb2c24ed5ae4cb336278a1c01eb434a0463b8b36133b0bb33 python3.patch" diff --git a/user/fontforge/python3.patch b/user/fontforge/python3.patch new file mode 100644 index 000000000..25bae415e --- /dev/null +++ b/user/fontforge/python3.patch @@ -0,0 +1,197 @@ +From b6089f11bd7534c9aa38b875ef1e830fc3b898b4 Mon Sep 17 00:00:00 2001 +From: Jeremy Tan +Date: Wed, 13 Sep 2017 17:22:18 +0800 +Subject: [PATCH] python: Use PyMem_Free wherever PyArg_ParseTuple+es is used + +https://docs.python.org/2.0/ext/parseTuple.html +--- + fontforge/python.c | 62 +++++++++++++++++++++++++++------------------- + 1 file changed, 38 insertions(+), 27 deletions(-) + +diff --git a/fontforge/python.c b/fontforge/python.c +index 5d6820c40..c6d7aca2b 100644 +--- a/fontforge/python.c ++++ b/fontforge/python.c +@@ -607,7 +607,13 @@ return( NULL ); + } + } + +- if ( !SetPrefs((char *) prefname,&val,NULL)) { ++ bool succeeded = SetPrefs((char *) prefname,&val,NULL); ++ if (val.type == v_str && val.u.sval) { ++ PyMem_Free(val.u.sval); ++ val.u.sval = NULL; ++ } ++ ++ if (!succeeded) { + PyErr_Format(PyExc_NameError, "Unknown preference item in SetPrefs: %s", prefname ); + return( NULL ); + } +@@ -728,7 +734,7 @@ static PyObject *PyFF_UnicodeFromName(PyObject *UNUSED(self), PyObject *args) { + return( NULL ); + + ret = Py_BuildValue("i", UniFromName((char *) name, ui_none,&custom)); +- free(name); ++ PyMem_Free(name); + return( ret ); + } + +@@ -1361,12 +1367,14 @@ Py_RETURN_NONE; /* Well, that was pointless */ + if ( import==Py_None ) + import=NULL; + else if ( !PyCallable_Check(import) ) { ++ PyMem_Free(name); + PyErr_Format(PyExc_TypeError, "First argument is not callable" ); + return( NULL ); + } + if ( export==Py_None ) + export=NULL; + else if ( !PyCallable_Check(export) ) { ++ PyMem_Free(name); + PyErr_Format(PyExc_TypeError, "Second argument is not callable" ); + return( NULL ); + } +@@ -1472,7 +1480,7 @@ static PyObject *PyFF_logError(PyObject *UNUSED(self), PyObject *args) { + if ( !PyArg_ParseTuple(args,"es","UTF-8", &msg) ) + return( NULL ); + LogError(msg); +- free(msg); ++ PyMem_Free(msg); + Py_RETURN_NONE; + } + +@@ -1486,6 +1494,8 @@ static PyObject *PyFF_postError(PyObject *UNUSED(self), PyObject *args) { + return( NULL ); + if( showPythonErrors ) + ff_post_error(title,msg); /* Prints to stderr if no ui */ ++ PyMem_Free(title); ++ PyMem_Free(msg); + Py_RETURN_NONE; + } + +@@ -1494,6 +1504,8 @@ static PyObject *PyFF_postNotice(PyObject *UNUSED(self), PyObject *args) { + if ( !PyArg_ParseTuple(args,"eses","UTF-8", &title, "UTF-8", &msg) ) + return( NULL ); + ff_post_notice(title,msg); /* Prints to stderr if no ui */ ++ PyMem_Free(title); ++ PyMem_Free(msg); + Py_RETURN_NONE; + } + +@@ -1511,8 +1523,8 @@ return( NULL ); + return( NULL ); + + ret = ff_open_filename(title,def,filter); +- free(title); +- free(def); ++ PyMem_Free(title); ++ PyMem_Free(def); + if ( ret==NULL ) + Py_RETURN_NONE; + reto = DECODE_UTF8(ret,strlen(ret),NULL); +@@ -1534,8 +1546,8 @@ return( NULL ); + return( NULL ); + + ret = ff_save_filename(title,def,filter); +- free(title); +- free(def); ++ PyMem_Free(title); ++ PyMem_Free(def); + if ( ret==NULL ) + Py_RETURN_NONE; + reto = DECODE_UTF8(ret,strlen(ret),NULL); +@@ -1558,8 +1570,8 @@ return( NULL ); + return( NULL ); + if ( !PySequence_Check(answero) || STRING_CHECK(answero)) { + PyErr_Format(PyExc_TypeError, "Expected a tuple of strings for the third argument"); +- free(title); +- free(quest); ++ PyMem_Free(title); ++ PyMem_Free(quest); + return( NULL ); + } + cnt = PySequence_Size(answero); +@@ -1568,16 +1580,16 @@ return( NULL ); + cancel = cnt-1; + if ( cancel<0 || cancel>=cnt || def<0 || def>=cnt ) { + PyErr_Format(PyExc_ValueError, "Value out of bounds for 4th or 5th argument"); +- free(title); +- free(quest); ++ PyMem_Free(title); ++ PyMem_Free(quest); + free(answers); + return( NULL ); + } + for ( i=0; i=cnt ) { + PyErr_Format(PyExc_ValueError, "Value out of bounds for 4th argument"); +- free(title); +- free(quest); ++ PyMem_Free(title); ++ PyMem_Free(quest); + return( NULL ); + } + for ( i=0; i