[PATCH weston] config-parser: Improve error checks for strtol/strtoul calls

Bryce Harrington bryce at osg.samsung.com
Mon Jul 11 20:27:44 UTC 2016


On Mon, Jul 11, 2016 at 09:28:16AM +1000, Peter Hutterer wrote:
> On Thu, Jul 07, 2016 at 02:24:39PM -0700, Bryce Harrington wrote:
> > On Thu, Jul 07, 2016 at 02:08:28PM -0700, Bryce Harrington wrote:
> > > Check errno, which is set of over/underflow, out of range, etc.  Also
> > > check for empty strings (the usages covered in this patch already also
> > > cover the case where there are non-digits present).  Set errno to 0
> > > before making the strto*l call in case of pre-existing errors
> > > (i.e. ENOTTY when running under the testsuite).
> > > 
> > > This follows the error checking style used in Wayland
> > > (c.f. wayland-client.c and scanner.c).
> > > 
> > > In tests, also check errno, and add testcases for parsing '0'.
> > > 
> > > Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
> > 
> > If this approach looks ok to folks, there are other irregular uses of
> > strto*l I'll clean up as well subsequently.
> 
> it'd be best to have a safe_strtol helper function in a weston-util.h
> header and just enforce use of that. because most of the time all we care
> about is "has it parsed and what's the result", you can get that with a
>     bool safe_strtol(const char *string, long *result);
> 
> or safe_atoi, or whatever you want to call it.

I've pushed this specific cleanup with Eric's R-b but will follow up
with a proposal for this helper function later.  I think there may be a
few more cleanups to do first.

Bryce
 
> Cheers,
>    Peter
> 
> 
> 
> > 
> > > ---
> > >  shared/config-parser.c     |  6 ++++--
> > >  tests/config-parser-test.c | 34 ++++++++++++++++++++++++++++++++++
> > >  2 files changed, 38 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/shared/config-parser.c b/shared/config-parser.c
> > > index 2256469..151ae9c 100644
> > > --- a/shared/config-parser.c
> > > +++ b/shared/config-parser.c
> > > @@ -169,8 +169,9 @@ weston_config_section_get_int(struct weston_config_section *section,
> > >  		return -1;
> > >  	}
> > >  
> > > +	errno = 0;
> > >  	*value = strtol(entry->value, &end, 0);
> > > -	if (*end != '\0') {
> > > +	if (errno != 0 || end == entry->value || *end != '\0') {
> > >  		*value = default_value;
> > >  		errno = EINVAL;
> > >  		return -1;
> > > @@ -195,8 +196,9 @@ weston_config_section_get_uint(struct weston_config_section *section,
> > >  		return -1;
> > >  	}
> > >  
> > > +	errno = 0;
> > >  	*value = strtoul(entry->value, &end, 0);
> > > -	if (*end != '\0') {
> > > +	if (errno != 0 || end == entry->value || *end != '\0') {
> > >  		*value = default_value;
> > >  		errno = EINVAL;
> > >  		return -1;
> > > diff --git a/tests/config-parser-test.c b/tests/config-parser-test.c
> > > index 5dcafc4..735da4e 100644
> > > --- a/tests/config-parser-test.c
> > > +++ b/tests/config-parser-test.c
> > > @@ -116,6 +116,7 @@ static struct zuc_fixture config_test_t1 = {
> > >  	"[bar]\n"
> > >  	"# more comments\n"
> > >  	"number=5252\n"
> > > +	"zero=0\n"
> > >  	"flag=false\n"
> > >  	"\n"
> > >  	"[stuff]\n"
> > > @@ -263,6 +264,7 @@ ZUC_TEST_F(config_test_t1, test006, data)
> > >  
> > >  	ZUC_ASSERT_EQ(0, r);
> > >  	ZUC_ASSERT_EQ(5252, n);
> > > +	ZUC_ASSERT_EQ(0, errno);
> > >  }
> > >  
> > >  ZUC_TEST_F(config_test_t1, test007, data)
> > > @@ -289,8 +291,10 @@ ZUC_TEST_F(config_test_t1, test008, data)
> > >  
> > >  	section = weston_config_get_section(config, "bar", NULL, NULL);
> > >  	r = weston_config_section_get_uint(section, "number", &u, 600);
> > > +
> > >  	ZUC_ASSERT_EQ(0, r);
> > >  	ZUC_ASSERT_EQ(5252, u);
> > > +	ZUC_ASSERT_EQ(0, errno);
> > >  }
> > >  
> > >  ZUC_TEST_F(config_test_t1, test009, data)
> > > @@ -427,6 +431,36 @@ ZUC_TEST_F(config_test_t1, test017, data)
> > >  	ZUC_ASSERT_EQ(5, i);
> > >  }
> > >  
> > > +ZUC_TEST_F(config_test_t1, test018, 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, "zero", &n, 600);
> > > +
> > > +	ZUC_ASSERT_EQ(0, r);
> > > +	ZUC_ASSERT_EQ(0, n);
> > > +	ZUC_ASSERT_EQ(0, errno);
> > > +}
> > > +
> > > +ZUC_TEST_F(config_test_t1, test019, 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, "zero", &n, 600);
> > > +
> > > +	ZUC_ASSERT_EQ(0, r);
> > > +	ZUC_ASSERT_EQ(0, n);
> > > +	ZUC_ASSERT_EQ(0, errno);
> > > +}
> > > +
> > >  ZUC_TEST_F(config_test_t2, doesnt_parse, data)
> > >  {
> > >  	struct weston_config *config = data;
> > > -- 
> > > 1.9.1
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/wayland-devel
> > 


More information about the wayland-devel mailing list