You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Ben Watrous (JIRA)" <ji...@apache.org> on 2009/07/28 19:26:33 UTC
[jira] Created: (AMQCPP-257) Segfault on session or connection
cleanup
Segfault on session or connection cleanup
-----------------------------------------
Key: AMQCPP-257
URL: https://issues.apache.org/activemq/browse/AMQCPP-257
Project: ActiveMQ C++ Client
Issue Type: Bug
Components: CMS Impl, Openwire
Affects Versions: 3.0.1
Environment: Windows Visual Studio 2005
Reporter: Ben Watrous
Assignee: Timothy Bish
I recently moved up to ActiveMQ CPP 3.0 (and now 3.0.1) from 2.2 to take advantage of the failover transport, and discovered a segfault during testing. It may be related to my test procedure, but I have found a quick patch to activemq/core/ActiveMQSession.cpp that seems to resolve the issue.
It appears that in some cases of connection loss, the connection->disposeOf() call may throw. In which case the Session is left in an invalid state - the producers or consumer that caused the exception is still in the list, but it has already been destroyed. This leads to an invalid pointer access later on.
In the current test, the exception is thrown because the connection to the broker has been dropped so disposeOf fails.
Test Procedure:
Open the attached example (modified version of the basic sample) in the Visual Studio debugger.
Set a breakpoint at the "producer->send( message );" line.
Run to breakpoint.
To simulate a broken connection, connect to broker via JMX console and execute the JMX "Stop" operation on the Connector for the producer.
Continue the debugger.
( Note: I "Purge" the TEST.FOO queue between runs since messages may sometimes be left in queue during this type of testing. )
Suggested Patch to ActiveMQSession.cpp:
153a154
> try {
155a157,159
> }
> /* Absorb */
> AMQ_CATCHALL_NOTHROW()
1042a1047
> this->consumers.remove( id );
1045c1050
< this->consumers.remove( id );
---
> // this->consumers.remove( id );
1065a1071
> this->producers.remove( id );
1068c1074
< this->producers.remove( id );
---
> // this->producers.remove( id );
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Updated: (AMQCPP-257) Segfault on session or connection
cleanup
Posted by "Ben Watrous (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/activemq/browse/AMQCPP-257?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ben Watrous updated AMQCPP-257:
-------------------------------
Attachment: ActiveMQSession.cpp
Attached modified ActiveMQSession.cpp
> Segfault on session or connection cleanup
> -----------------------------------------
>
> Key: AMQCPP-257
> URL: https://issues.apache.org/activemq/browse/AMQCPP-257
> Project: ActiveMQ C++ Client
> Issue Type: Bug
> Components: CMS Impl, Openwire
> Affects Versions: 3.0.1
> Environment: Windows Visual Studio 2005
> Reporter: Ben Watrous
> Assignee: Timothy Bish
> Attachments: ActiveMQSession.cpp, main.cpp
>
>
> I recently moved up to ActiveMQ CPP 3.0 (and now 3.0.1) from 2.2 to take advantage of the failover transport, and discovered a segfault during testing. It may be related to my test procedure, but I have found a quick patch to activemq/core/ActiveMQSession.cpp that seems to resolve the issue.
> It appears that in some cases of connection loss, the connection->disposeOf() call may throw. In which case the Session is left in an invalid state - the producers or consumer that caused the exception is still in the list, but it has already been destroyed. This leads to an invalid pointer access later on.
> In the current test, the exception is thrown because the connection to the broker has been dropped so disposeOf fails.
> Test Procedure:
> Open the attached example (modified version of the basic sample) in the Visual Studio debugger.
> Set a breakpoint at the "producer->send( message );" line.
> Run to breakpoint.
> To simulate a broken connection, connect to broker via JMX console and execute the JMX "Stop" operation on the Connector for the producer.
> Continue the debugger.
> ( Note: I "Purge" the TEST.FOO queue between runs since messages may sometimes be left in queue during this type of testing. )
> Suggested Patch to ActiveMQSession.cpp:
> 153a154
> > try {
> 155a157,159
> > }
> > /* Absorb */
> > AMQ_CATCHALL_NOTHROW()
> 1042a1047
> > this->consumers.remove( id );
> 1045c1050
> < this->consumers.remove( id );
> ---
> > // this->consumers.remove( id );
> 1065a1071
> > this->producers.remove( id );
> 1068c1074
> < this->producers.remove( id );
> ---
> > // this->producers.remove( id );
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Updated: (AMQCPP-257) Segfault on session or connection
cleanup
Posted by "Ben Watrous (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/activemq/browse/AMQCPP-257?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ben Watrous updated AMQCPP-257:
-------------------------------
Attachment: main.cpp
Attached modified example
> Segfault on session or connection cleanup
> -----------------------------------------
>
> Key: AMQCPP-257
> URL: https://issues.apache.org/activemq/browse/AMQCPP-257
> Project: ActiveMQ C++ Client
> Issue Type: Bug
> Components: CMS Impl, Openwire
> Affects Versions: 3.0.1
> Environment: Windows Visual Studio 2005
> Reporter: Ben Watrous
> Assignee: Timothy Bish
> Attachments: main.cpp
>
>
> I recently moved up to ActiveMQ CPP 3.0 (and now 3.0.1) from 2.2 to take advantage of the failover transport, and discovered a segfault during testing. It may be related to my test procedure, but I have found a quick patch to activemq/core/ActiveMQSession.cpp that seems to resolve the issue.
> It appears that in some cases of connection loss, the connection->disposeOf() call may throw. In which case the Session is left in an invalid state - the producers or consumer that caused the exception is still in the list, but it has already been destroyed. This leads to an invalid pointer access later on.
> In the current test, the exception is thrown because the connection to the broker has been dropped so disposeOf fails.
> Test Procedure:
> Open the attached example (modified version of the basic sample) in the Visual Studio debugger.
> Set a breakpoint at the "producer->send( message );" line.
> Run to breakpoint.
> To simulate a broken connection, connect to broker via JMX console and execute the JMX "Stop" operation on the Connector for the producer.
> Continue the debugger.
> ( Note: I "Purge" the TEST.FOO queue between runs since messages may sometimes be left in queue during this type of testing. )
> Suggested Patch to ActiveMQSession.cpp:
> 153a154
> > try {
> 155a157,159
> > }
> > /* Absorb */
> > AMQ_CATCHALL_NOTHROW()
> 1042a1047
> > this->consumers.remove( id );
> 1045c1050
> < this->consumers.remove( id );
> ---
> > // this->consumers.remove( id );
> 1065a1071
> > this->producers.remove( id );
> 1068c1074
> < this->producers.remove( id );
> ---
> > // this->producers.remove( id );
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Updated: (AMQCPP-257) Segfault on session or connection
cleanup
Posted by "Timothy Bish (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/activemq/browse/AMQCPP-257?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Timothy Bish updated AMQCPP-257:
--------------------------------
Fix Version/s: 3.1
> Segfault on session or connection cleanup
> -----------------------------------------
>
> Key: AMQCPP-257
> URL: https://issues.apache.org/activemq/browse/AMQCPP-257
> Project: ActiveMQ C++ Client
> Issue Type: Bug
> Components: CMS Impl, Openwire
> Affects Versions: 3.0.1
> Environment: Windows Visual Studio 2005
> Reporter: Ben Watrous
> Assignee: Timothy Bish
> Fix For: 3.1
>
> Attachments: ActiveMQSession.cpp, main.cpp
>
>
> I recently moved up to ActiveMQ CPP 3.0 (and now 3.0.1) from 2.2 to take advantage of the failover transport, and discovered a segfault during testing. It may be related to my test procedure, but I have found a quick patch to activemq/core/ActiveMQSession.cpp that seems to resolve the issue.
> It appears that in some cases of connection loss, the connection->disposeOf() call may throw. In which case the Session is left in an invalid state - the producers or consumer that caused the exception is still in the list, but it has already been destroyed. This leads to an invalid pointer access later on.
> In the current test, the exception is thrown because the connection to the broker has been dropped so disposeOf fails.
> Test Procedure:
> Open the attached example (modified version of the basic sample) in the Visual Studio debugger.
> Set a breakpoint at the "producer->send( message );" line.
> Run to breakpoint.
> To simulate a broken connection, connect to broker via JMX console and execute the JMX "Stop" operation on the Connector for the producer.
> Continue the debugger.
> ( Note: I "Purge" the TEST.FOO queue between runs since messages may sometimes be left in queue during this type of testing. )
> Suggested Patch to ActiveMQSession.cpp:
> 153a154
> > try {
> 155a157,159
> > }
> > /* Absorb */
> > AMQ_CATCHALL_NOTHROW()
> 1042a1047
> > this->consumers.remove( id );
> 1045c1050
> < this->consumers.remove( id );
> ---
> > // this->consumers.remove( id );
> 1065a1071
> > this->producers.remove( id );
> 1068c1074
> < this->producers.remove( id );
> ---
> > // this->producers.remove( id );
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Resolved: (AMQCPP-257) Segfault on session or connection
cleanup
Posted by "Timothy Bish (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/activemq/browse/AMQCPP-257?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Timothy Bish resolved AMQCPP-257.
---------------------------------
Resolution: Fixed
Resolved in trunk, will appear in a 3.1 release
> Segfault on session or connection cleanup
> -----------------------------------------
>
> Key: AMQCPP-257
> URL: https://issues.apache.org/activemq/browse/AMQCPP-257
> Project: ActiveMQ C++ Client
> Issue Type: Bug
> Components: CMS Impl, Openwire
> Affects Versions: 3.0.1
> Environment: Windows Visual Studio 2005
> Reporter: Ben Watrous
> Assignee: Timothy Bish
> Fix For: 3.1
>
> Attachments: ActiveMQSession.cpp, main.cpp
>
>
> I recently moved up to ActiveMQ CPP 3.0 (and now 3.0.1) from 2.2 to take advantage of the failover transport, and discovered a segfault during testing. It may be related to my test procedure, but I have found a quick patch to activemq/core/ActiveMQSession.cpp that seems to resolve the issue.
> It appears that in some cases of connection loss, the connection->disposeOf() call may throw. In which case the Session is left in an invalid state - the producers or consumer that caused the exception is still in the list, but it has already been destroyed. This leads to an invalid pointer access later on.
> In the current test, the exception is thrown because the connection to the broker has been dropped so disposeOf fails.
> Test Procedure:
> Open the attached example (modified version of the basic sample) in the Visual Studio debugger.
> Set a breakpoint at the "producer->send( message );" line.
> Run to breakpoint.
> To simulate a broken connection, connect to broker via JMX console and execute the JMX "Stop" operation on the Connector for the producer.
> Continue the debugger.
> ( Note: I "Purge" the TEST.FOO queue between runs since messages may sometimes be left in queue during this type of testing. )
> Suggested Patch to ActiveMQSession.cpp:
> 153a154
> > try {
> 155a157,159
> > }
> > /* Absorb */
> > AMQ_CATCHALL_NOTHROW()
> 1042a1047
> > this->consumers.remove( id );
> 1045c1050
> < this->consumers.remove( id );
> ---
> > // this->consumers.remove( id );
> 1065a1071
> > this->producers.remove( id );
> 1068c1074
> < this->producers.remove( id );
> ---
> > // this->producers.remove( id );
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.