[libcamera-devel] [PATCH v2] libcamera: ipa_manager: Fix handling of unset LIBCAMERA_IPA_MODULE_PATH

Niklas Söderlund niklas.soderlund at ragnatech.se
Tue Jun 11 16:02:42 CEST 2019


Hi Laurent,

Thanks for your feedback.

On 2019-06-11 13:17:10 +0300, Laurent Pinchart wrote:
> Hi Niklas,
> 
> Thank you for the patch.
> 
> On Mon, Jun 10, 2019 at 11:00:23PM +0200, Niklas Söderlund wrote:
> > If the environment variable LIBCAMERA_IPA_MODULE_PATH is not set
> > utils::secure_getenv() will return a nullptr. Assigning a nullptr to a
> > std::string is not valid and results in a crash,
> > 
> >     terminate called after throwing an instance of 'std::logic_error'
> >       what():  basic_string::_M_construct null not valid
> > 
> > Fix this by operating directly on the returned char array instead of
> > turning it into a std::string.
> > 
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> >  src/libcamera/ipa_manager.cpp | 23 +++++++++++++----------
> >  1 file changed, 13 insertions(+), 10 deletions(-)
> > 
> > diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
> > index f689aa69b7284092..b9b772d1d5e7795f 100644
> > --- a/src/libcamera/ipa_manager.cpp
> > +++ b/src/libcamera/ipa_manager.cpp
> > @@ -34,19 +34,22 @@ IPAManager::IPAManager()
> >  {
> >  	addDir(IPA_MODULE_DIR);
> >  
> > -	std::string modulePaths = utils::secure_getenv("LIBCAMERA_IPA_MODULE_PATH");
> > -	if (modulePaths.empty())
> > +	const char *modulePaths = utils::secure_getenv("LIBCAMERA_IPA_MODULE_PATH");
> > +	if (!modulePaths)
> >  		return;
> >  
> > -	for (size_t pos = 0, delim = 0; delim != std::string::npos;
> > -	     pos = delim + 1) {
> > -		delim = modulePaths.find(':', pos);
> > -		size_t count = delim == std::string::npos ? delim : delim - pos;
> > -		std::string path = modulePaths.substr(pos, count);
> > -		if (path.empty())
> > -			continue;
> > +	while (1) {
> > +		const char *delim = strchrnul(modulePaths, ':');
> > +		size_t count = delim - modulePaths;
> >  
> > -		addDir(path.c_str());
> > +		std::string path(modulePaths, count);
> > +		if (!path.empty())
> > +			addDir(path.c_str());
> 
> Small improvement, to avoid constructing an empty string,
> 
> 		if (count) {
> 			std::string path(modulePaths, count);
> 			addDir(path.c_str());
> 		}
> 
> Could you test this with a LIBCAMERA_IPA_MODULE_PATH that contains "::"
> and that ends with ":" ?

It works.

> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Thanks, pushed to master with your tag.

> 
> > +
> > +		if (*delim == '\0')
> > +			break;
> > +
> > +		modulePaths += count + 1;
> >  	}
> >  }
> >  
> 
> -- 
> Regards,
> 
> Laurent Pinchart

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list