[RFC PATCH v3 2/9] libcamera: process: Misc. cleanup around `execv()`

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Mar 25 20:12:11 CET 2025


Quoting Barnabás Pőcze (2025-03-25 18:08:14)
> Firstly, get the number of arguments first, and use that to determine the
> size of the allocation instead of retrieving it twice.
> 
> Secondly, use `const_cast` instead of a C-style cast when calling `execv()`.
> 
> Third, use `size_t` to match the type of `args.size()`.
> 
> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
> ---
>  src/libcamera/process.cpp | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/src/libcamera/process.cpp b/src/libcamera/process.cpp
> index 68fad3270..567b878d4 100644
> --- a/src/libcamera/process.cpp
> +++ b/src/libcamera/process.cpp
> @@ -265,14 +265,15 @@ int Process::start(const std::string &path,
>                 if (file && strcmp(file, "syslog"))
>                         unsetenv("LIBCAMERA_LOG_FILE");
>  
> -               const char **argv = new const char *[args.size() + 2];
> -               unsigned int len = args.size();
> +               size_t len = args.size();
> +               auto argv = std::make_unique<const char *[]>(len + 2);

There's also a unique_ptr instaed of a 'new'. Will that have any side
effect at the execv ? I assume not ...


Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> +
>                 argv[0] = path.c_str();
> -               for (unsigned int i = 0; i < len; i++)
> +               for (size_t i = 0; i < len; i++)
>                         argv[i + 1] = args[i].c_str();
>                 argv[len + 1] = nullptr;
>  
> -               execv(path.c_str(), (char **)argv);
> +               execv(path.c_str(), const_cast<char **>(argv.get()));
>  
>                 exit(EXIT_FAILURE);
>         }
> -- 
> 2.49.0
>


More information about the libcamera-devel mailing list