Jenkins Builder has posted comments on this change. ( https://gerrit.osmocom.org/c/libosmocore/+/35296?usp=email )
Change subject: tests/soft_uart: cosmetic: improve readability of the test output
......................................................................
Patch Set 1:
(1 comment)
File tests/soft_uart/soft_uart_test.c:
Robot Comment from checkpatch (run ID jenkins-gerrit-lint-12992):
https://gerrit.osmocom.org/c/libosmocore/+/35296/comment/726dd4e0_ef07e24f
PS1, Line 30: } while(0)
space required before the open parenthesis '('
--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35296?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Icf5410f0b292d41532e0cbd17e6ca0509c76cbd5
Gerrit-Change-Number: 35296
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-CC: Jenkins Builder
Gerrit-Comment-Date: Fri, 08 Dec 2023 22:03:55 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Gerrit-MessageType: comment
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35297?usp=email )
Change subject: soft_uart: fix the Rx flushing logic, add a unit test
......................................................................
soft_uart: fix the Rx flushing logic, add a unit test
Coverity tells us that with the current logic it's possible (in theory)
that we may dereference NULL pointer in osmo_soft_uart_flush_rx(). This
is highly unlikely, because the Rx buffer gets allocated once when the
Rx is enabled and remains even after the Rx gets disabled. The Rx flags
cannot be anything than 0x00 before the Rx gets enabled.
Even though this NULL pointer dereference is unlikely, the Rx flushing
logic is still not entirely correct. As can be seen from the unit test
output, the Rx callback of the application may be called with an empty
msgb if the following conditions are both met:
a) the osmo_soft_uart_flush_rx() is invoked manually, and
b) a parity and/or a framing error has occurred previously.
We should not be checking suart->rx.flags in osmo_soft_uart_flush_rx(),
since this is already done in suart_rx_ch(), which is calling it.
Removing this check also eliminates a theoretical possibility of the
NULL pointer dereference, so we're killing two birds with one stone.
- Do not check suart->rx.flags in osmo_soft_uart_flush_rx().
- Add a unit test for various flush()ing scenarios.
Change-Id: I5179f5fd2361e4e96ac9bf48e80b99e53a7e4712
Fixes: CID#336545
---
M src/core/soft_uart.c
M tests/soft_uart/soft_uart_test.c
M tests/soft_uart/soft_uart_test.ok
3 files changed, 60 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/97/35297/1
diff --git a/src/core/soft_uart.c b/src/core/soft_uart.c
index c6a6dbd..f969ab7 100644
--- a/src/core/soft_uart.c
+++ b/src/core/soft_uart.c
@@ -79,7 +79,7 @@
* \param[in] suart soft-UART instance holding the receive buffer. */
void osmo_soft_uart_flush_rx(struct osmo_soft_uart *suart)
{
- if ((suart->rx.msg && msgb_length(suart->rx.msg)) || suart->rx.flags) {
+ if (suart->rx.msg && msgb_length(suart->rx.msg)) {
osmo_timer_del(&suart->rx.timer);
if (suart->cfg.rx_cb) {
suart->cfg.rx_cb(suart->cfg.priv, suart->rx.msg, suart->rx.flags);
diff --git a/tests/soft_uart/soft_uart_test.c b/tests/soft_uart/soft_uart_test.c
index c8aef15..43f49b9 100644
--- a/tests/soft_uart/soft_uart_test.c
+++ b/tests/soft_uart/soft_uart_test.c
@@ -224,6 +224,27 @@
osmo_soft_uart_free(suart);
}
+static void test_rx_flush(void)
+{
+ struct osmo_soft_uart *suart;
+
+ SUART_TEST_BEGIN;
+
+ suart = osmo_soft_uart_alloc(NULL, __func__, &suart_test_default_cfg);
+ OSMO_ASSERT(suart != NULL);
+
+ printf("calling osmo_soft_uart_flush_rx() while Rx disabled\n");
+ osmo_soft_uart_flush_rx(suart);
+
+ printf("enabling the receiver\n");
+ osmo_soft_uart_set_rx(suart, true);
+
+ printf("calling osmo_soft_uart_flush_rx() while Rx enabled, but no data\n");
+ osmo_soft_uart_flush_rx(suart);
+
+ osmo_soft_uart_free(suart);
+}
+
static void test_tx_rx_exec_one(struct osmo_soft_uart *suart,
size_t n_bits_total, size_t n_bits_frame)
{
@@ -566,6 +587,7 @@
int main(int argc, char **argv)
{
test_rx();
+ test_rx_flush();
test_tx_rx();
/* test pulling small number of bits at a time */
diff --git a/tests/soft_uart/soft_uart_test.ok b/tests/soft_uart/soft_uart_test.ok
index 6edac16..c42d0f5 100644
--- a/tests/soft_uart/soft_uart_test.ok
+++ b/tests/soft_uart/soft_uart_test.ok
@@ -51,7 +51,6 @@
suart_rx_cb(flags=02): 01
suart_rx_cb(flags=02): ff
test_rx_exec() @ 49: flush the Rx buffer
-suart_rx_cb(flags=02):
======== testing 8-E-1 (valid parity)
test_rx_exec() @ 63: flush the Rx buffer
suart_rx_cb(flags=00): 00 ff aa 55
@@ -62,13 +61,17 @@
suart_rx_cb(flags=02): 01
suart_rx_cb(flags=02): ff
test_rx_exec() @ 42: flush the Rx buffer
-suart_rx_cb(flags=02):
======== testing 8-O-1 (valid parity)
test_rx_exec() @ 63: flush the Rx buffer
suart_rx_cb(flags=00): 00 ff aa 55
test_rx_exec() @ 120: flush the Rx buffer
suart_rx_cb(flags=00): 80 e0 f8 fe
+Executing test_rx_flush
+calling osmo_soft_uart_flush_rx() while Rx disabled
+enabling the receiver
+calling osmo_soft_uart_flush_rx() while Rx enabled, but no data
+
Executing test_tx_rx
======== testing 8-N-1
suart_tx_cb(len=4/4): de ad be ef
--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35297?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I5179f5fd2361e4e96ac9bf48e80b99e53a7e4712
Gerrit-Change-Number: 35297
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
Attention is currently required from: fixeria.
Hello Jenkins Builder,
I'd like you to reexamine a change. Please visit
https://gerrit.osmocom.org/c/libosmocore/+/35294?usp=email
to look at the new patch set (#2).
The following approvals got outdated and were removed:
Verified-1 by Jenkins Builder
Change subject: core: fix wrong logic in _osmo_it_q_dequeue()
......................................................................
core: fix wrong logic in _osmo_it_q_dequeue()
If the given queue is empty, queue->list.next points to &queue->list.
Current implementation would call llist_del() on the queue's llist_head,
decrement queue->current_length (which will be 0), and return a pointer
to &queue->list to the caller. This is completely wrong.
- Use the existing item_dequeue(), which does exactly what we need.
- Do not decrement the current_length if nothing was dequeued.
- Uncomment code in the unit test, we should not crash anymore.
Change-Id: I63094df73b166b549616c869ad908e9f4f7d46d1
Fixes: CID#336557
---
M src/core/it_q.c
M tests/it_q/it_q_test.c
M tests/it_q/it_q_test.ok
3 files changed, 25 insertions(+), 11 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/94/35294/2
--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35294?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I63094df73b166b549616c869ad908e9f4f7d46d1
Gerrit-Change-Number: 35294
Gerrit-PatchSet: 2
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newpatchset
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35292?usp=email )
Change subject: tests/soft_uart: assert that osmo_soft_uart_rx_ubits() returns 0
......................................................................
tests/soft_uart: assert that osmo_soft_uart_rx_ubits() returns 0
According to Coverity, we check return value of this function in
all other cases except this one (9 out of 10 times), so let's add
the missing assert(), just to be sure.
Change-Id: I675f4089cc990be5fcda792276b6808742f6f0d7
Fixes: CID#336557
---
M tests/soft_uart/soft_uart_test.c
1 file changed, 17 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/92/35292/1
diff --git a/tests/soft_uart/soft_uart_test.c b/tests/soft_uart/soft_uart_test.c
index 0e84d5a..9ca9bd9 100644
--- a/tests/soft_uart/soft_uart_test.c
+++ b/tests/soft_uart/soft_uart_test.c
@@ -68,12 +68,14 @@
{
for (unsigned int i = 0; input[i] != '\0'; i++) {
ubit_t ubit;
+ int rc;
switch (input[i]) {
case '0':
case '1':
ubit = input[i] - '0';
- osmo_soft_uart_rx_ubits(suart, &ubit, 1);
+ rc = osmo_soft_uart_rx_ubits(suart, &ubit, 1);
+ OSMO_ASSERT(rc == 0); /* 0 on success */
break;
case 'F':
printf("%s() @ %u: flush the Rx buffer\n", __func__, i);
--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35292?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I675f4089cc990be5fcda792276b6808742f6f0d7
Gerrit-Change-Number: 35292
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35293?usp=email )
Change subject: tests/it_q: add tc_enqueue/dequeue testcase
......................................................................
tests/it_q: add tc_enqueue/dequeue testcase
This patch is adding a simple testcase, which does the following:
* enqueue up to the limit (12 items),
* dequeue up to the limit (12 items).
Everything works as expected, unless you attempt to dequeue from
an empty queue: the test binary segfaults. The problem is explained
and fixed in a subsequent patch.
Change-Id: Ie0edbf00e656fbe231952bdbccfd37d143e8b2b1
Related: CID#336557
---
M tests/it_q/it_q_test.c
M tests/it_q/it_q_test.ok
2 files changed, 67 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/93/35293/1
diff --git a/tests/it_q/it_q_test.c b/tests/it_q/it_q_test.c
index 28e32d8..9545183 100644
--- a/tests/it_q/it_q_test.c
+++ b/tests/it_q/it_q_test.c
@@ -68,6 +68,48 @@
osmo_it_q_destroy(q1);
}
+static void tc_enqueue_dequeue(void)
+{
+ const unsigned int qlen = 12;
+ struct it_q_test1 *item;
+ struct osmo_it_q *q1;
+ int rc;
+
+ ENTER_TC;
+
+ printf("allocating q1\n");
+ q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", 12, NULL, NULL);
+ OSMO_ASSERT(q1);
+
+#if 0
+ printf("try dequeueing from an empty queue\n");
+ osmo_it_q_dequeue(q1, &item, list);
+ OSMO_ASSERT(item == NULL);
+#endif
+
+ printf("adding queue entries up to the limit\n");
+ for (unsigned int i = 0; i < qlen; i++) {
+ item = talloc_zero(OTC_GLOBAL, struct it_q_test1);
+ rc = osmo_it_q_enqueue(q1, item, list);
+ OSMO_ASSERT(rc == 0);
+ }
+
+ printf("removing queue entries up to the limit\n");
+ for (unsigned int i = 0; i < qlen; i++) {
+ osmo_it_q_dequeue(q1, &item, list);
+ OSMO_ASSERT(item != NULL);
+ talloc_free(item);
+ }
+
+#if 0
+ printf("try dequeueing from an empty queue\n");
+ osmo_it_q_dequeue(q1, &item, list);
+ OSMO_ASSERT(item == NULL);
+#endif
+
+ osmo_it_q_destroy(q1);
+}
+
static int g_read_cb_count;
static void q_read_cb(struct osmo_it_q *q, struct llist_head *item)
@@ -115,6 +157,7 @@
{
tc_alloc();
tc_queue_length();
+ tc_enqueue_dequeue();
tc_eventfd();
return 0;
}
diff --git a/tests/it_q/it_q_test.ok b/tests/it_q/it_q_test.ok
index 7f102c6..91ba0ce 100644
--- a/tests/it_q/it_q_test.ok
+++ b/tests/it_q/it_q_test.ok
@@ -9,6 +9,11 @@
adding queue entries up to the limit
attempting to add more than the limit
+== Entering test case tc_enqueue_dequeue
+allocating q1
+adding queue entries up to the limit
+removing queue entries up to the limit
+
== Entering test case tc_eventfd
allocating q1
adding 30 queue entries up to the limit
--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35293?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Ie0edbf00e656fbe231952bdbccfd37d143e8b2b1
Gerrit-Change-Number: 35293
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35294?usp=email )
Change subject: core: fix wrong logic in _osmo_it_q_dequeue()
......................................................................
core: fix wrong logic in _osmo_it_q_dequeue()
If the given queue is empty, queue->list.next points to &queue->list.
Current implementation would call llist_del() on the queue's llist_head,
decrement queue->current_length (which will be 0), and return a pointer
to &queue->list to the caller. This is completely wrong.
- Use the existing item_dequeue(), which does exactly what we need.
- Do not decrement the current_length if nothing was dequeued.
- Uncomment code in the unit test, we should not crash anymore.
Change-Id: I63094df73b166b549616c869ad908e9f4f7d46d1
Fixes: CID#336557
---
M src/core/it_q.c
M tests/it_q/it_q_test.c
2 files changed, 23 insertions(+), 11 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/94/35294/1
diff --git a/src/core/it_q.c b/src/core/it_q.c
index a3ff420..810dc90 100644
--- a/src/core/it_q.c
+++ b/src/core/it_q.c
@@ -245,7 +245,7 @@
/*! Thread-safe de-queue from an inter-thread message queue.
* \param[in] queue Inter-thread queue from which to dequeue
- * \returns dequeued message buffer; NULL if none available
+ * \returns llist_head of dequeued message; NULL if none available
*/
struct llist_head *_osmo_it_q_dequeue(struct osmo_it_q *queue)
{
@@ -254,12 +254,9 @@
pthread_mutex_lock(&queue->mutex);
- if (llist_empty(&queue->list))
- l = NULL;
- l = queue->list.next;
- OSMO_ASSERT(l);
- llist_del(l);
- queue->current_length--;
+ l = item_dequeue(&queue->list);
+ if (l != NULL)
+ queue->current_length--;
pthread_mutex_unlock(&queue->mutex);
diff --git a/tests/it_q/it_q_test.c b/tests/it_q/it_q_test.c
index 9545183..6025e39 100644
--- a/tests/it_q/it_q_test.c
+++ b/tests/it_q/it_q_test.c
@@ -81,11 +81,9 @@
q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", 12, NULL, NULL);
OSMO_ASSERT(q1);
-#if 0
printf("try dequeueing from an empty queue\n");
osmo_it_q_dequeue(q1, &item, list);
OSMO_ASSERT(item == NULL);
-#endif
printf("adding queue entries up to the limit\n");
for (unsigned int i = 0; i < qlen; i++) {
@@ -101,11 +99,9 @@
talloc_free(item);
}
-#if 0
printf("try dequeueing from an empty queue\n");
osmo_it_q_dequeue(q1, &item, list);
OSMO_ASSERT(item == NULL);
-#endif
osmo_it_q_destroy(q1);
}
--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35294?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I63094df73b166b549616c869ad908e9f4f7d46d1
Gerrit-Change-Number: 35294
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange
Attention is currently required from: fixeria.
pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/35289?usp=email )
Change subject: gsm_data: use ABIS_RSL_CHAN_NR_CBITS_* in gsm_pchan2chan_nr()
......................................................................
Patch Set 1: Code-Review+1
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/35289?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: Ic9370d8d7f13cce0f9c6e60a920d04161a7d6844
Gerrit-Change-Number: 35289
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Fri, 08 Dec 2023 19:12:12 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment