[libcamera-devel] [PATCH 6/7] libcamera: yaml_parser: Fix range checks for 32-bit integers
Jacopo Mondi
jacopo at jmondi.org
Fri Jun 17 16:09:24 CEST 2022
Ahem
On Fri, Jun 17, 2022 at 04:07:17PM +0200, Jacopo Mondi via libcamera-devel wrote:
> Hi Laurent
>
> On Thu, Jun 16, 2022 at 05:24:02PM +0300, Laurent Pinchart via libcamera-devel wrote:
> > The strtol() and strtoul() functions return long integers, which may be
> > larger than 32-bit integers. Add manual range checks.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>
> Thanks
> j
>
> > ---
> > src/libcamera/yaml_parser.cpp | 13 +++++++++----
> > 1 file changed, 9 insertions(+), 4 deletions(-)
> >
> > diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
> > index 9b6e70cbfcf3..bd4b501b1422 100644
> > --- a/src/libcamera/yaml_parser.cpp
> > +++ b/src/libcamera/yaml_parser.cpp
> > @@ -10,6 +10,7 @@
> > #include <cstdlib>
> > #include <errno.h>
> > #include <functional>
> > +#include <limits>
> >
> > #include <libcamera/base/file.h>
> > #include <libcamera/base/log.h>
> > @@ -151,9 +152,11 @@ int32_t YamlObject::get(const int32_t &defaultValue, bool *ok) const
> > char *end;
> >
> > errno = 0;
> > - int32_t value = std::strtol(value_.c_str(), &end, 10);
>
> Or should value be a long instead ?
>
Wrote this before realizing this was a specialization and forgot to delete
the comment!
Thanks
j
> > + long value = std::strtol(value_.c_str(), &end, 10);
> >
> > - if ('\0' != *end || errno == ERANGE)
> > + if ('\0' != *end || errno == ERANGE ||
> > + value < std::numeric_limits<int32_t>::min() ||
> > + value > std::numeric_limits<int32_t>::max())
> > return defaultValue;
> >
> > setOk(ok, true);
> > @@ -185,9 +188,11 @@ uint32_t YamlObject::get(const uint32_t &defaultValue, bool *ok) const
> > char *end;
> >
> > errno = 0;
> > - uint32_t value = std::strtoul(value_.c_str(), &end, 10);
> > + unsigned long value = std::strtoul(value_.c_str(), &end, 10);
> >
> > - if ('\0' != *end || errno == ERANGE)
> > + if ('\0' != *end || errno == ERANGE ||
> > + value < std::numeric_limits<uint32_t>::min() ||
> > + value > std::numeric_limits<uint32_t>::max())
> > return defaultValue;
> >
> > setOk(ok, true);
> > --
> > Regards,
> >
> > Laurent Pinchart
> >
More information about the libcamera-devel
mailing list