Package: htcondor-python-binding Version: 8.7.8 Severity: normal Hi, I encountered a bug with the python-bindings of ClassAd objects. Below are the minimal codes to reproduce the problem: Python 3.6.5 | packaged by conda-forge | (default, Apr 6 2018, 13:39:56) [GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux >>> import htcondor, classad >>> coll = htcondor.Collector() >>> schedd= htcondor.Schedd(coll.locate(htcondor.DaemonTypes.Schedd)) >>> print([(k,v) for k,v in schedd.query()[0].items()]) Segmentation fault (core dumped) The root of this SEGFAULT is that the `items` method of `ClassAdWrapper` returns invalid references to its child objects. A ClassAd object usually contains some objects of nontrivial type, such as
`classad.ExprTree`, which are destroyed when their parent is garbage-collected by the python runtime. Therefore trying to access such objects results in memory access violation (SEGFAULT). Here is the code section responsible for it:
https://github.com/htcondor/htcondor/blob/3c73f7c8bcb9d4b99793cd3bc97251639e18b99d/src/python-bindings/classad.cpp#L993 This is a python3-only problem because the `items` method of python 3 object returns an `iterator` instead of a list of tuples. The proposed solution is to properly transform any non-trivial child object of `ClassAdWrapper` into a python object (with its own reference counter) so that the runtime can garbage collected them
correctly. Cheers, Mingxuan Lin |