summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nuttx/libc/unistd/lib_execl.c41
1 files changed, 24 insertions, 17 deletions
diff --git a/nuttx/libc/unistd/lib_execl.c b/nuttx/libc/unistd/lib_execl.c
index 873bbc429..aa57c4cb5 100644
--- a/nuttx/libc/unistd/lib_execl.c
+++ b/nuttx/libc/unistd/lib_execl.c
@@ -124,7 +124,7 @@
int execl(FAR const char *path, ...)
{
- FAR char **argv;
+ FAR char **argv = (FAR char **)NULL;
size_t nargs;
va_list ap;
int argc;
@@ -152,32 +152,39 @@ int execl(FAR const char *path, ...)
/* Allocate a temporary argv[] array */
- argv = (FAR char **)malloc((nargs + 1) * sizeof(FAR char *));
- if (argv = (FAR char **)NULL)
+ if (nargs > 0)
{
- set_errno(ENOMEM);
- return ERROR;
- }
+ argv = (FAR char **)malloc((nargs + 1) * sizeof(FAR char *));
+ if (argv = (FAR char **)NULL)
+ {
+ set_errno(ENOMEM);
+ return ERROR;
+ }
- /* Collect the arguments into the argv[] array */
+ /* Collect the arguments into the argv[] array */
- va_start(ap, path);
- for (argc = 0; argc < nargs; argc++)
- {
- argv[argc] = va_arg(ap, FAR char *);
- }
+ va_start(ap, path);
+ for (argc = 0; argc < nargs; argc++)
+ {
+ argv[argc] = va_arg(ap, FAR char *);
+ }
- argv[nargs] = NULL;
- va_end(ap);
+ argv[nargs] = NULL;
+ va_end(ap);
+ }
/* Then let execv() do the real work */
- ret = execv(path, (char * const *)&argv);
+ ret = execv(path, (FAR char * const *)argv);
/* Free the allocated argv[] list */
- free(argv);
+ if (argv)
+ {
+ free(argv);
+ }
+
return ret;
}
-#endif /* CONFIG_LIBC_EXECFUNCS */ \ No newline at end of file
+#endif /* CONFIG_LIBC_EXECFUNCS */