From 4a7fb2cbc17165e8df7311ec5fe00d567082de59 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sat, 14 Nov 2015 07:29:47 -0600 Subject: [PATCH] binfmt: Cosmetic -- rename binfmt_internal.h to binfmt.h. Move related argument copy logic into new file, binfmt_copyargv.c --- binfmt/Makefile | 2 +- binfmt/{binfmt_internal.h => binfmt.h} | 28 +++- binfmt/binfmt_copyargv.c | 197 +++++++++++++++++++++++++ binfmt/binfmt_dumpmodule.c | 2 +- binfmt/binfmt_exec.c | 121 +-------------- binfmt/binfmt_execmodule.c | 2 +- binfmt/binfmt_loadmodule.c | 2 +- binfmt/binfmt_register.c | 2 +- binfmt/binfmt_schedunload.c | 2 +- binfmt/binfmt_unloadmodule.c | 35 +---- binfmt/binfmt_unregister.c | 2 +- configs | 2 +- 12 files changed, 231 insertions(+), 166 deletions(-) rename binfmt/{binfmt_internal.h => binfmt.h} (82%) create mode 100644 binfmt/binfmt_copyargv.c diff --git a/binfmt/Makefile b/binfmt/Makefile index c5cfe9736b..9da55ea973 100644 --- a/binfmt/Makefile +++ b/binfmt/Makefile @@ -46,7 +46,7 @@ CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" "$(TOPDIR)$(DELIM)sched"} BINFMT_ASRCS = BINFMT_CSRCS = binfmt_globals.c binfmt_register.c binfmt_unregister.c BINFMT_CSRCS += binfmt_loadmodule.c binfmt_unloadmodule.c binfmt_execmodule.c -BINFMT_CSRCS += binfmt_exec.c binfmt_dumpmodule.c +BINFMT_CSRCS += binfmt_exec.c binfmt_copyargv.c binfmt_dumpmodule.c ifeq ($(CONFIG_BINFMT_EXEPATH),y) BINFMT_CSRCS += binfmt_exepath.c diff --git a/binfmt/binfmt_internal.h b/binfmt/binfmt.h similarity index 82% rename from binfmt/binfmt_internal.h rename to binfmt/binfmt.h index 11b036fe74..370ef57eae 100644 --- a/binfmt/binfmt_internal.h +++ b/binfmt/binfmt.h @@ -1,5 +1,5 @@ /**************************************************************************** - * binfmt/binfmt_internal.h + * binfmt/binfmt.h * * Copyright (C) 2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt @@ -33,8 +33,8 @@ * ****************************************************************************/ -#ifndef __BINFMT_BINFMT_INTERNAL_H -#define __BINFMT_BINFMT_INTERNAL_H +#ifndef __BINFMT_BINFMT_H +#define __BINFMT_BINFMT_H /**************************************************************************** * Included Files @@ -92,6 +92,26 @@ int dump_module(FAR const struct binary_s *bin); # define dump_module(bin) #endif +/**************************************************************************** + * Name: binfmt_copyargv + * + * Description: + * In the kernel build, the argv list will likely lie in the caller's + * address environment and, hence, by inaccessible when we swith to the + * address environment of the new process address environment. So we + * do not have any real option other than to copy the callers argv[] list. + * + * Input Parameter: + * bin - Load structure + * argv - Argument list + * + * Returned Value: + * Zero (OK) on sucess; a negater erro value on failure. + * + ****************************************************************************/ + +int binfmt_copyargv(FAR struct binary_s *bin, FAR char * const *argv); + /**************************************************************************** * Name: binfmt_freeargv * @@ -117,5 +137,5 @@ void binfmt_freeargv(FAR struct binary_s *bin); } #endif -#endif /* __BINFMT_BINFMT_INTERNAL_H */ +#endif /* __BINFMT_BINFMT_H */ diff --git a/binfmt/binfmt_copyargv.c b/binfmt/binfmt_copyargv.c new file mode 100644 index 0000000000..2fee46d047 --- /dev/null +++ b/binfmt/binfmt_copyargv.c @@ -0,0 +1,197 @@ +/**************************************************************************** + * binfmt/binfmt_copyargv.c + * + * Copyright (C) 2009, 2013-2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include + +#include "binfmt.h" + +#ifndef CONFIG_BINFMT_DISABLE + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* This is an artificial limit to detect error conditions where an argv[] + * list is not properly terminated. + */ + +#define MAX_EXEC_ARGS 256 + +/**************************************************************************** + * Public Function + ****************************************************************************/ + +/**************************************************************************** + * Name: binfmt_copyargv + * + * Description: + * In the kernel build, the argv list will likely lie in the caller's + * address environment and, hence, by inaccessible when we switch to the + * address environment of the new process address environment. So we + * do not have any real option other than to copy the callers argv[] list. + * + * Input Parameter: + * bin - Load structure + * argv - Argument list + * + * Returned Value: + * Zero (OK) on sucess; a negater erro value on failure. + * + ****************************************************************************/ + +int binfmt_copyargv(FAR struct binary_s *bin, FAR char * const *argv) +{ +#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL) + FAR char *ptr; + size_t argvsize; + size_t argsize; + int nargs; + int i; + + /* Get the number of arguments and the size of the argument list */ + + bin->argv = (FAR char **)NULL; + bin->argbuffer = (FAR char *)NULL; + + if (argv) + { + argsize = 0; + nargs = 0; + + for (i = 0; argv[i]; i++) + { + /* Increment the size of the allocation with the size of the next string */ + + argsize += (strlen(argv[i]) + 1); + nargs++; + + /* This is a sanity check to prevent running away with an unterminated + * argv[] list. MAX_EXEC_ARGS should be sufficiently large that this + * never happens in normal usage. + */ + + if (nargs > MAX_EXEC_ARGS) + { + bdbg("ERROR: Too many arguments: %lu\n", (unsigned long)argvsize); + return -E2BIG; + } + } + + bvdbg("args=%d argsize=%lu\n", nargs, (unsigned long)argsize); + + /* Allocate the argv array and an argument buffer */ + + if (argsize > 0) + { + argvsize = (nargs + 1) * sizeof(FAR char *); + bin->argbuffer = (FAR char *)kmm_malloc(argvsize + argsize); + if (!bin->argbuffer) + { + bdbg("ERROR: Failed to allocate the argument buffer\n"); + return -ENOMEM; + } + + /* Copy the argv list */ + + bin->argv = (FAR char **)bin->argbuffer; + ptr = bin->argbuffer + argvsize; + for (i = 0; argv[i]; i++) + { + bin->argv[i] = ptr; + argsize = strlen(argv[i]) + 1; + memcpy(ptr, argv[i], argsize); + ptr += argsize; + } + + /* Terminate the argv[] list */ + + bin->argv[i] = (FAR char *)NULL; + } + } + + return OK; + +#else + /* Just save the caller's argv pointer */ + + bin->argv = argv; + return OK; +#endif +} + +/**************************************************************************** + * Name: binfmt_freeargv + * + * Description: + * Release the copied argv[] list. + * + * Input Parameter: + * binp - Load structure + * + * Returned Value: + * None + * + ****************************************************************************/ + +#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL) +void binfmt_freeargv(FAR struct binary_s *binp) +{ + /* Is there an allocated argument buffer */ + + if (binp->argbuffer) + { + /* Free the argument buffer */ + + kmm_free(binp->argbuffer); + } + + /* Nullify the allocated argv[] array and the argument buffer pointers */ + + binp->argbuffer = (FAR char *)NULL; + binp->argv = (FAR char **)NULL; +} +#endif + +#endif /* !CONFIG_BINFMT_DISABLE */ diff --git a/binfmt/binfmt_dumpmodule.c b/binfmt/binfmt_dumpmodule.c index 59ed17a94e..c69fed83c4 100644 --- a/binfmt/binfmt_dumpmodule.c +++ b/binfmt/binfmt_dumpmodule.c @@ -45,7 +45,7 @@ #include -#include "binfmt_internal.h" +#include "binfmt.h" #if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_BINFMT) && !defined(CONFIG_BINFMT_DISABLE) diff --git a/binfmt/binfmt_exec.c b/binfmt/binfmt_exec.c index 3f866fe99a..f3f62027eb 100644 --- a/binfmt/binfmt_exec.c +++ b/binfmt/binfmt_exec.c @@ -46,129 +46,10 @@ #include #include -#include "binfmt_internal.h" +#include "binfmt.h" #ifndef CONFIG_BINFMT_DISABLE -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ -/* This is an artificial limit to detect error conditions where an argv[] - * list is not properly terminated. - */ - -#define MAX_EXEC_ARGS 256 - -/**************************************************************************** - * Private Function Prototypes - ****************************************************************************/ - -/**************************************************************************** - * Name: binfmt_copyargv - * - * Description: - * In the kernel build, the argv list will likely lie in the caller's - * address environment and, hence, by inaccessible when we swith to the - * address environment of the new process address environment. So we - * do not have any real option other than to copy the callers argv[] list. - * - * Input Parameter: - * bin - Load structure - * argv - Argument list - * - * Returned Value: - * Zero (OK) on sucess; a negater erro value on failure. - * - ****************************************************************************/ - -static inline int binfmt_copyargv(FAR struct binary_s *bin, FAR char * const *argv) -{ -#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL) - FAR char *ptr; - size_t argvsize; - size_t argsize; - int nargs; - int i; - - /* Get the number of arguments and the size of the argument list */ - - bin->argv = (FAR char **)NULL; - bin->argbuffer = (FAR char *)NULL; - - if (argv) - { - argsize = 0; - nargs = 0; - - for (i = 0; argv[i]; i++) - { - /* Increment the size of the allocation with the size of the next string */ - - argsize += (strlen(argv[i]) + 1); - nargs++; - - /* This is a sanity check to prevent running away with an unterminated - * argv[] list. MAX_EXEC_ARGS should be sufficiently large that this - * never happens in normal usage. - */ - - if (nargs > MAX_EXEC_ARGS) - { - bdbg("ERROR: Too many arguments: %lu\n", (unsigned long)argvsize); - return -E2BIG; - } - } - - bvdbg("args=%d argsize=%lu\n", nargs, (unsigned long)argsize); - - /* Allocate the argv array and an argument buffer */ - - if (argsize > 0) - { - argvsize = (nargs + 1) * sizeof(FAR char *); - bin->argbuffer = (FAR char *)kmm_malloc(argvsize + argsize); - if (!bin->argbuffer) - { - bdbg("ERROR: Failed to allocate the argument buffer\n"); - return -ENOMEM; - } - - /* Copy the argv list */ - - bin->argv = (FAR char **)bin->argbuffer; - ptr = bin->argbuffer + argvsize; - for (i = 0; argv[i]; i++) - { - bin->argv[i] = ptr; - argsize = strlen(argv[i]) + 1; - memcpy(ptr, argv[i], argsize); - ptr += argsize; - } - - /* Terminate the argv[] list */ - - bin->argv[i] = (FAR char *)NULL; - } - } - - return OK; - -#else - /* Just save the caller's argv pointer */ - - bin->argv = argv; - return OK; -#endif -} - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/binfmt/binfmt_execmodule.c b/binfmt/binfmt_execmodule.c index f8701be8ce..971c47123c 100644 --- a/binfmt/binfmt_execmodule.c +++ b/binfmt/binfmt_execmodule.c @@ -53,7 +53,7 @@ #include #include "sched/sched.h" -#include "binfmt_internal.h" +#include "binfmt.h" #ifndef CONFIG_BINFMT_DISABLE diff --git a/binfmt/binfmt_loadmodule.c b/binfmt/binfmt_loadmodule.c index 83868460a6..1b614838e6 100644 --- a/binfmt/binfmt_loadmodule.c +++ b/binfmt/binfmt_loadmodule.c @@ -46,7 +46,7 @@ #include #include -#include "binfmt_internal.h" +#include "binfmt.h" #ifndef CONFIG_BINFMT_DISABLE diff --git a/binfmt/binfmt_register.c b/binfmt/binfmt_register.c index 925f29353f..48ddfc1daa 100644 --- a/binfmt/binfmt_register.c +++ b/binfmt/binfmt_register.c @@ -46,7 +46,7 @@ #include -#include "binfmt_internal.h" +#include "binfmt.h" #ifndef CONFIG_BINFMT_DISABLE diff --git a/binfmt/binfmt_schedunload.c b/binfmt/binfmt_schedunload.c index 89d5815918..b9c6a9d6d1 100644 --- a/binfmt/binfmt_schedunload.c +++ b/binfmt/binfmt_schedunload.c @@ -46,7 +46,7 @@ #include #include -#include "binfmt_internal.h" +#include "binfmt.h" #if !defined(CONFIG_BINFMT_DISABLE) && defined(CONFIG_SCHED_HAVE_PARENT) diff --git a/binfmt/binfmt_unloadmodule.c b/binfmt/binfmt_unloadmodule.c index 535942b0f6..887d6d66c0 100644 --- a/binfmt/binfmt_unloadmodule.c +++ b/binfmt/binfmt_unloadmodule.c @@ -48,7 +48,7 @@ #include #include -#include "binfmt_internal.h" +#include "binfmt.h" #ifndef CONFIG_BINFMT_DISABLE @@ -211,38 +211,5 @@ int unload_module(FAR struct binary_s *binp) return OK; } -/**************************************************************************** - * Name: binfmt_freeargv - * - * Description: - * Release the copied argv[] list. - * - * Input Parameter: - * binp - Load structure - * - * Returned Value: - * None - * - ****************************************************************************/ - -#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_BUILD_KERNEL) -void binfmt_freeargv(FAR struct binary_s *binp) -{ - /* Is there an allocated argument buffer */ - - if (binp->argbuffer) - { - /* Free the argument buffer */ - - kmm_free(binp->argbuffer); - } - - /* Nullify the allocated argv[] array and the argument buffer pointers */ - - binp->argbuffer = (FAR char *)NULL; - binp->argv = (FAR char **)NULL; -} -#endif - #endif /* CONFIG_BINFMT_DISABLE */ diff --git a/binfmt/binfmt_unregister.c b/binfmt/binfmt_unregister.c index f895e354d0..f97b06ff2d 100644 --- a/binfmt/binfmt_unregister.c +++ b/binfmt/binfmt_unregister.c @@ -46,7 +46,7 @@ #include -#include "binfmt_internal.h" +#include "binfmt.h" #ifndef CONFIG_BINFMT_DISABLE diff --git a/configs b/configs index 2a4b5e665a..95afbd39b4 160000 --- a/configs +++ b/configs @@ -1 +1 @@ -Subproject commit 2a4b5e665ac98b72920739eb12144462ca38e675 +Subproject commit 95afbd39b42d2689c894fdfc4e8b6123446772a9