This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new e29db6724c2 sched,fs,docs: support setuid sudo helper
e29db6724c2 is described below

commit e29db6724c2e6d2f7ac835838891c4c3943dbd5d
Author: Abhishek Mishra <[email protected]>
AuthorDate: Sat Aug 15 16:34:36 2026 +0000

    sched,fs,docs: support setuid sudo helper
    
    Supports the UNIX setuid-on-exec sudo helper. Documents the model,
    generates an extra ROMFS user and /etc/sudoers for a non-root test,
    reports BINFS modes from the builtin table so ls -l matches execute
    bits, and skips NULL environment entries when sanitizing a setuid exec.
    
    Signed-off-by: Abhishek Mishra <[email protected]>
---
 Documentation/applications/nsh/commands.rst    | 65 ++++++++++++++++++++++++
 Documentation/components/tools/index.rst       |  9 +++-
 Documentation/implementation/user_identity.rst | 12 +++++
 boards/Kconfig                                 | 51 +++++++++++++++++++
 cmake/nuttx_add_application.cmake              |  3 ++
 cmake/nuttx_add_romfs.cmake                    | 23 ++++++---
 cmake/savedefconfig.cmake                      |  3 +-
 fs/binfs/fs_binfs.c                            | 21 +++++---
 sched/environ/env_secureexec.c                 | 11 +++-
 tools/Unix.mk                                  |  1 +
 tools/board_romfs_mkpasswd.sh                  | 45 +++++++++++++++++
 tools/update_romfs_password.sh                 | 69 ++++++++++++++++----------
 12 files changed, 268 insertions(+), 45 deletions(-)

diff --git a/Documentation/applications/nsh/commands.rst 
b/Documentation/applications/nsh/commands.rst
index f1d80040457..d1477e958df 100644
--- a/Documentation/applications/nsh/commands.rst
+++ b/Documentation/applications/nsh/commands.rst
@@ -1833,6 +1833,71 @@ Option                           Purpose
   nsh$ whoami
   testuser
 
+.. _cmdsudo:
+
+``sudo`` Run a Command as Root (setuid helper)
+==============================================
+
+**Command Syntax**::
+
+  sudo <command> [args...]
+
+**Synopsis**. Run a single command with root privileges using a
+Linux-style setuid-root helper program (``CONFIG_SYSTEM_SUDO``).  The
+kernel raises the effective UID to the file owner when the ``sudo`` ELF
+is loaded (``S_ISUID`` via ``nx_mode`` in the application build).
+``sudo`` then:
+
+1. Identifies the invoking user from the real UID (``getuid()``).
+2. Checks that user against the sudoers allowlist (``/etc/sudoers`` and/or
+   ``CONFIG_SYSTEM_SUDO_ALLOWED_USERS``).  Real UID 0 is always allowed.
+3. Verifies that user's password with ``passwd_verify()`` in userspace.
+4. Calls ``setresuid()`` / ``setresgid()`` / ``initgroups()`` to become
+   fully root.
+5. ``execvp()``s the requested command, replacing the ``sudo`` process.
+
+Unlike the NSH ``su`` builtin (which changes the shell session),
+``sudo`` runs one command and exits.  After a hard credential drop
+(``setuid()`` to a non-zero user), unprivileged code cannot call
+``seteuid(0)``; executing the setuid ``sudo`` binary is the supported
+way to regain root for a single command.
+
+**Requirements**
+
+.. list-table::
+   :header-rows: 1
+   :widths: 60 40
+
+   * - Option
+     - Purpose
+   * - ``CONFIG_SCHED_USER_IDENTITY``
+     - UID/GID tracking and setuid-on-exec
+   * - ``CONFIG_FSUTILS_PASSWD``
+     - ``passwd_verify()`` password check
+   * - ``CONFIG_LIBC_EXECFUNCS``
+     - Load the ``sudo`` ELF (not builtin main)
+   * - ``CONFIG_SYSTEM_SUDO``
+     - Build and install the setuid helper
+   * - ``CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE``
+     - Unprivileged ``user`` plus ``/etc/sudoers``
+   * - ``CONFIG_EXAMPLES_HELLO_RESTRICTED``
+     - ``/bin/hello`` as ``-rwxr--r--`` root
+
+**Example** (login as root, then drop to a sudoers user)::
+
+  nsh# id
+  uid=0(root) gid=0(root)
+  nsh# ls -l /bin/sudo
+   -rwsr-xr-x    root     root            0 /bin/sudo
+  nsh# ls -l /bin/hello
+   -rwxr--r--    root     root            0 /bin/hello
+  nsh# su user
+  nsh$ /bin/hello
+  nsh: /bin/hello: Permission denied
+  nsh$ sudo /bin/hello
+  [sudo] password for user:
+  Hello, World!!
+
 .. _cmdtelnetd:
 
 ``telnetd`` Time Start the Telnet Daemon
