From c41d03718b8dc50076405c3d0f3136cfaa1cb21b Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Fri, 9 Nov 2018 12:22:16 +0000 Subject: [PATCH] algorithms.c, knock-on: Eliminate `f_freeme' flags. Organization: Straylight/Edgeware From: Mark Wooding These were being carefully set and checked on ciphers, hashes, and MACs, for no good reason because the flag was always set. Abolish it. The flag still exists for `grand' objects because they get injected into Python through the `pgen' event-handling machinery, and Python mustn't destroy them just because it loses its reference. (It also mustn't try to hang onto them, so there's a longstanding bug in there.) --- algorithms.c | 27 +++++++++------------------ catacomb-python.h | 13 +++---------- pubkey.c | 4 ++-- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/algorithms.c b/algorithms.c index 033176b..8eced24 100644 --- a/algorithms.c +++ b/algorithms.c @@ -457,14 +457,13 @@ PyTypeObject *gccipher_pytype, *gcipher_pytype; CONVFUNC(gccipher, gccipher *, GCCIPHER_CC) CONVFUNC(gcipher, gcipher *, GCIPHER_C) -PyObject *gcipher_pywrap(PyObject *cobj, gcipher *c, unsigned f) +PyObject *gcipher_pywrap(PyObject *cobj, gcipher *c) { gcipher_pyobj *g; if (!cobj) cobj = gccipher_pywrap((/*unconst*/ gccipher *)GC_CLASS(c)); else Py_INCREF(cobj); g = PyObject_NEW(gcipher_pyobj, (PyTypeObject *)cobj); g->c = c; - g->f = f; return ((PyObject *)g); } @@ -478,8 +477,7 @@ static PyObject *gcipher_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) goto end; if (keysz(sz, GCCIPHER_CC(ty)->keysz) != sz) VALERR("bad key length"); return (gcipher_pywrap((PyObject *)ty, - GC_INIT(GCCIPHER_CC(ty), k, sz), - f_freeme)); + GC_INIT(GCCIPHER_CC(ty), k, sz))); end: return (0); } @@ -503,8 +501,7 @@ PyObject *gccipher_pywrap(gccipher *cc) static void gcipher_pydealloc(PyObject *me) { - if (GCIPHER_F(me) & f_freeme) - GC_DESTROY(GCIPHER_C(me)); + GC_DESTROY(GCIPHER_C(me)); Py_DECREF(me->ob_type); FREEOBJ(me); } @@ -725,7 +722,7 @@ static PyObject *ghash_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) static const char *const kwlist[] = { 0 }; if (!PyArg_ParseTupleAndKeywords(arg, kw, ":new", KWLIST)) goto end; - return (ghash_pywrap((PyObject *)ty, GH_INIT(GCHASH_CH(ty)), f_freeme)); + return (ghash_pywrap((PyObject *)ty, GH_INIT(GCHASH_CH(ty)))); end: return (0); } @@ -747,21 +744,19 @@ PyObject *gchash_pywrap(gchash *ch) return ((PyObject *)g); } -PyObject *ghash_pywrap(PyObject *cobj, ghash *h, unsigned f) +PyObject *ghash_pywrap(PyObject *cobj, ghash *h) { ghash_pyobj *g; if (!cobj) cobj = gchash_pywrap((/*unconst*/ gchash *)GH_CLASS(h)); else Py_INCREF(cobj); g = PyObject_NEW(ghash_pyobj, (PyTypeObject *)cobj); g->h = h; - g->f = f; return ((PyObject *)g); } static void ghash_pydealloc(PyObject *me) { - if (GHASH_F(me) & f_freeme) - GH_DESTROY(GHASH_H(me)); + GH_DESTROY(GHASH_H(me)); Py_DECREF(me->ob_type); FREEOBJ(me); } @@ -966,8 +961,7 @@ static PyObject *gmac_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) goto end; if (keysz(sz, GCMAC_CM(ty)->keysz) != sz) VALERR("bad key length"); return (gmac_pywrap((PyObject *)ty, - GM_KEY(GCMAC_CM(ty), k, sz), - f_freeme)); + GM_KEY(GCMAC_CM(ty), k, sz))); end: return (0); } @@ -980,7 +974,6 @@ static PyObject *gmhash_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) if (!PyArg_ParseTupleAndKeywords(arg, kw, ":new", KWLIST)) return (0); g = PyObject_NEW(ghash_pyobj, ty); g->h = GM_INIT(GMAC_M(ty)); - g->f = f_freeme; Py_INCREF(ty); return ((PyObject *)g); } @@ -1002,7 +995,7 @@ PyObject *gcmac_pywrap(gcmac *cm) return ((PyObject *)g); } -PyObject *gmac_pywrap(PyObject *cobj, gmac *m, unsigned f) +PyObject *gmac_pywrap(PyObject *cobj, gmac *m) { gmac_pyobj *g; if (!cobj) cobj = gcmac_pywrap((/*unconst*/ gcmac *)GM_CLASS(m)); @@ -1021,14 +1014,12 @@ PyObject *gmac_pywrap(PyObject *cobj, gmac *m, unsigned f) g->ty.ht_type.tp_new = gmhash_pynew; typeready(&g->ty.ht_type); g->m = m; - g->f = f; return ((PyObject *)g); } static void gmac_pydealloc(PyObject *me) { - if (GMAC_F(me) & f_freeme) - GM_DESTROY(GMAC_M(me)); + GM_DESTROY(GMAC_M(me)); Py_DECREF(me->ob_type); PyType_Type.tp_dealloc(me); } diff --git a/catacomb-python.h b/catacomb-python.h index 364a3c9..d68026d 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -503,21 +503,18 @@ typedef struct gccipher_pyobj { extern PyTypeObject *gccipher_pytype; #define GCCIPHER_PYCHECK(o) PyObject_TypeCheck((o), gccipher_pytype) #define GCCIPHER_CC(o) (((gccipher_pyobj *)(o))->cc) -#define GCCIPHER_F(o) (((gccipher_pyobj *)(o))->f) extern PyObject *gccipher_pywrap(gccipher *); extern int convgccipher(PyObject *, void *); typedef struct gcipher_pyobj { PyObject_HEAD - unsigned f; gcipher *c; } gcipher_pyobj; extern PyTypeObject *gcipher_pytype; #define GCIPHER_PYCHECK(o) PyObject_TypeCheck((o), gcipher_pytype) #define GCIPHER_C(o) (((gcipher_pyobj *)(o))->c) -#define GCIPHER_F(o) (((gcipher_pyobj *)(o))->f) -extern PyObject *gcipher_pywrap(PyObject *, gcipher *, unsigned); +extern PyObject *gcipher_pywrap(PyObject *, gcipher *); extern int convgcipher(PyObject *, void *); typedef struct gchash_pyobj { @@ -528,13 +525,11 @@ typedef struct gchash_pyobj { extern PyTypeObject *gchash_pytype; #define GCHASH_PYCHECK(o) PyObject_TypeCheck((o), gchash_pytype) #define GCHASH_CH(o) (((gchash_pyobj *)(o))->ch) -#define GCHASH_F(o) (((gchash_pyobj *)(o))->f) extern PyObject *gchash_pywrap(gchash *); extern int convgchash(PyObject *, void *); typedef struct ghash_pyobj { PyObject_HEAD - unsigned f; ghash *h; } ghash_pyobj; @@ -542,8 +537,7 @@ extern PyTypeObject *ghash_pytype, *gmhash_pytype; extern PyObject *sha_pyobj, *has160_pyobj; #define GHASH_PYCHECK(o) PyObject_TypeCheck((o), ghash_pytype) #define GHASH_H(o) (((ghash_pyobj *)(o))->h) -#define GHASH_F(o) (((ghash_pyobj *)(o))->f) -extern PyObject *ghash_pywrap(PyObject *, ghash *, unsigned); +extern PyObject *ghash_pywrap(PyObject *, ghash *); extern int convghash(PyObject *, void *); extern int convgmhash(PyObject *, void *); @@ -561,7 +555,6 @@ extern int convgcmac(PyObject *, void *); typedef struct gmac_pyobj { PyHeapTypeObject ty; - unsigned f; gmac *m; } gmac_pyobj; @@ -569,7 +562,7 @@ extern PyTypeObject *gmac_pytype; #define GMAC_PYCHECK(o) PyObject_TypeCheck((o), gmac_pytype) #define GMAC_M(o) (((gmac_pyobj *)(o))->m) #define GMAC_F(o) (((gmac_pyobj *)(o))->f) -extern PyObject *gmac_pywrap(PyObject *, gmac *, unsigned); +extern PyObject *gmac_pywrap(PyObject *, gmac *); extern int convgmac(PyObject *, void *); /*----- Key generation ----------------------------------------------------*/ diff --git a/pubkey.c b/pubkey.c index 6cdfad9..9c43ca7 100644 --- a/pubkey.c +++ b/pubkey.c @@ -112,7 +112,7 @@ end: static PyObject *dsameth_beginhash(PyObject *me, PyObject *arg) { if (!PyArg_ParseTuple(arg, ":beginhash")) return (0); - return (ghash_pywrap(DSA_HASH(me), gdsa_beginhash(DSA_D(me)), f_freeme)); + return (ghash_pywrap(DSA_HASH(me), gdsa_beginhash(DSA_D(me)))); } static PyObject *dsameth_endhash(PyObject *me, PyObject *arg) @@ -366,7 +366,7 @@ end: static PyObject *kcdsameth_beginhash(PyObject *me, PyObject *arg) { if (!PyArg_ParseTuple(arg, ":beginhash")) return (0); - return (ghash_pywrap(DSA_HASH(me), gkcdsa_beginhash(DSA_D(me)), f_freeme)); + return (ghash_pywrap(DSA_HASH(me), gkcdsa_beginhash(DSA_D(me)))); } static PyObject *kcdsameth_endhash(PyObject *me, PyObject *arg) -- [mdw]