[rabbitmq-discuss] RabbitMQ-C: amqp_simple_rpc blocks waiting for frames already received

Clint Miller clint at rtcreativegroup.com
Tue Jul 26 16:17:25 BST 2011


Hmm... I think I follow you. I'm correct thinking that AMQPcpp is maintained by someone not associated with VMWare/RabbitMQ?

Regardless, thanks for your work looking into this issue.

Clint

On Jul 26, 2011, at 10:13 AM, David Wragg wrote:

> Hi Clint,
> 
> Clint Miller <clint at rtcreativegroup.com> writes:
>> OK, here's the basic example. It shows how the basic.consume method of
>> the C++ library is not functioning correctly, but the basic.get works
>> correctly.
>> 
>> There's a basic Makefile that will probably require a little tweaking to get it working. It also depends on the 2 following libraries:
>> 
>> - RabbitMQ-C (from the official repository, I built it at rev/changeset ef4df46cc0db)
>> - AMQPcpp (from https://github.com/akalend/amqpcpp.git I built it at
>> rev/changeset 80b17375f5bed6965acc07477499285b6851c92f)
> 
> Thanks, I got it building quite easily.  I'm not sure if I'm able to
> reproduce the problem that you described in your original mail, but I
> can confirm that it doesn't work for me.
> 
> This isn't primarily due to the use of librabbitmq in amqpcpp.  That
> looks basically sound (there are some calls to amqp_release_buffers in
> AMQPQueue.cpp that should be amqp_maybe_release_buffers, but otherwise I
> haven't found anything specifically wrong).
> 
> But when I run the program, it aborts.  Running it inside gdb, I get
> double free errors reported.  So I ran it under valgrind.  And valgrind
> finds many problems in amqpcpp.  (In fairness, it also complains about
> some things in librabbitmq, but they are about the use of uninitialized
> data, and may be harmless.)
> 
> The critical issue is a double free of the message buffer in
> AMQPQueue::sendConsumeCommand: At AMQPQueue.cpp#L512, buf is handed to
> the AMQPMessage object, and then freed.  But AMQPMessage holds on to
> this pointer, and frees it again in its destructor (called via the
> message auto_ptr).
> 
> valgrind also revealed a lot of cases of amqpcpp trying to use freed
> data (e.g. by passing a char* to AMQPQueue::setConsumerTag, you invoke
> the implicit conversion to string, and the string data is freed after
> the call; but setConsumerTag then uses c_str to get a pointer to the
> string data, which is saved in consumer_tag and only used later in
> sendConsumeCommand).
> 
> I think amqpcpp needs cleaning up with valgrind in order to work
> reliably.
> 
> David
> 
> -- 
> David Wragg
> Staff Engineer, RabbitMQ
> VMware, Inc.
> 



More information about the rabbitmq-discuss mailing list