aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Tudor Brindus <me@tbrindus.ca>2021-03-22 09:01:00 -0400
committerLibravatar Simon Ser <contact@emersion.fr>2021-03-22 14:10:53 +0100
commit03daa53a0ef63d2a72acda05e94e5ba5c0b50d33 (patch)
treecd822bf55717b0b128538e2686f7f754ec229b1f
parentswaybar: use INT_MAX max JSON depth when parsing IPC response (diff)
downloadsway-03daa53a0ef63d2a72acda05e94e5ba5c0b50d33.tar.gz
sway-03daa53a0ef63d2a72acda05e94e5ba5c0b50d33.tar.zst
sway-03daa53a0ef63d2a72acda05e94e5ba5c0b50d33.zip
swaybar: fail gracefully on tokener creation fail
This commit adds missing error-handling to the creation of the tokener instance. The stack depth parameter is used to initialize an array that json-c prefaults ahead of time, causing INT_MAX to result in out of memory errors. Also drop the depth to 256 to prevent this OOM. Though this fix is not very satisfactory -- json-c could be made to not prefault -- it should do for now. At the very least, swaybar will not crash. Fixes #6126.
-rw-r--r--swaybar/ipc.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
index 05238d8b..a64aa1ab 100644
--- a/swaybar/ipc.c
+++ b/swaybar/ipc.c
@@ -547,7 +547,16 @@ bool handle_ipc_readable(struct swaybar *bar) {
547 return false; 547 return false;
548 } 548 }
549 549
550 json_tokener *tok = json_tokener_new_ex(INT_MAX); 550 // The default depth of 32 is too small to represent some nested layouts, but
551 // we can't pass INT_MAX here because json-c (as of this writing) prefaults
552 // all the memory for its stack.
553 json_tokener *tok = json_tokener_new_ex(256);
554 if (!tok) {
555 sway_log_errno(SWAY_ERROR, "failed to create tokener");
556 free_ipc_response(resp);
557 return false;
558 }
559
551 json_object *result = json_tokener_parse_ex(tok, resp->payload, -1); 560 json_object *result = json_tokener_parse_ex(tok, resp->payload, -1);
552 enum json_tokener_error err = json_tokener_get_error(tok); 561 enum json_tokener_error err = json_tokener_get_error(tok);
553 json_tokener_free(tok); 562 json_tokener_free(tok);