More robust NS hex colour string parsing

Invalid arguments to color-values, such as "#abcdefg" or "#1234", or
valid ones like "#111222333", should not yield nonsense values.

* src/nsterm.m (ns_get_color):
Only accept "#RGB" strings with 1-4 digits per components, equal number
of digits each, and no trailing characters.  Parse 12-bit colours
correctly.
This commit is contained in:
Mattias Engdegård 2020-06-08 13:06:51 +02:00
parent 46304c474c
commit 64e25cde32

View file

@ -2399,20 +2399,23 @@ so some key presses (TAB) are swallowed by the system. */
scaling = (snprintf (hex, sizeof hex, "%s", name + 4) - 2) / 3;
else if (name[0] == '#') /* An old X11 format; convert to newer */
{
int len = (strlen(name) - 1);
int start = (len % 3 == 0) ? 1 : len / 4 + 1;
int i;
scaling = strlen(name+start) / 3;
for (i = 0; i < 3; i++)
sprintf (hex + i * (scaling + 1), "%.*s/", scaling,
name + start + i * scaling);
hex[3 * (scaling + 1) - 1] = '\0';
int len = 0;
while (isxdigit (name[len + 1]))
len++;
if (name[len + 1] == '\0' && len >= 1 && len <= 12 && len % 3 == 0)
{
scaling = len / 3;
for (int i = 0; i < 3; i++)
sprintf (hex + i * (scaling + 1), "%.*s/", scaling,
name + 1 + i * scaling);
hex[3 * (scaling + 1) - 1] = '\0';
}
}
if (hex[0])
{
unsigned int rr, gg, bb;
float fscale = scaling == 4 ? 65535.0 : (scaling == 2 ? 255.0 : 15.0);
float fscale = (1 << (scaling * 4)) - 1;
if (sscanf (hex, "%x/%x/%x", &rr, &gg, &bb))
{
r = rr / fscale;