[PATCH weston v2 2/2] Re-apply "config-parser: Catch negative numbers assigned to unsigned config values"
Bryce Harrington
bryce at osg.samsung.com
Tue Jul 26 23:22:35 UTC 2016
On Thu, Jul 14, 2016 at 06:28:04PM -0700, Bryce Harrington wrote:
> [With hexadecimal color values now handled via their own routine,
> re-introduce the negative unsigned numbers fix.]
>
> strtoul() has a side effect that when given a string representing a
> negative number, it treats it as a high value hexadecimal. IOW,
> strtoul("-42", &val) sets val to 0xffffffd6. This could potentially
> result in unintended surprise behaviors.
>
> Catch this by using strtol() and then manually check for the negative
> value. This logic is modelled after Wayland's strtouint().
>
> Note that this change unfortunately reduces the range of parseable
> numbers from [0,UINT_MAX] to [0,INT_MAX]. The current users of
> weston_config_section_get_uint() are anticipating numbers far smaller
> than either of these limits, so the change is believed to have no impact
> in practice.
>
> Also add a test case for negative numbers that catches this error
> condition.
>
> Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
Eric R-b'd this one off-list as well.
I renumbered the test cases to bring up to date with trunk and pushed
both patches in this series.
cbfde13..d0716f4 master -> master
> ---
> shared/config-parser.c | 12 +++++++++++-
> tests/config-parser-test.c | 31 +++++++++++++++++++++++++++++++
> 2 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/shared/config-parser.c b/shared/config-parser.c
> index 33d5e36..d5bbb8d 100644
> --- a/shared/config-parser.c
> +++ b/shared/config-parser.c
> @@ -186,6 +186,7 @@ weston_config_section_get_uint(struct weston_config_section *section,
> const char *key,
> uint32_t *value, uint32_t default_value)
> {
> + long int ret;
> struct weston_config_entry *entry;
> char *end;
>
> @@ -197,13 +198,22 @@ weston_config_section_get_uint(struct weston_config_section *section,
> }
>
> errno = 0;
> - *value = strtoul(entry->value, &end, 0);
> + ret = strtol(entry->value, &end, 0);
> if (errno != 0 || end == entry->value || *end != '\0') {
> *value = default_value;
> errno = EINVAL;
> return -1;
> }
>
> + /* check range */
> + if (ret < 0 || ret > INT_MAX) {
> + *value = default_value;
> + errno = ERANGE;
> + return -1;
> + }
> +
> + *value = ret;
> +
> return 0;
> }
>
> diff --git a/tests/config-parser-test.c b/tests/config-parser-test.c
> index 5a5a380..7f30b22 100644
> --- a/tests/config-parser-test.c
> +++ b/tests/config-parser-test.c
> @@ -117,6 +117,7 @@ static struct zuc_fixture config_test_t1 = {
> "# more comments\n"
> "number=5252\n"
> "zero=0\n"
> + "negative=-42\n"
> "flag=false\n"
> "\n"
> "[colors]\n"
> @@ -578,6 +579,36 @@ ZUC_TEST_F(config_test_t1, test026, data)
> ZUC_ASSERT_EQ(EINVAL, errno);
> }
>
> +ZUC_TEST_F(config_test_t1, test025, data)
> +{
> + int r;
> + int32_t n;
> + struct weston_config_section *section;
> + struct weston_config *config = data;
> +
> + section = weston_config_get_section(config, "bar", NULL, NULL);
> + r = weston_config_section_get_int(section, "negative", &n, 600);
> +
> + ZUC_ASSERT_EQ(0, r);
> + ZUC_ASSERT_EQ(-42, n);
> + ZUC_ASSERT_EQ(0, errno);
> +}
> +
> +ZUC_TEST_F(config_test_t1, test026, data)
> +{
> + int r;
> + uint32_t n;
> + struct weston_config_section *section;
> + struct weston_config *config = data;
> +
> + section = weston_config_get_section(config, "bar", NULL, NULL);
> + r = weston_config_section_get_uint(section, "negative", &n, 600);
> +
> + ZUC_ASSERT_EQ(-1, r);
> + ZUC_ASSERT_EQ(600, n);
> + ZUC_ASSERT_EQ(ERANGE, errno);
> +}
> +
> ZUC_TEST_F(config_test_t2, doesnt_parse, data)
> {
> struct weston_config *config = data;
> --
> 1.9.1
More information about the wayland-devel
mailing list