Bug 695777

Summary: Variant conversion from string with negative number to unsigned data type no longer throws in RHEL 6
Product: Red Hat Enterprise Linux 6 Reporter: Andy Goldstein <agoldste>
Component: qpid-cppAssignee: Kim van der Riet <kim.vdriet>
Status: CLOSED ERRATA QA Contact: Leonid Zhaldybin <lzhaldyb>
Severity: high Docs Contact:
Priority: high    
Version: 6.2CC: esammons, gsim, iboverma, jneedle, lzhaldyb, tross
Target Milestone: rc   
Target Release: 6.2   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: qpid-cpp-0.12-1 Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2011-12-06 16:50:58 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Bug Depends On:    
Bug Blocks: 698367    

Description Andy Goldstein 2011-04-12 16:37:52 UTC
Description of problem: In RHEL 5, converting a Variant such as "-5" to an unsigned short would throw an exception.  In RHEL 6, no exception is thrown and the value wraps around (e.g. -5 becomes 65531).  It looks like something in Boost's lexical_cast() implementation has changed between Boost 1.33.1 (RHEL 5) and 1.41.0 (RHEL 6).


Version-Release number of selected component (if applicable): qpid-cpp-client-0.10-3.el6.x86_64.rpm


How reproducible: 100%


Steps to Reproduce:

Compile and run the following on both RHEL 5 and RHEL 6:

#include <iostream>
#include <qpid/types/Variant.h>

using namespace std;

int main(int argc, char** argv) {
  uint16_t i;

  qpid::types::Variant v = "-5";

  i = v;
  cout << i << endl;
}

  
Actual results: the number is converted.  Running on RHEL 6 results in this output:

65531


Expected results: an exception that -5 can't be converted.  When running on RHEL 5, it results in this output:

terminate called after throwing an instance of 'qpid::types::InvalidConversion'
  what():  invalid conversion: Cannot convert -5 (qpid/types/Variant.cpp:118)
Aborted

Comment 1 Andy Goldstein 2011-04-12 20:56:24 UTC
Not sure if this is the root cause, but it seems like a change to gcc to better conform to the C++ standard specification might be the reason for the change in behavior.  See the following links:

http://boost.2283326.n4.nabble.com/conversion-lexical-cast-doesn-t-throw-td2593967.html
https://bugzilla.redhat.com/show_bug.cgi?id=531919
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39802

Comment 6 Leonid Zhaldybin 2011-10-31 16:26:18 UTC
Tested on RHEL6.2 on both main architectures (i686 and x86_64), packages versions:

qpid-cpp-client-0.12-6.el6.i686
qpid-cpp-client-devel-0.12-6.el6.i686
qpid-cpp-client-rdma-0.12-6.el6.i686
qpid-cpp-client-ssl-0.12-6.el6.i686
qpid-cpp-debuginfo-0.12-6.el6.i686
qpid-cpp-server-0.12-6.el6.i686
qpid-cpp-server-cluster-0.12-6.el6.i686
qpid-cpp-server-devel-0.12-6.el6.i686
qpid-cpp-server-rdma-0.12-6.el6.i686
qpid-cpp-server-ssl-0.12-6.el6.i686
qpid-cpp-server-store-0.12-6.el6.i686
qpid-cpp-server-xml-0.12-6.el6.i686
qpid-java-client-0.10-11.el6.noarch
qpid-java-common-0.10-11.el6.noarch
qpid-java-example-0.10-11.el6.noarch
qpid-java-jca-0.10-11.el6.noarch
qpid-java-jca-zip-0.10-11.el6.noarch
qpid-qmf-0.12-6.el6.i686
qpid-qmf-debuginfo-0.12-6.el6.i686
qpid-qmf-devel-0.12-6.el6.i686
qpid-tools-0.12-2.el6.noarch

The example code from the description returns the right error:

terminate called after throwing an instance of 'qpid::types::InvalidConversion'
  what():  invalid conversion: Cannot convert -5 (qpid/types/Variant.cpp:131)
Aborted


-> VERIFIED

Comment 7 errata-xmlrpc 2011-12-06 16:50:58 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

http://rhn.redhat.com/errata/RHBA-2011-1670.html