diff options
| author | Felix Fietkau | 2025-05-07 15:21:38 +0000 |
|---|---|---|
| committer | Felix Fietkau | 2025-05-07 15:22:56 +0000 |
| commit | 0b4ddeed5e27c53e08c797300642c2751e76f300 (patch) | |
| tree | 8c856481c12e24400ffcc598462b37a5875d8ef7 | |
| parent | 840c1fda8346c187e42c28e55a692a61f0cdd8d1 (diff) | |
| download | openwrt-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.c | 24 |
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 |