summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2025-05-07 15:21:38 +0000
committerFelix Fietkau2025-05-07 15:22:56 +0000
commit0b4ddeed5e27c53e08c797300642c2751e76f300 (patch)
tree8c856481c12e24400ffcc598462b37a5875d8ef7
parent840c1fda8346c187e42c28e55a692a61f0cdd8d1 (diff)
downloadopenwrt-0b4ddeed5e27c53e08c797300642c2751e76f300.tar.gz
ucode-mod-uline: re-introduce polling loop to fix prompt after line end
Introduce a check for the resource data in order to avoid segfaulting on exit Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--package/utils/ucode-mod-uline/src/ucode.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/package/utils/ucode-mod-uline/src/ucode.c b/package/utils/ucode-mod-uline/src/ucode.c
index 7d7753a6d8..bf53a636ed 100644
--- a/package/utils/ucode-mod-uline/src/ucode.c
+++ b/package/utils/ucode-mod-uline/src/ucode.c
@@ -368,21 +368,25 @@ uc_uline_cb_event(struct uline_state *s, enum uline_event ev)
static void uc_uline_poll_cb(struct uloop_fd *fd, unsigned int events)
{
struct uc_uline_state *us = container_of(fd, struct uc_uline_state, fd);
+ uc_value_t *res = ucv_get(us->res);
uc_value_t *val;
- uline_poll(&us->s);
+ while (!uloop_cancelled && ucv_resource_data(res, NULL) && us->poll_cb) {
+ uline_poll(&us->s);
- val = us->line;
- if (!val)
- return;
+ val = us->line;
+ if (!val)
+ break;
- us->line = NULL;
- if (!ucv_is_callable(us->poll_cb))
- return;
+ us->line = NULL;
+ if (!ucv_is_callable(us->poll_cb))
+ break;
- uc_vm_stack_push(us->vm, ucv_get(us->res));
- uc_vm_stack_push(us->vm, ucv_get(us->poll_cb));
- cb_call(us, 1, val);
+ uc_vm_stack_push(us->vm, ucv_get(res));
+ uc_vm_stack_push(us->vm, ucv_get(us->poll_cb));
+ cb_call(us, 1, val);
+ }
+ ucv_put(res);
}
static bool