summaryrefslogtreecommitdiff
path: root/user/fontforge
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2019-01-23 02:49:08 +0000
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2019-01-23 02:49:08 +0000
commit5ab86fdbc4e00a7133f00b6b89639cf48b62e326 (patch)
tree24a1815fe8bea7648def9cfd0e5f8048e7713c5c /user/fontforge
parent7f8661463e7b71367d5ccfef71113ad68dd16b69 (diff)
downloadpackages-5ab86fdbc4e00a7133f00b6b89639cf48b62e326.tar.gz
packages-5ab86fdbc4e00a7133f00b6b89639cf48b62e326.tar.bz2
packages-5ab86fdbc4e00a7133f00b6b89639cf48b62e326.tar.xz
packages-5ab86fdbc4e00a7133f00b6b89639cf48b62e326.zip
user/fontforge: fix PyMalloc usage, segfaults on 32-bit
Diffstat (limited to 'user/fontforge')
-rw-r--r--user/fontforge/APKBUILD9
-rw-r--r--user/fontforge/python3.patch197
2 files changed, 203 insertions, 3 deletions
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 <awilfox@adelielinux.org>
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 <jtanx@outlook.com>
+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; ++i ) {
+ PyObject *utf8_name = PYBYTES_UTF8(PySequence_GetItem(answero,i));
+ if ( utf8_name==NULL ) {
+- free(title);
+- free(quest);
++ PyMem_Free(title);
++ PyMem_Free(quest);
+ FreeStringArray( i, answers );
+ return( NULL );
+ }
+@@ -1587,8 +1599,8 @@ return( NULL );
+ answers[cnt] = NULL;
+
+ ret = ff_ask(title,(const char **) answers,def,cancel,quest);
+- free(title);
+- free(quest);
++ PyMem_Free(title);
++ PyMem_Free(quest);
+ FreeStringArray( cnt, answers );
+ return( Py_BuildValue("i",ret));
+ }
+@@ -1608,23 +1620,23 @@ 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);
+ answers = calloc(cnt+1, sizeof(char *));
+ if ( def<0 || def>=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<cnt; ++i ) {
+ PyObject *utf8_name = PYBYTES_UTF8(PySequence_GetItem(answero,i));
+ if ( utf8_name==NULL ) {
+- free(title);
+- free(quest);
++ PyMem_Free(title);
++ PyMem_Free(quest);
+ FreeStringArray( i, answers );
+ return( NULL );
+ }
+@@ -1634,8 +1646,8 @@ return( NULL );
+ answers[cnt] = NULL;
+
+ ret = ff_choose(title,(const char **) answers,cnt,def,quest);
+- free(title);
+- free(quest);
++ PyMem_Free(title);
++ PyMem_Free(quest);
+ FreeStringArray( cnt, answers );
+ return( Py_BuildValue("i",ret));
+ }
+@@ -1654,8 +1666,8 @@ return( NULL );
+ return( NULL );
+
+ ret = ff_ask_string(title,def,quest);
+- free(title);
+- free(quest);
++ PyMem_Free(title);
++ PyMem_Free(quest);
+ free(def);
+ if ( ret==NULL )
+ Py_RETURN_NONE;