From 73d8a6ab7668173d70adbed45b61be5256c505e1 Mon Sep 17 00:00:00 2001 From: Tony Ambardar Date: Wed, 7 Mar 2018 21:00:45 -0800 Subject: [PATCH] base-files: fix UCI config parsing and callback handling There are several long-standing issues present in the UCI shell API as documented in https://wiki.openwrt.org/doc/devel/config-scripting. They relate both to high-level, user-defined callback functions used to process UCI config files, and also to low-level functions used within scripts generally. The related problems have been encountered now and in the past, e.g. https://forum.openwrt.org/viewtopic.php?id=54295, and include: a) UCI parsing option() function and user-defined option_cb() callbacks being erroneously called during processing of "list" config file entries; b) normal usage of the low-level config_set() unexpectedy calling any defined option_cb() if present; and c) handling of the list_cb() not respecting the NO_CALLBACK variable. Root causes include a function stack "inversion", where the low-level config_set() function incorrectly calls the high-level option() function, intended only for processing the "option" keyword of UCI config files. This change addresses the inversion and other issues, making the option handling code more consistent and smaller, and simplifying developers' usage of UCI callbacks. Signed-off-by: Tony Ambardar Signed-off-by: Hans Dedecker [PKG_RELEASE increase] --- package/base-files/Makefile | 2 +- package/base-files/files/lib/functions.sh | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 7175daec3a..89ee0be315 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk include $(INCLUDE_DIR)/feeds.mk PKG_NAME:=base-files -PKG_RELEASE:=190 +PKG_RELEASE:=191 PKG_FLAGS:=nonshared PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh index 197aef10ef..318e91856b 100755 --- a/package/base-files/files/lib/functions.sh +++ b/package/base-files/files/lib/functions.sh @@ -57,16 +57,16 @@ config () { export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1)) name="${name:-cfg$CONFIG_NUM_SECTIONS}" append CONFIG_SECTIONS "$name" - [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name" export ${NO_EXPORT:+-n} CONFIG_SECTION="$name" - export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype" + config_set "$CONFIG_SECTION" "TYPE" "${cfgtype}" + [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name" } option () { local varname="$1"; shift local value="$*" - export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value" + config_set "$CONFIG_SECTION" "${varname}" "${value}" [ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*" } @@ -81,7 +81,7 @@ list() { config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value" config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len" append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP" - list_cb "$varname" "$*" + [ -n "$NO_CALLBACK" ] || list_cb "$varname" "$*" } config_unset() { @@ -113,11 +113,8 @@ config_set() { local section="$1" local option="$2" local value="$3" - local old_section="$CONFIG_SECTION" - CONFIG_SECTION="$section" - option "$option" "$value" - CONFIG_SECTION="$old_section" + export ${NO_EXPORT:+-n} "CONFIG_${section}_${option}=${value}" } config_foreach() {