diff --git a/Documentation/components/tools/index.rst 
b/Documentation/components/tools/index.rst
index a3c5a446eb1..294e4b0a6dc 100644
--- a/Documentation/components/tools/index.rst
+++ b/Documentation/components/tools/index.rst
@@ -103,11 +103,18 @@ Kconfig
    CONFIG_CRYPTO_CRYPTODEV=y
    CONFIG_BOARD_ETC_ROMFS_PASSWD_USER="root"
    CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD="<secret>"
+   CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE=y
    CONFIG_FSUTILS_PASSWD_PBKDF2_ITERATIONS=10000
 
-``make savedefconfig`` omits ``CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD`` and
+``make savedefconfig`` omits ``CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD``,
+``CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD``, and
 ``CONFIG_FSUTILS_PASSWD_PBKDF2_ITERATIONS`` to avoid leaking credentials.
 
+With ``CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE``, ``mkpasswd`` appends a
+second account (default ``user``, UID 1000).  By default that account
+reuses the root password.  ``CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_SUDOERS``
+also writes ``/etc/sudoers`` listing ``root`` and the extra user.
+
 Host files
 ~~~~~~~~~~
 
diff --git a/Documentation/implementation/user_identity.rst 
b/Documentation/implementation/user_identity.rst
index e7fe651069a..ffb08aee3b5 100644
--- a/Documentation/implementation/user_identity.rst
+++ b/Documentation/implementation/user_identity.rst
@@ -120,6 +120,18 @@ Hard drop (clear saved-root)::
 ``setresgid()`` requires effective UID zero to assign arbitrary GIDs.
 Change group IDs before dropping the effective UID.
 
+Setuid-on-exec
+================
+
+When ``binfmt`` loads an executable with the set-user-ID bit set
+(``S_ISUID`` in ``nx_mode``), the new task group's effective and saved
+UIDs become the file owner's UID while the real UID remains the caller's.
+This is the mechanism used by the setuid-root ``sudo`` helper
+(``CONFIG_SYSTEM_SUDO``); see :ref:`cmdsudo`.  A valid test logs in as
+root, drops to an unprivileged sudoers account (``su user``), confirms
+that account cannot exec a root-only binary, then runs that binary
+through ``sudo``.
+
 Configuration
 =============
 
diff --git a/boards/Kconfig b/boards/Kconfig
index 0eca78c8a96..784b2c06286 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -5741,4 +5741,55 @@ config BOARD_ETC_ROMFS_PASSWD_HOME
        string "Root home directory"
        default "/"
 
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE
+       bool "Add an unprivileged user to /etc/passwd"
+       default n
+       ---help---
+               Append a second passwd entry (default name ``user``, UID/GID
+               1000) so ``su user`` works on ROMFS-backed /etc/passwd.
+               Needed for a valid setuid sudo test: drop to this user, then
+               run ``sudo``.
+
+if BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_USER
+       string "Extra username"
+       default "user"
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_UID
+       int "Extra user ID"
+       default 1000
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_GID
+       int "Extra group ID"
+       default 1000
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_HOME
+       string "Extra user home directory"
+       default "/"
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_USE_ROOT_PASSWORD
+       bool "Use the root password for the extra user"
+       default y
+       ---help---
+               If enabled, the extra user gets the same password as root.
+               Disable to set CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD
+               or NUTTX_ROMFS_PASSWD_EXTRA_PASSWORD separately.
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD
+       string "Extra user password (required if not using the root password)"
+       depends on !BOARD_ETC_ROMFS_PASSWD_EXTRA_USE_ROOT_PASSWORD
+       ---help---
+               Hashed at build time; not stored in firmware and not saved in
+               defconfig.  Same complexity rules as the root password.
+
+config BOARD_ETC_ROMFS_PASSWD_EXTRA_SUDOERS
+       bool "Install /etc/sudoers allowing the extra user"
+       default y
+       ---help---
+               Write /etc/sudoers with ``root`` and the extra username so
+               ``CONFIG_SYSTEM_SUDO`` can authorize that account.
+
+endif # BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE
+
 endif # BOARD_ETC_ROMFS_PASSWD_ENABLE
diff --git a/cmake/nuttx_add_application.cmake 
b/cmake/nuttx_add_application.cmake
index 131808739b5..4864eaedbd6 100644
--- a/cmake/nuttx_add_application.cmake
+++ b/cmake/nuttx_add_application.cmake
@@ -95,6 +95,9 @@ function(nuttx_add_application)
     STACKSIZE
     MODULE
     DYNLIB
+    UID
+    GID
+    MODE
     MULTI_VALUE
     COMPILE_FLAGS
     LINK_FLAGS
diff --git a/cmake/nuttx_add_romfs.cmake b/cmake/nuttx_add_romfs.cmake
index 7633872d037..d26bdfbfd02 100644
--- a/cmake/nuttx_add_romfs.cmake
+++ b/cmake/nuttx_add_romfs.cmake
@@ -366,22 +366,31 @@ function(process_all_directory_romfs)
     endif()
 
     set(GENPASSWD_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/etc/passwd)
+    set(GENPASSWD_OUTPUTS ${GENPASSWD_OUTPUT})
+    if(CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE
+       AND CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_SUDOERS)
+      set(GENSUDOERS_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/etc/sudoers)
+      list(APPEND GENPASSWD_OUTPUTS ${GENSUDOERS_OUTPUT})
+    endif()
+
     add_custom_command(
-      OUTPUT ${GENPASSWD_OUTPUT}
+      OUTPUT ${GENPASSWD_OUTPUTS}
       COMMAND ${CMAKE_COMMAND} -E make_directory 
${CMAKE_CURRENT_BINARY_DIR}/etc
       COMMAND
-        ${MKPASSWD_BIN} --user "${CONFIG_BOARD_ETC_ROMFS_PASSWD_USER}"
-        --password "${CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD}" --uid
+        ${NUTTX_POSIX_SHELL} ${NUTTX_DIR}/tools/board_romfs_mkpasswd.sh
+        ${NUTTX_DIR} ${CMAKE_CURRENT_BINARY_DIR}/.romfs_passwd.txt
+        ${MKPASSWD_BIN} ${GENPASSWD_OUTPUT} --user
+        "${CONFIG_BOARD_ETC_ROMFS_PASSWD_USER}" --uid
         ${CONFIG_BOARD_ETC_ROMFS_PASSWD_UID} --gid
         ${CONFIG_BOARD_ETC_ROMFS_PASSWD_GID} --home
-        "${CONFIG_BOARD_ETC_ROMFS_PASSWD_HOME}" --iterations
-        ${MKPASSWD_ITERATIONS} -o ${GENPASSWD_OUTPUT}
+        "${CONFIG_BOARD_ETC_ROMFS_PASSWD_HOME}"
       DEPENDS ${MKPASSWD_BIN} ${NUTTX_DIR}/.config
+              ${NUTTX_DIR}/tools/board_romfs_mkpasswd.sh
       COMMENT "Generating /etc/passwd with PBKDF2 hash")
 
-    add_custom_target(generate_passwd DEPENDS ${GENPASSWD_OUTPUT})
+    add_custom_target(generate_passwd DEPENDS ${GENPASSWD_OUTPUTS})
     add_dependencies(generate_passwd build_host_mkpasswd)
