From 91ec14f2bc59cac6225b60532b8f7e81e6492f63 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Fri, 10 Apr 2020 11:38:19 +0200 Subject: [PATCH] Fix SEGFAULT when i3bar receives invalid input Fixes #3844 --- i3bar/src/child.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/i3bar/src/child.c b/i3bar/src/child.c index b145e5d5..56961fc8 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -194,6 +194,11 @@ static int stdin_map_key(void *context, const unsigned char *key, size_t len) { static int stdin_boolean(void *context, int val) { parser_ctx *ctx = context; + + if (!ctx->last_map_key) { + return 0; + } + if (strcasecmp(ctx->last_map_key, "urgent") == 0) { ctx->block.urgent = val; return 1; @@ -208,6 +213,11 @@ static int stdin_boolean(void *context, int val) { static int stdin_string(void *context, const unsigned char *val, size_t len) { parser_ctx *ctx = context; + + if (!ctx->last_map_key) { + return 0; + } + if (strcasecmp(ctx->last_map_key, "full_text") == 0) { ctx->block.full_text = i3string_from_markup_with_length((const char *)val, len); return 1; @@ -260,6 +270,11 @@ static int stdin_string(void *context, const unsigned char *val, size_t len) { static int stdin_integer(void *context, long long val) { parser_ctx *ctx = context; + + if (!ctx->last_map_key) { + return 0; + } + if (strcasecmp(ctx->last_map_key, "min_width") == 0) { ctx->block.min_width = (uint32_t)val; return 1;