| 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
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 |
|
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 |
|
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. |
