diff options
| author | Dimitri Staessens <dimitri@ouroboros.rocks> | 2026-07-05 18:29:18 +0200 |
|---|---|---|
| committer | Sander Vrijders <sander@ouroboros.rocks> | 2026-07-08 11:02:24 +0200 |
| commit | fd7404d927277a623b7c24e62bd564aa6853f9d8 (patch) | |
| tree | fc5c8c4b045777f959e837ec46682a46f50dfc3e | |
| parent | 2e5391e78c3c145e402bff1efef0a4160002b418 (diff) | |
| download | ouroboros-fd7404d927277a623b7c24e62bd564aa6853f9d8.tar.gz ouroboros-fd7404d927277a623b7c24e62bd564aa6853f9d8.zip | |
lib: Fix locking on flow read
Reading a deallocated flow could cause an assert on a negative id. The
raw-flow path now holds proc.lock across flow_rx_spb rather than
dropping it first, and the FRCT loop no longer releases and reacquires
the lock on every iteration.
Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
| -rw-r--r-- | src/lib/dev.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c index 0586f012..166aba5c 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -2656,23 +2656,24 @@ int ipcp_flow_read(int fd, pthread_rwlock_rdlock(&proc.lock); - assert(flow->info.id >= 0); + if (flow->info.id < 0) { + pthread_rwlock_unlock(&proc.lock); + return -ENOTALLOC; + } /* Raw flow: deliver the popped pkt directly (no FRCT rq). */ if (flow->frcti == NULL) { - pthread_rwlock_unlock(&proc.lock); idx = flow_rx_spb(flow, spb, false, NULL); + pthread_rwlock_unlock(&proc.lock); return idx < 0 ? (int) idx : 0; } while (!FRCTI_PDU_READY(flow->frcti)) { - pthread_rwlock_unlock(&proc.lock); - idx = flow_rx_spb(flow, spb, false, NULL); - if (idx < 0) + if (idx < 0) { + pthread_rwlock_unlock(&proc.lock); return idx; - - pthread_rwlock_rdlock(&proc.lock); + } FRCTI_RCV(flow->frcti, *spb); } @@ -2745,10 +2746,13 @@ int np1_flow_read(int fd, flow = &proc.flows[fd]; - assert(flow->info.id >= 0); - pthread_rwlock_rdlock(&proc.lock); + if (flow->info.id < 0) { + pthread_rwlock_unlock(&proc.lock); + return -ENOTALLOC; + } + off = ssm_rbuff_read(flow->rx_rb); if (off < 0) { pthread_rwlock_unlock(&proc.lock); |