-    list(APPEND RCRAWS ${GENPASSWD_OUTPUT})
+    list(APPEND RCRAWS ${GENPASSWD_OUTPUTS})
     list(APPEND dyn_deps generate_passwd)
   endif()
 
diff --git a/cmake/savedefconfig.cmake b/cmake/savedefconfig.cmake
index db6742a3621..aef701e6bf8 100644
--- a/cmake/savedefconfig.cmake
+++ b/cmake/savedefconfig.cmake
@@ -77,7 +77,8 @@ foreach(LINE IN LISTS LINES)
   decode_brackets(LINE)
   decode_semicolon(LINE)
   if(NOT "${LINE}" MATCHES "^CONFIG_FSUTILS_PASSWD_PBKDF2_ITERATIONS="
-     AND NOT "${LINE}" MATCHES "^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD=")
+     AND NOT "${LINE}" MATCHES "^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD="
+     AND NOT "${LINE}" MATCHES 
"^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD=")
     file(APPEND ${OUTPUT_FILE} "${LINE}\n")
   endif()
 endforeach()
diff --git a/fs/binfs/fs_binfs.c b/fs/binfs/fs_binfs.c
index f65409b4e88..d9152e80803 100644
--- a/fs/binfs/fs_binfs.c
+++ b/fs/binfs/fs_binfs.c
@@ -279,9 +279,16 @@ static int binfs_fstat(FAR const struct file *filep, FAR 
struct stat *buf)
 {
   DEBUGASSERT(buf != NULL);
 
-  /* It's a execute-only file system */
+#ifdef CONFIG_SCHED_USER_IDENTITY
+  int index = (int)((uintptr_t)filep->f_priv);
+
+  buf->st_uid  = builtin_getuid(index);
+  buf->st_gid  = builtin_getgid(index);
+  buf->st_mode = S_IFREG | (builtin_getmode(index) & ~S_IFMT);
+#else
+  buf->st_mode = S_IFREG | S_IXOTH | S_IXGRP | S_IXUSR;
+#endif
 
-  buf->st_mode    = S_IFREG | S_IXOTH | S_IXGRP | S_IXUSR;
   buf->st_size    = 0;
   buf->st_blksize = 0;
   buf->st_blocks  = 0;
@@ -491,12 +498,12 @@ static int binfs_stat(FAR struct inode *mountpt, FAR 
const char *relpath,
 
       /* It's a execute-only file name */
 
-      buf->st_mode = S_IFREG | S_IXOTH | S_IXGRP | S_IXUSR;
-
 #ifdef CONFIG_SCHED_USER_IDENTITY
-      buf->st_uid   = builtin_getuid(index);
-      buf->st_gid   = builtin_getgid(index);
-      buf->st_mode |= builtin_getmode(index);
+      buf->st_uid  = builtin_getuid(index);
+      buf->st_gid  = builtin_getgid(index);
+      buf->st_mode = S_IFREG | (builtin_getmode(index) & ~S_IFMT);
+#else
+      buf->st_mode = S_IFREG | S_IXOTH | S_IXGRP | S_IXUSR;
 #endif
     }
   else
diff --git a/sched/environ/env_secureexec.c b/sched/environ/env_secureexec.c
index b886bca1443..5315f496c14 100644
--- a/sched/environ/env_secureexec.c
+++ b/sched/environ/env_secureexec.c
@@ -71,12 +71,17 @@ static bool env_is_unsafe(FAR const char *pair)
 
   for (name = names; *name != NULL; name++)
     {
-      if (strncmp(pair, *name, strlen(*name)) == 0)
+      if (pair != NULL && strncmp(pair, *name, strlen(*name)) == 0)
         {
           return true;
         }
     }
 
+  if (pair == NULL)
+    {
+      return false;
+    }
+
   return strncmp(pair, "LD_", 3) == 0 ||
          strncmp(pair, "MALLOC_", 7) == 0;
 }
