basho / innostore

Innostore is a simple Erlang API to Embedded InnoDB.

Clone this repository (size: 3.3 MB): HTTPS / SSH
$ hg clone http://hg.basho.com/innostore
commit 37: 4c231fa82c2b
parent 36: 8b5c272b6c10
branch: default
Fix bug where UNPACK_BYTE was used with unsigned ints, causing crash when the byte > 128
dizzyd
5 months ago

Changed (Δ104 bytes):

raw changeset »

c_src/innostore_drv.c (6 lines added, 6 lines removed)

src/innostore.erl (4 lines added, 1 lines removed)

Up to file-list c_src/innostore_drv.c:

@@ -506,7 +506,7 @@ static void do_get(void* arg)
506
506
    // keysz - 1 byte
507
507
    // key   - variable
508
508
    ib_id_t table      ; UNPACK_INT(state->work_buffer, 0, &table);
509
    unsigned int keysz = UNPACK_BYTE(state->work_buffer, sizeof(table));
509
    unsigned char keysz = UNPACK_BYTE(state->work_buffer, sizeof(table));
510
510
    char* key          = UNPACK_BLOB(state->work_buffer, sizeof(table)+1);
511
511
512
512
    ib_trx_t txn = ib_trx_begin(IB_TRX_REPEATABLE_READ);
@@ -596,8 +596,8 @@ static void do_put(void* arg)
596
596
    // valuesz - 4 bytes
597
597
    // value   - variable
598
598
    ib_id_t table            ; UNPACK_INT(state->work_buffer, 0, &table);
599
    unsigned int cflag       = UNPACK_BYTE(state->work_buffer, sizeof(table));
600
    unsigned int keysz       = UNPACK_BYTE(state->work_buffer, sizeof(table) + 1);
599
    unsigned char cflag      = UNPACK_BYTE(state->work_buffer, sizeof(table));
600
    unsigned char keysz      = UNPACK_BYTE(state->work_buffer, sizeof(table) + 1);
601
601
    char* key                = UNPACK_BLOB(state->work_buffer, sizeof(table) + 2);
602
602
    unsigned int raw_valuesz;  UNPACK_INT(state->work_buffer,  sizeof(table) + 2 + keysz, &raw_valuesz);
603
603
    char* raw_value          = UNPACK_BLOB(state->work_buffer, sizeof(table) + 2 + keysz + 4);
@@ -713,7 +713,7 @@ static void do_delete(void* arg)
713
713
    // keysz   - 1 byte
714
714
    // key     - variable
715
715
    ib_id_t table        ; UNPACK_INT(state->work_buffer, 0, &table);
716
    unsigned int keysz   = UNPACK_BYTE(state->work_buffer, sizeof(table));
716
    unsigned char keysz  = UNPACK_BYTE(state->work_buffer, sizeof(table));
717
717
    char* key            = UNPACK_BLOB(state->work_buffer, sizeof(table) + 1);
718
718
719
719
    ib_trx_t txn = ib_trx_begin(IB_TRX_SERIALIZABLE);
@@ -830,8 +830,8 @@ static void do_cursor_move(void* arg)
830
830
    // Unpack the type of move, and what data to return (key or key+data)
831
831
    // movement - 1 byte
832
832
    // content - 1 byte
833
    unsigned int movement = UNPACK_BYTE(state->work_buffer, 0);
834
    unsigned int content  = UNPACK_BYTE(state->work_buffer, 1);
833
    unsigned char movement = UNPACK_BYTE(state->work_buffer, 0);
834
    unsigned char content  = UNPACK_BYTE(state->work_buffer, 1);
835
835
836
836
    ib_err_t error;
837
837
    switch(movement)

Up to file-list src/innostore.erl:

@@ -441,6 +441,9 @@ bigkey_test() ->
441
441
    {ok, Port} = connect_reset(),
442
442
    {ok, Store} = open_keystore(foobar, Port),
443
443
    Key = list_to_binary(lists:duplicate(256, "x")),
444
    {error, key_exceeds_255_bytes} = ?MODULE:put(Key, <<"abc">>, Store).
444
    {error, key_exceeds_255_bytes} = ?MODULE:put(Key, <<"abc">>, Store),
445
446
    Key2 = list_to_binary(lists:duplicate(153, "x")),
447
    ok = ?MODULE:put(Key2, <<"abc">>, Store).
445
448
446
449
-endif.