[ 
https://issues.apache.org/jira/browse/PROTON-687?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14139399#comment-14139399
 ] 

Ken Giusti commented on PROTON-687:
-----------------------------------

>From what I can tell, the engine decrements the delivery's reference count 
>when it is removed from the owning links' settled/unsettled delivery list - 
>but it never increments the delivery when it is initially put on the list.   
>This appears to be causing the corruption, at least for the above test.

I've tried the following fix:

diff --git a/proton-c/src/engine/engine.c b/proton-c/src/engine/engine.c
index 0765a81..b7239d8 100644
--- a/proton-c/src/engine/engine.c
+++ b/proton-c/src/engine/engine.c
@@ -1123,6 +1123,7 @@ pn_delivery_t *pn_delivery(pn_link_t *link, 
pn_delivery_tag_t tag)
   delivery->updated = false;
   delivery->settled = false;
   LL_ADD(link, unsettled, delivery);
+  pn_incref(delivery);
   delivery->work_next = NULL;
   delivery->work_prev = NULL;
   delivery->work = false;


This prevents the memory corruption, but it results in memory leaks in 
Messenger, and a failure in the delivery event tests:

proton_tests.engine.EventTest.testDeliveryEvents 
............................................................................................
 fail
Error during test:  Traceback (most recent call last):
    File "./tests/python/proton-test", line 352, in run
      phase()
    File 
"/home/kgiusti/work/proton/qpid-proton/tests/python/proton_tests/engine.py", 
line 2219, in testDeliveryEvents
      Event.SESSION_FINAL, Event.CONNECTION_FINAL)
    File 
"/home/kgiusti/work/proton/qpid-proton/tests/python/proton_tests/engine.py", 
line 2087, in expect
      return self.expect_oneof(types)
    File 
"/home/kgiusti/work/proton/qpid-proton/tests/python/proton_tests/engine.py", 
line 2102, in expect_oneof
      assert False, "actual events %s did not match any of the expected 
sequences: %s" % (events, sequences)
  AssertionError: actual events [PN_CONNECTION_UNBOUND(<proton.Connection 
object at 0xba77ac0>), PN_TRANSPORT(<proton.Transport object at 0xc40d0c0>)] 
did not match any of the expected sequences: ((3, 23, 21, 14, 8),)

I'm not sure I understand the intent of the reference counting in the case of 
deliveries - I'm turning this bug over to Rafi for his analysis.

> Memory corruption in proton-test
> --------------------------------
>
>                 Key: PROTON-687
>                 URL: https://issues.apache.org/jira/browse/PROTON-687
>             Project: Qpid Proton
>          Issue Type: Bug
>          Components: proton-c, python-binding
>    Affects Versions: 0.8
>            Reporter: Cliff Jansen
>            Assignee: Ken Giusti
>            Priority: Blocker
>         Attachments: segv.patch
>
>
> proton-test will fail with memory violations.  Deallocated memory is 
> accessed, usually with benign results but less often on Windows.
> The attached crude patch allows the bug to be "discovered" on Linux as well.
> It is not clear to me if the problem is with the swig wrapper, or whether 
> this just exposes a reference counting bug in proton-c.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to