@@ -102,7 +107,9 @@ void env_sanitize_secure(FAR struct task_group_s *group)
 
   for (index = group->tg_envc - 1; index >= 0; )
     {
-      if (env_is_unsafe(group->tg_envp[index]))
+      FAR char *pair = group->tg_envp[index];
+
+      if (pair != NULL && env_is_unsafe(pair))
         {
           env_removevar(group, index);
         }
diff --git a/tools/Unix.mk b/tools/Unix.mk
index 625772aaae8..06cef9522c4 100644
--- a/tools/Unix.mk
+++ b/tools/Unix.mk
@@ -793,6 +793,7 @@ savedefconfig: apps_preconfig
        $(Q) $(call kconfig_tweak_disable,defconfig.tmp,CONFIG_BASE_DEFCONFIG)
        $(Q) sed -i.bak -e '/^CONFIG_FSUTILS_PASSWD_PBKDF2_ITERATIONS=/d' 
defconfig.tmp
        $(Q) sed -i.bak -e '/^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD=/d' 
defconfig.tmp
+       $(Q) sed -i.bak -e '/^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD=/d' 
defconfig.tmp
        $(Q) grep "CONFIG_ARCH=" .config >> defconfig.tmp
        $(Q) grep "^CONFIG_ARCH_CHIP_" .config >> defconfig.tmp; true
        $(Q) grep "CONFIG_ARCH_CHIP=" .config >> defconfig.tmp; true
diff --git a/tools/board_romfs_mkpasswd.sh b/tools/board_romfs_mkpasswd.sh
index 2256bf91c98..b6e365c19cb 100755
--- a/tools/board_romfs_mkpasswd.sh
+++ b/tools/board_romfs_mkpasswd.sh
@@ -60,3 +60,48 @@ PASSWORD=$(cat "${PASSFILE}")
   --iterations "${ITERATIONS}" \
   "$@" -o "${OUTPUT}"
 rm -f "${PASSFILE}"
+
+EXTRA_ENABLE=$(grep "^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE=y" \
+  "${CONFIG_FILE}" 2>/dev/null || true)
+
+if [ -n "${EXTRA_ENABLE}" ]; then
+  EXTRA_USER=$(read_int_config CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_USER user)
+  EXTRA_UID=$(read_int_config CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_UID 1000)
+  EXTRA_GID=$(read_int_config CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_GID 1000)
+  EXTRA_HOME=$(read_int_config CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_HOME /)
+  EXTRA_LINE="${OUTPUT}.extra"
+  EXTRA_PASS="${PASSWORD}"
+
+  if ! grep -q "^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_USE_ROOT_PASSWORD=y" \
+      "${CONFIG_FILE}" 2>/dev/null; then
+    "${TOPDIR}/tools/promptpasswd.sh" \
+      --min 8 \
+      --config CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD \
+      --config-file "${CONFIG_FILE}" \
+      --update-config \
+      --prompt "ROMFS extra user password (min 8 characters): " \
+      --output-file "${PASSFILE}"
+    EXTRA_PASS=$(cat "${PASSFILE}")
+    rm -f "${PASSFILE}"
+  fi
+
+  "${MKPASSWD}" --password "${EXTRA_PASS}" \
+    --iterations "${ITERATIONS}" \
+    --user "${EXTRA_USER}" \
+    --uid "${EXTRA_UID}" \
+    --gid "${EXTRA_GID}" \
+    --home "${EXTRA_HOME}" \
+    -o "${EXTRA_LINE}"
+  cat "${EXTRA_LINE}" >> "${OUTPUT}"
+  rm -f "${EXTRA_LINE}"
+
+  if grep -q "^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_SUDOERS=y" \
+      "${CONFIG_FILE}" 2>/dev/null; then
+    SUDOERS="$(dirname "${OUTPUT}")/sudoers"
+    {
+      echo "# NuttX sudo allowlist: one username per line"
+      echo "root"
+      echo "${EXTRA_USER}"
+    } > "${SUDOERS}"
+  fi
+fi
diff --git a/tools/update_romfs_password.sh b/tools/update_romfs_password.sh
index 8e8be3ae42b..17358076a38 100755
--- a/tools/update_romfs_password.sh
+++ b/tools/update_romfs_password.sh
@@ -20,10 +20,12 @@
 #   update_romfs_password.sh <path-to-.config>
 #
 # When CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y and the root password is not
-# set in .config, copy NUTTX_ROMFS_PASSWD_PASSWORD into .config.  This is the
-# supported way to supply build-time credentials that must not live in 
defconfig
-# (CI, automation, local scripts).  No-op when the password is already set or
-# ROMFS passwd generation is disabled.
+# set in .config, copy NUTTX_ROMFS_PASSWD_PASSWORD into .config.  If an extra
+# ROMFS user is enabled without using the root password, also copy
+# NUTTX_ROMFS_PASSWD_EXTRA_PASSWORD.  This is the supported way to supply
+# build-time credentials that must not live in defconfig (CI, automation,
+# local scripts).  No-op when the password is already set or ROMFS passwd
+# generation is disabled.
 
 set -e
 
@@ -43,33 +45,46 @@ if ! grep -q '^CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y' 
"${CONFIG}"; then
   exit 0
 fi
 
-# True when CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD is unset or empty in .config
-get_password() {
-  grep -E '^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD=' "${CONFIG}" 2>/dev/null \
+# Apply a Kconfig string password if the symbol is empty and ENVVAL is set.
+
+apply_password() {
+  symbol=$1
+  envval=$2
+  envname=$3
+  cur=$(grep -E "^${symbol}=" "${CONFIG}" 2>/dev/null \
     | tail -n 1 \
     | sed 's/^[^=]*=//' \
-    | tr -d '"'
-}
+    | tr -d '"')
+  if [ -n "${cur}" ]; then
+    return 0
+  fi
 
-cur=$(get_password)
-if [ -n "${cur}" ]; then
-  exit 0
-fi
+  if [ -z "${envval}" ]; then
+    return 0
+  fi
 
-if [ -z "${PASSWD_ENV}" ]; then
-  exit 0
-fi
+  if [ "${#envval}" -lt 8 ]; then
+    printf 'update_romfs_password: %s must be at least 8 characters\n' \
+      "${envname}" >&2
+    exit 1
+  fi
 
-if [ "${#PASSWD_ENV}" -lt 8 ]; then
-  printf 'update_romfs_password: NUTTX_ROMFS_PASSWD_PASSWORD must be at least 
8 characters\n' >&2
-  exit 1
-fi
+  if command -v kconfig-tweak >/dev/null 2>&1; then
+    kconfig-tweak --file "${CONFIG}" --set-str "${symbol}" "${envval}"
+  else
+    sed -i.bak -e "/^${symbol}=/d" "${CONFIG}"
+    rm -f "${CONFIG}.bak"
+    printf '%s="%s"\n' "${symbol}" "${envval}" >> "${CONFIG}"
+  fi
+}
+
+apply_password CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD \
+  "${PASSWD_ENV}" NUTTX_ROMFS_PASSWD_PASSWORD
 
-if command -v kconfig-tweak >/dev/null 2>&1; then
-  kconfig-tweak --file "${CONFIG}" \
-    --set-str CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD "${PASSWD_ENV}"
-else
-  sed -i.bak -e '/^CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD=/d' "${CONFIG}"
-  rm -f "${CONFIG}.bak"
-  printf 'CONFIG_BOARD_ETC_ROMFS_PASSWD_PASSWORD="%s"\n' "${PASSWD_ENV}" >> 
"${CONFIG}"
+if grep -q '^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_ENABLE=y' "${CONFIG}" &&
+   ! grep -q '^CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_USE_ROOT_PASSWORD=y' \
+     "${CONFIG}"; then
+  apply_password CONFIG_BOARD_ETC_ROMFS_PASSWD_EXTRA_PASSWORD \
+    "${NUTTX_ROMFS_PASSWD_EXTRA_PASSWORD:-}" \
+    NUTTX_ROMFS_PASSWD_EXTRA_PASSWORD
 fi

Reply via email to