config: improve validation of color values, default alpha to 0xff

Reject color values that aren't in either RGB, or ARGB format. That
is, color values that aren't hexadecimal numbers with either 6 or 8
digits.

Also, if a color value is allowed to have an alpha component, and the
user left it out, default to 0xff (opaque) rather than 0x00 (fully
transparent).

Closes #1526
This commit is contained in:
Daniel Eklöf 2023-10-26 16:22:41 +02:00
parent 85a4e4ccc1
commit 02fff24b4f
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 34 additions and 6 deletions

View file

@ -52,9 +52,21 @@
## Unreleased
### Added
### Changed
* config: ARGB color values now default to opaque, rather than
transparent, when the alpha component has been left out
([#1526][1526]).
[1526]: https://codeberg.org/dnkl/foot/issues/1526
### Deprecated
### Removed
### Fixed
* config: improved validation of color values.
### Security
### Contributors

View file

@ -618,18 +618,30 @@ value_to_enum(struct context *ctx, const char **value_map, int *res)
}
static bool NOINLINE
value_to_color(struct context *ctx, uint32_t *color, bool allow_alpha)
value_to_color(struct context *ctx, uint32_t *result, bool allow_alpha)
{
if (!str_to_uint32(ctx->value, 16, color)) {
LOG_CONTEXTUAL_ERR("not a valid color value");
uint32_t color;
const size_t len = strlen(ctx->value);
const size_t component_count = len / 2;
if (!(len == 6 || (allow_alpha && len == 8)) ||
!str_to_uint32(ctx->value, 16, &color))
{
if (allow_alpha) {
LOG_CONTEXTUAL_ERR("color must be in either RGB or ARGB format");
} else {
LOG_CONTEXTUAL_ERR("color must be in RGB format");
}
return false;
}
if (!allow_alpha && (*color & 0xff000000) != 0) {
LOG_CONTEXTUAL_ERR("color value must not have an alpha component");
return false;
if (allow_alpha && component_count == 3) {
/* If user left out the alpha component, assume non-transparency */
color |= 0xff000000;
}
*result = color;
return true;
}

View file

@ -426,6 +426,10 @@ test_color(struct context *ctx, bool (*parse_fun)(struct context *ctx),
{"ffffff", 0xffffff},
{"ffffffff", 0xffffffff, !alpha_allowed},
{"aabbccdd", 0xaabbccdd, !alpha_allowed},
{"00", 0, true},
{"0000", 0, true},
{"00000", 0, true},
{"000000000", 0, true},
{"unittest-invalid-color", 0, true},
};