C utility functions for OpenWRT libraries
Find a file
Alban Bedel 89fb6136ad libubox: runqueue: fix use-after-free bug
Fixes a use-after-free bug in runqueue_task_kill():

 Invalid read of size 8
    at runqueue_task_kill (runqueue.c:200)
    by uloop_process_timeouts (uloop.c:505)
    by uloop_run_timeout (uloop.c:542)
    by uloop_run (uloop.h:111)
    by main (tests/test-runqueue.c:126)
  Address 0x5a4b058 is 24 bytes inside a block of size 208 free'd
    at free
    by runqueue_task_complete (runqueue.c:234)
    by runqueue_task_kill (runqueue.c:199)
    by uloop_process_timeouts (uloop.c:505)
    by uloop_run_timeout (uloop.c:542)
    by uloop_run (uloop.h:111)
    by main (tests/test-runqueue.c:126)
  Block was alloc'd at
    at calloc
    by add_sleeper (tests/test-runqueue.c:101)
    by main (tests/test-runqueue.c:123)

Since commit 11e8afea (runqueue should call the complete handler from
more places) the call to the complete() callback has been moved to
runqueue_task_complete().  However in runqueue_task_kill()
runqueue_task_complete() is called before the kill() callback.  This
will result in a use after free if the complete() callback frees the
task struct.

Furthermore runqueue_start_next() is already called at the end of
runqueue_task_complete(), so there is no need to call it again in
runqueue_task_kill().

The issue was that the _complete() callback frees the memory used by the
task struct, which is then read after the _complete() callback returns.

Ref: FS#3016
Signed-off-by: Alban Bedel <albeu@free.fr>
[initial test case, kill cb comment fix]
Signed-off-by: Chris Nisbet <nischris@gmail.com>
[testcase improvements and commit subject/description tweaks]
Signed-off-by: Petr Štetiar <ynezz@true.cz>
2020-05-21 15:58:46 +02:00
examples add cram based unit tests 2019-11-24 13:26:58 +01:00
lua libubox: allow reading out the pid of uloop process in lua 2016-12-13 17:13:20 +01:00
sh sh/jshn.sh: add json_for_each_item() 2018-02-08 12:15:20 +01:00
tests libubox: runqueue: fix use-after-free bug 2020-05-21 15:58:46 +02:00
.gitignore examples: add shunit2 tests for json_script 2016-02-20 13:36:08 +01:00
.gitlab-ci.yml add cram based unit tests 2019-11-24 13:26:58 +01:00
assert.h add assert.h component 2019-11-24 13:26:58 +01:00
avl-cmp.c avl: add blob comparator function 2016-07-29 10:58:55 +02:00
avl-cmp.h avl: add blob comparator function 2016-07-29 10:58:55 +02:00
avl.c avl: guard against theoretical null pointer dereference 2019-11-24 13:26:58 +01:00
avl.h switch from typeof to the more portable __typeof__ 2018-04-07 15:21:33 +02:00
base64.c base64: fix possible null pointer dereference 2019-11-24 13:26:58 +01:00
blob.c blob: fix OOB access in blob_check_type 2019-12-25 10:31:58 +01:00
blob.h Ensure blob_attr length check does not perform out of bounds reads 2019-12-25 10:31:58 +01:00
blobmsg.c blobmsg: fix wrong payload len passed from blobmsg_check_array 2020-02-27 21:56:01 +01:00
blobmsg.h blobmsg: reuse blobmsg_namelen in blobmsg_data 2019-12-25 10:31:58 +01:00
blobmsg_json.c blobmsg_json: prefer snprintf usage 2020-01-20 16:54:10 +01:00
blobmsg_json.h blobmsg_json: add new functions blobmsg_format_json_value* 2016-07-02 10:10:08 +02:00
CMakeLists.txt cmake: add a possibility to set library version 2020-01-20 16:54:10 +01:00
jshn.c jshn: prefer snprintf usage 2020-01-20 16:54:10 +01:00
json_script.c iron out all extra compiler warnings 2019-11-20 14:34:01 +01:00
json_script.h json_script: add support for aborting script processing 2015-11-06 22:58:15 +01:00
kvlist.c Fix various memory management issues 2016-06-26 12:53:51 +02:00
kvlist.h kvlist: add static initializer macros 2016-10-24 12:34:09 +02:00
list.h switch from typeof to the more portable __typeof__ 2018-04-07 15:21:33 +02:00
md5.c md5: add "const" qualifier to the "file" argument 2017-03-20 12:44:46 +01:00
md5.h md5: add "const" qualifier to the "file" argument 2017-03-20 12:44:46 +01:00
runqueue.c libubox: runqueue: fix use-after-free bug 2020-05-21 15:58:46 +02:00
runqueue.h libubox: runqueue: fix use-after-free bug 2020-05-21 15:58:46 +02:00
safe_list.c runqueue: add a function that allows adding jobs to the front of the runqueue 2013-11-18 12:25:21 +01:00
safe_list.h runqueue: add a function that allows adding jobs to the front of the runqueue 2013-11-18 12:25:21 +01:00
ulog.c blobmsg/ulog: fix format string compiler warnings 2019-12-07 23:47:03 +01:00
ulog.h libubox: add format string checking to ulog() 2019-06-16 16:29:47 +02:00
uloop-epoll.c uloop: remove useless epoll data assignment 2016-12-12 12:24:14 +01:00
uloop-kqueue.c uloop: use a waker for notifying sigchld and loop cancel events 2016-06-15 11:54:37 +02:00
uloop.c uloop: make SIGCHLD signal handling optional 2017-09-29 13:37:17 +02:00
uloop.h uloop: allow specifying a timeout for uloop_run() 2017-06-01 11:24:44 +02:00
usock.c usock: implement usock_inet_timeout() with RFC6555 support 2016-01-28 12:07:25 +01:00
usock.h usock: implement usock_inet_timeout() with RFC6555 support 2016-01-28 12:07:25 +01:00
ustream-fd.c ustream-fd: handle ENOTCONN for read/write on not-yet-connected sockets 2016-01-15 21:35:48 +01:00
ustream.c Fix various memory management issues 2016-06-26 12:53:51 +02:00
ustream.h ustream: Add format string checks to ustream_(v)printf() 2019-06-16 16:30:01 +02:00
utils.c libubox: Plug a small memory leak. 2018-02-11 16:39:35 +01:00
utils.h utils: add const_* byteswapping functions 2018-06-07 15:18:52 +02:00
vlist.c vlist: constify key argument to vlist_add 2013-10-05 21:40:04 +02:00
vlist.h vlist: add more macros for loop iteration 2019-10-29 13:07:38 +00:00