diff options
author | Tudor Brindus <me@tbrindus.ca> | 2021-03-22 09:01:00 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-03-22 14:10:53 +0100 |
commit | 03daa53a0ef63d2a72acda05e94e5ba5c0b50d33 (patch) | |
tree | cd822bf55717b0b128538e2686f7f754ec229b1f /swaybar/ipc.c | |
parent | swaybar: use INT_MAX max JSON depth when parsing IPC response (diff) | |
download | sway-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.
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r-- | swaybar/ipc.c | 11 |
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); |