Change in libosmocore[master]: bitvec_read_field(): indicate errors using errno

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.org
Wed Nov 17 03:38:28 UTC 2021


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


More information about the gerrit-log mailing list