config: fix tilde expansion for wallpaper paths
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I45b7a520f1959886793ded62f1ed2cd96a6a6964
This commit is contained in:
parent
ca468ce677
commit
74fed80a26
3 changed files with 202 additions and 28 deletions
79
src/config.c
79
src/config.c
|
|
@ -67,20 +67,32 @@ static int add_output_mapping(chroma_config_t *config, const char *output_name,
|
|||
return CHROMA_ERROR_MEMORY;
|
||||
}
|
||||
|
||||
// Validate string lengths to prevent buffer overflow
|
||||
size_t output_len = strlen(output_name);
|
||||
size_t path_len = strlen(image_path);
|
||||
|
||||
if (output_len >= sizeof(config->mappings[0].output_name)) {
|
||||
chroma_log("ERROR", "Output name too long: %s (max %zu)", output_name,
|
||||
sizeof(config->mappings[0].output_name) - 1);
|
||||
return CHROMA_ERROR_CONFIG;
|
||||
}
|
||||
|
||||
if (path_len >= sizeof(config->mappings[0].image_path)) {
|
||||
chroma_log("ERROR", "Image path too long: %s (max %zu)", image_path,
|
||||
sizeof(config->mappings[0].image_path) - 1);
|
||||
return CHROMA_ERROR_CONFIG;
|
||||
}
|
||||
|
||||
chroma_config_mapping_t *mapping = &config->mappings[config->mapping_count];
|
||||
|
||||
strncpy(mapping->output_name, output_name, sizeof(mapping->output_name) - 1);
|
||||
mapping->output_name[sizeof(mapping->output_name) - 1] = '\0';
|
||||
|
||||
strncpy(mapping->image_path, image_path, sizeof(mapping->image_path) - 1);
|
||||
mapping->image_path[sizeof(mapping->image_path) - 1] = '\0';
|
||||
strcpy(mapping->output_name, output_name);
|
||||
strcpy(mapping->image_path, image_path);
|
||||
|
||||
config->mapping_count++;
|
||||
|
||||
chroma_log("DEBUG", "Added mapping: %s -> %s", output_name, image_path);
|
||||
chroma_log("TRACE", "Output mapping %d: '%s' -> '%s' (path length: %zu)",
|
||||
config->mapping_count, output_name, image_path,
|
||||
strlen(image_path));
|
||||
config->mapping_count, output_name, image_path, path_len);
|
||||
return CHROMA_OK;
|
||||
}
|
||||
|
||||
|
|
@ -138,11 +150,29 @@ static int parse_config_line(chroma_config_t *config, char *line,
|
|||
|
||||
// Parse configuration options
|
||||
if (strcasecmp(key, "default_image") == 0) {
|
||||
strncpy(config->default_image, value, sizeof(config->default_image) - 1);
|
||||
config->default_image[sizeof(config->default_image) - 1] = '\0';
|
||||
chroma_log("DEBUG", "Set default image: %s", value);
|
||||
chroma_log("TRACE", "Default image path set: length=%zu, expanded='%s'",
|
||||
strlen(value), value);
|
||||
char *expanded_path = chroma_expand_path(value);
|
||||
const char *path_to_use = expanded_path ? expanded_path : value;
|
||||
size_t path_len = strlen(path_to_use);
|
||||
|
||||
if (path_len >= sizeof(config->default_image)) {
|
||||
chroma_log("ERROR", "Default image path too long: %s (max %zu)",
|
||||
path_to_use, sizeof(config->default_image) - 1);
|
||||
if (expanded_path) {
|
||||
free(expanded_path);
|
||||
}
|
||||
return CHROMA_ERROR_CONFIG;
|
||||
}
|
||||
|
||||
strcpy(config->default_image, path_to_use);
|
||||
|
||||
if (expanded_path) {
|
||||
chroma_log("DEBUG", "Set default image: %s -> %s", value, expanded_path);
|
||||
chroma_log("TRACE", "Default image path set: length=%zu, expanded='%s'",
|
||||
path_len, expanded_path);
|
||||
free(expanded_path);
|
||||
} else {
|
||||
chroma_log("WARN", "Failed to expand path, using original: %s", value);
|
||||
}
|
||||
} else if (strcasecmp(key, "daemon") == 0 ||
|
||||
strcasecmp(key, "daemon_mode") == 0) {
|
||||
config->daemon_mode = parse_bool(value);
|
||||
|
|
@ -160,18 +190,33 @@ static int parse_config_line(chroma_config_t *config, char *line,
|
|||
return CHROMA_OK;
|
||||
}
|
||||
|
||||
// Expand path before validation and storage
|
||||
char *expanded_path = chroma_expand_path(value);
|
||||
const char *path_to_validate = expanded_path ? expanded_path : value;
|
||||
|
||||
// Validate image path
|
||||
if (chroma_image_validate(value) != CHROMA_OK) {
|
||||
chroma_log("WARN", "Invalid image path for output %s: %s", output_name,
|
||||
value);
|
||||
if (chroma_image_validate(path_to_validate) != CHROMA_OK) {
|
||||
chroma_log("WARN", "Invalid image path for output %s: %s (expanded: %s)",
|
||||
output_name, value, path_to_validate);
|
||||
if (expanded_path) {
|
||||
free(expanded_path);
|
||||
}
|
||||
return CHROMA_OK;
|
||||
}
|
||||
|
||||
if (add_output_mapping(config, output_name, value) != CHROMA_OK) {
|
||||
if (add_output_mapping(config, output_name, path_to_validate) !=
|
||||
CHROMA_OK) {
|
||||
chroma_log("ERROR", "Failed to add output mapping: %s -> %s", output_name,
|
||||
value);
|
||||
path_to_validate);
|
||||
if (expanded_path) {
|
||||
free(expanded_path);
|
||||
}
|
||||
return CHROMA_ERROR_CONFIG;
|
||||
}
|
||||
|
||||
if (expanded_path) {
|
||||
free(expanded_path);
|
||||
}
|
||||
} else {
|
||||
chroma_log("WARN", "Unknown configuration key line %d: %s", line_number,
|
||||
key);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue