This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
fixeria gerrit-no-reply at lists.osmocom.orgfixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/26307 ) Change subject: bitvec_read_field(): indicate errors using errno ...................................................................... bitvec_read_field(): indicate errors using errno This function returns an *unsigned* integer (uint64_t), so returning a negative value on error is a bad idea. A negative value turns into a huge positive value, what was demonstrated in the bitvec_test: bitvec_read_field(idx=512, len=16) => ffffffffffffffea bitvec_read_field(idx=0, len=65) => ffffffffffffffea bitvec_read_field(idx=64, len=16) => ffffffffffffffea The 0xffffffffffffffea above is basically: (uint64_t) -EINVAL, or (uint64_t) -22 + 1, or 0xffffffffffffffff - 0x16 + 1. Let's make use of the errno in order to indicate an error to the caller. Change-Id: I2cc734caa3365d03c2ae2b3f2cd9544933c25e9e Related: OS#4388 --- M src/bitvec.c M tests/bitvec/bitvec_test.c M tests/bitvec/bitvec_test.ok 3 files changed, 26 insertions(+), 20 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/07/26307/1 diff --git a/src/bitvec.c b/src/bitvec.c index 2b4e8c9..b411a72 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -472,18 +472,23 @@ * \param[in] bv The boolean vector to work on * \param[in,out] read_index Where reading supposed to start in the vector * \param[in] len How many bits to read from vector - * \returns read bits or negative value on error + * \returns An integer made up of the bits read. + * + * In case of an error, errno is set to a non-zero value. Otherwise it holds 0. */ uint64_t bitvec_read_field(struct bitvec *bv, unsigned int *read_index, unsigned int len) { unsigned int i; uint64_t ui = 0; bv->cur_bit = *read_index; + errno = 0; for (i = 0; i < len; i++) { int bit = bitvec_get_bit_pos((const struct bitvec *)bv, bv->cur_bit); - if (bit < 0) - return bit; + if (bit < 0) { + errno = -bit; + break; + } if (bit) ui |= ((uint64_t)1 << (len - i - 1)); bv->cur_bit++; diff --git a/tests/bitvec/bitvec_test.c b/tests/bitvec/bitvec_test.c index b4764e6..ea7ea9a 100644 --- a/tests/bitvec/bitvec_test.c +++ b/tests/bitvec/bitvec_test.c @@ -237,7 +237,8 @@ #define _bitvec_read_field(idx, len) \ readIndex = idx; \ field = bitvec_read_field(&bv, &readIndex, len); \ - printf("bitvec_read_field(idx=%u, len=%u) => %" PRIx64 "\n", idx, len, field); + printf("bitvec_read_field(idx=%u, len=%u) => %" PRIx64 " (%s)\n", \ + idx, len, field, errno == 0 ? "success" : "error"); _bitvec_read_field(0, 64); _bitvec_read_field(0, 32); diff --git a/tests/bitvec/bitvec_test.ok b/tests/bitvec/bitvec_test.ok index b118502..a0e31d3 100644 --- a/tests/bitvec/bitvec_test.ok +++ b/tests/bitvec/bitvec_test.ok @@ -171,21 +171,21 @@ bitvec bytes used. test bitvec_read_field(): -bitvec_read_field(idx=0, len=64) => deadbeeffeebdaed -bitvec_read_field(idx=0, len=32) => deadbeef -bitvec_read_field(idx=0, len=16) => dead -bitvec_read_field(idx=0, len=8) => de -bitvec_read_field(idx=0, len=0) => 0 -bitvec_read_field(idx=8, len=8) => ad -bitvec_read_field(idx=8, len=4) => a -bitvec_read_field(idx=8, len=0) => 0 -bitvec_read_field(idx=10, len=9) => 16d -bitvec_read_field(idx=10, len=7) => 5b -bitvec_read_field(idx=10, len=5) => 16 -bitvec_read_field(idx=10, len=3) => 5 -bitvec_read_field(idx=10, len=1) => 1 -bitvec_read_field(idx=512, len=16) => ffffffffffffffea -bitvec_read_field(idx=0, len=65) => ffffffffffffffea -bitvec_read_field(idx=64, len=16) => ffffffffffffffea +bitvec_read_field(idx=0, len=64) => deadbeeffeebdaed (success) +bitvec_read_field(idx=0, len=32) => deadbeef (success) +bitvec_read_field(idx=0, len=16) => dead (success) +bitvec_read_field(idx=0, len=8) => de (success) +bitvec_read_field(idx=0, len=0) => 0 (success) +bitvec_read_field(idx=8, len=8) => ad (success) +bitvec_read_field(idx=8, len=4) => a (success) +bitvec_read_field(idx=8, len=0) => 0 (success) +bitvec_read_field(idx=10, len=9) => 16d (success) +bitvec_read_field(idx=10, len=7) => 5b (success) +bitvec_read_field(idx=10, len=5) => 16 (success) +bitvec_read_field(idx=10, len=3) => 5 (success) +bitvec_read_field(idx=10, len=1) => 1 (success) +bitvec_read_field(idx=512, len=16) => 0 (error) +bitvec_read_field(idx=0, len=65) => bd5b7ddffdd7b5db (error) +bitvec_read_field(idx=64, len=16) => 0 (error) bitvec ok. -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/26307 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I2cc734caa3365d03c2ae2b3f2cd9544933c25e9e Gerrit-Change-Number: 26307 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20211117/03905efa/attachment.htm>