You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafodion.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2016/05/17 02:47:13 UTC

[jira] [Commented] (TRAFODION-1853) Bitwise shifting overflows when extracting long value from byte buffer in JDBC T4 driver.

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

ASF GitHub Bot commented on TRAFODION-1853:
-------------------------------------------

GitHub user ryzuo opened a pull request:

    https://github.com/apache/incubator-trafodion/pull/485

    [TRAFODION-1853] Fix overflow of long type bit wise shifting in T4 LogicalByteArray

    Both extractLong methods of LogicalByteArray and Bytes classes are using bit wise shifting to extract the long value from byte array, but larger then 32 bit wise shifting will overflow. Change to use java.nio.ByteBuffer to construct and convert the long value from the source byte array.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/ryzuo/incubator-trafodion jira1853

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/incubator-trafodion/pull/485.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #485
    
----
commit 184e47ebacd1d7d049e8f9e6fda43069a3d8fda4
Author: ryzuo <jo...@gmail.com>
Date:   2015-11-03T09:48:30Z

    Add initialization of some statement members.

commit f706cadb05bc0fe58d91b2831181b92b75513a5e
Author: ryzuo <jo...@gmail.com>
Date:   2016-05-06T07:19:34Z

    Memory and Statement management cleanup

commit 780b3bbe0f8a4181c6a044f97a7ac3e400328c8f
Author: ryzuo <jo...@gmail.com>
Date:   2015-11-16T04:13:18Z

    T2 Rowsets Implementation.
    
    1. Fixed double free of sqlWarningOrError.
    2. Deleted some unsed functions and comments.
    3. Changed some function return/exit statements to use the
       consistent macro definition(which has debugging and error handling).

commit 2c4b774bc37d0bcb7e36674575d3de1739b929eb
Author: ryzuo <jo...@gmail.com>
Date:   2015-11-23T08:16:20Z

    Some memory management update in CSrvrStmt.cpp
    
    Updated some memory management code of the new Rowsets code,
    like wrapped new/delete operations into the common used macro
    definition in Debug.h, align with original T2 code.

commit bfd5a391ad8d7b900dd75d46b74d9ee9aa1cb5ed
Author: ryzuo <jo...@gmail.com>
Date:   2016-05-16T05:38:01Z

    Fix JIRA1853
    
    Use ByteBuffer to construct and convert the long value from
    the source byte array.

----


> Bitwise shifting overflows when extracting long value from byte buffer in JDBC T4 driver.
> -----------------------------------------------------------------------------------------
>
>                 Key: TRAFODION-1853
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-1853
>             Project: Apache Trafodion
>          Issue Type: Bug
>          Components: client-jdbc-t4
>            Reporter: RuoYu Zuo
>            Assignee: RuoYu Zuo
>            Priority: Critical
>
> There's overflow been found in method extractLong() of class LogicalByteArray, see code below:
>      long extractLong() {
>          long value;
>          if (swap) {
>              value = ((array[loc]) & 0x00000000000000ffL) | ((array[loc + 1] << 8) & 0x000000000000ff00L)
>                      | ((array[loc + 2] << 16) & 0x0000000000ff0000L) | ((array[loc + 3] << 24) & 0x00000000ff000000L)
>                      | ((array[loc + 4] << 32) & 0x000000ff00000000L) | ((array[loc + 5] << 40) & 0x0000ff0000000000L)
>                      | ((array[loc + 6] << 48) & 0x00ff000000000000L) | ((array[loc + 7] << 56) & 0xff00000000000000L);
>          } else {
>              value = ((array[loc + 7]) & 0x00000000000000ffL) | ((array[loc + 6] << 8) & 0x000000000000ff00L)
>                      | ((array[loc + 5] << 16) & 0x0000000000ff0000L) | ((array[loc + 4] << 24) & 0x00000000ff000000L)
>                      | ((array[loc + 3] << 32) & 0x000000ff00000000L) | ((array[loc + 2] << 40) & 0x0000ff0000000000L)
>                      | ((array[loc + 1] << 48) & 0x00ff000000000000L) | ((array[loc] << 56) & 0xff00000000000000L);
>          }
>          loc += 8;
>          return value;
>      }
> By default, the bitwise shifting is based on 4 byte int, thus << 32 and >> 32 is the maximum bits of shifting allowed, larger than this causes overflows. In this case, the long value extracted by this method will never be correct from 5th byte to 8th byte.



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