Fix unhandled JSON exception in signal handlers

Cache signal value during module construction to avoid accessing JSON config
in signal handler context. This prevents crashes when signal field is missing
or not an integer type.

- Custom module: Cache signal_ value in constructor
- Image module: Cache signal_ value in constructor
- Both modules: Use cached value in refresh() method

Co-authored-by: Alexays <13947260+Alexays@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-02-04 08:53:47 +00:00
parent f16a6c7dcf
commit c34b1b6a19
4 changed files with 9 additions and 4 deletions

View File

@ -42,6 +42,7 @@ class Custom : public ALabel {
int pid_;
util::command::res output_;
util::JsonParser parser_;
int signal_; // Cached signal value to avoid JSON access in signal handler
util::SleeperThread thread_;
};

View File

@ -33,6 +33,7 @@ class Image : public AModule {
int size_;
std::chrono::milliseconds interval_;
util::command::res output_;
int signal_; // Cached signal value to avoid JSON access in signal handler
util::SleeperThread thread_;
};

View File

@ -13,7 +13,8 @@ waybar::modules::Custom::Custom(const std::string& name, const std::string& id,
tooltip_format_enabled_{config_["tooltip-format"].isString()},
percentage_(0),
fp_(nullptr),
pid_(-1) {
pid_(-1),
signal_(config_["signal"].isInt() ? config_["signal"].asInt() : -1) {
if (config.isNull()) {
spdlog::warn("There is no configuration for 'custom/{}', element will be hidden", name);
}
@ -136,7 +137,7 @@ void waybar::modules::Custom::waitingWorker() {
}
void waybar::modules::Custom::refresh(int sig) {
if (sig == SIGRTMIN + config_["signal"].asInt()) {
if (signal_ != -1 && sig == SIGRTMIN + signal_) {
thread_.wake_up();
}
}

View File

@ -1,7 +1,9 @@
#include "modules/image.hpp"
waybar::modules::Image::Image(const std::string& id, const Json::Value& config)
: AModule(config, "image", id), box_(Gtk::ORIENTATION_HORIZONTAL, 0) {
: AModule(config, "image", id),
box_(Gtk::ORIENTATION_HORIZONTAL, 0),
signal_(config_["signal"].isInt() ? config_["signal"].asInt() : -1) {
box_.pack_start(image_);
box_.set_name("image");
if (!id.empty()) {
@ -41,7 +43,7 @@ void waybar::modules::Image::delayWorker() {
}
void waybar::modules::Image::refresh(int sig) {
if (sig == SIGRTMIN + config_["signal"].asInt()) {
if (signal_ != -1 && sig == SIGRTMIN + signal_) {
thread_.wake_up();
}
}