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:
@ -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_;
|
||||
};
|
||||
|
||||
@ -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_;
|
||||
};
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user