You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Jiri Daněk (JIRA)" <ji...@apache.org> on 2017/10/04 19:22:01 UTC
[jira] [Created] (DISPATCH-848) Direct leak of 48 byte(s) in 1
object(s) allocated from qdr_core_subscribe in
router_core/route_tables.c:149
Jiri Daněk created DISPATCH-848:
-----------------------------------
Summary: Direct leak of 48 byte(s) in 1 object(s) allocated from qdr_core_subscribe in router_core/route_tables.c:149
Key: DISPATCH-848
URL: https://issues.apache.org/jira/browse/DISPATCH-848
Project: Qpid Dispatch
Issue Type: Bug
Components: Tests
Affects Versions: 1.1.0
Environment: Git tip of Proton and Dtspatch, commit hashes follow
{noformat}
commit aece4ad2f4e4eb2d141020c59c393a30a79f53a9 (upstream/master)
Author: Andrew Stitcher <as...@apache.org>
PROTON-1609: Fix C++ example flags
{noformat}
{noformat}
commit 18c5f8d6293de4227c8c17ef08675cb4eaef689c (HEAD -> master, upstream/master)
Author: Ganesh Murthy <gm...@redhat.com>
NO-JIRA - Removed accidental printf inclusion
{noformat}
Reporter: Jiri Daněk
Priority: Minor
Compile Proton and Dispatch with the Address Sanitizer option (c.f. DISPATCH-809) and run ctest
{noformat}
# proton
cmake .. -DBUILD_GO=OFF -DENABLE_SANITIZERS=ON -DCMAKE_INSTALL_PREFIX=../install_asan -DCMAKE_BUILD_TYPE=Release -GNinja
{noformat}
{noformat}
# dispatch
cmake .. -DUSE_SANITIZERS=ON -DProton_DIR=`pwd`/../../qpid-proton/install_asan/lib64/cmake/Proton/ -DCMAKE_BUILD_TYPE=Release -GNinja
LD_PRELOAD=/nix/store/zahs1kwq4742f6l6h7yy4mdj44zzc1kd-gcc-7-20170409-lib/lib/libasan.so ASAN_OPTIONS=symbolize=1,color=always LSAN_OPTIONS=suppressions=`pwd`/../../qpid-proton/LSan.supp ctest -VV
{noformat}
{noformat}
[...]
9: Test Case parse_tree_tests.test_matches: PASS
9: Test Case parse_tree_tests.test_multiple_matches: PASS
9:
9: =================================================================
9: ==25904==ERROR: LeakSanitizer: detected memory leaks
9:
9: Direct leak of 48 byte(s) in 1 object(s) allocated from:
9: #0 0x7fb5442cb050 in __interceptor_malloc (/nix/store/zahs1kwq4742f6l6h7yy4mdj44zzc1kd-gcc-7-20170409-lib/lib/libasan.so+0xd9050)
9: #1 0x7fb543dd94fe in qdr_core_subscribe ../src/router_core/route_tables.c:149
9: #2 0x7fb543d89ff0 in IoAdapter_init ../src/python_embedded.c:548
9: #3 0x7fb542ba8ecd in type_call (/nix/store/1snk2wkpv97an87pk1842fgskl1vqhkr-python-2.7.14/lib/libpython2.7.so.1.0+0x9fecd)
9:
9: -----------------------------------------------------
9: Suppressions used:
9: count bytes template
9: 1310 2021760 dictresize
9: 204 188272 _PyObject_GC_Malloc
9: 45 39369 PyString_FromStringAndSize
9: 308 15056 list_resize
9: 11 9784 PyString_FromString
9: 2 1280 _PyObject_GC_Resize
9: 1035 24104 PyList_New
9: 14 672 s_init
9: 1 32 PyThread_allocate_lock
9: 11 11097 type_new
9: 3 3984 unicode_resize
9: 179 204712 _PyUnicode_New.part.8
9: 11 8028 PyObject_Realloc
9: 37 120 _ctypes_alloc_format_string
9: 3 24576 set_table_resize
9: -----------------------------------------------------
9:
9: SUMMARY: AddressSanitizer: 48 byte(s) leaked in 1 allocation(s).
9/36 Test #9: unit_tests ................................***Failed 0.21 sec
{noformat}
The relevant functions are
{code}
static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
{
PyObject *addr;
char aclass = 'L';
char phase = '0';
int treatment = QD_TREATMENT_ANYCAST_CLOSEST;
if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &treatment))
return -1;
if (!PyCallable_Check(self->handler)) {
PyErr_SetString(PyExc_TypeError, "IoAdapter.__init__ handler is not callable");
return -1;
}
if (treatment == QD_TREATMENT_ANYCAST_BALANCED) {
PyErr_SetString(PyExc_TypeError, "IoAdapter: ANYCAST_BALANCED is not supported for in-process subscriptions");
return -1;
}
Py_INCREF(self->handler);
self->qd = dispatch;
self->core = qd_router_core(self->qd);
const char *address = PyString_AsString(addr);
if (!address) return -1;
qd_error_clear();
self->sub = qdr_core_subscribe(self->core, address, aclass, phase, treatment, qd_io_rx_handler, self);
if (qd_error_code()) {
PyErr_SetString(PyExc_RuntimeError, qd_error_message());
return -1;
}
return 0;
}
{code}
{code}
static void IoAdapter_dealloc(IoAdapter* self)
{
qdr_core_unsubscribe(self->sub);
Py_DECREF(self->handler);
self->ob_type->tp_free((PyObject*)self);
}
{code}
{code}
static PyTypeObject IoAdapterType = {
PyObject_HEAD_INIT(0)
0, /* ob_size*/
DISPATCH_MODULE ".IoAdapter", /* tp_name*/
sizeof(IoAdapter), /* tp_basicsize*/
0, /* tp_itemsize*/
(destructor)IoAdapter_dealloc, /* tp_dealloc*/
0, /* tp_print*/
0, /* tp_getattr*/
0, /* tp_setattr*/
0, /* tp_compare*/
0, /* tp_repr*/
0, /* tp_as_number*/
0, /* tp_as_sequence*/
0, /* tp_as_mapping*/
0, /* tp_hash */
0, /* tp_call*/
0, /* tp_str*/
0, /* tp_getattro*/
0, /* tp_setattro*/
0, /* tp_as_buffer*/
Py_TPFLAGS_DEFAULT, /* tp_flags*/
"Dispatch IO Adapter", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
IoAdapter_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)IoAdapter_init, /* tp_init */
0, /* tp_alloc */
0, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
0, /* tp_mro */
0, /* tp_cache */
0, /* tp_subclasses */
0, /* tp_weaklist */
0, /* tp_del */
0 /* tp_version_tag */
};
{code}
I believe that there is indeed nothing that would free the {{sub}} field in {{IoAdapter}}.
Depending on how this is triaged (real issue or not, I am myself a bit unsure about freeing memory in relation to Python) I may have more reports coming.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org