base-files: fix prerm return value, align with postinst code
authorTony Ambardar <itugrok@yahoo.com>
Sat, 3 Mar 2018 04:04:36 +0000 (20:04 -0800)
committerJo-Philipp Wich <jo@mein.io>
Thu, 29 Nov 2018 10:52:56 +0000 (11:52 +0100)
The return value of a package prerm script is discarded and not returned
correctly by default_prerm(). This allows other operations like service
shutdown to "leak" their return value, prompting workarounds like commit
48cfc826 which do not address the root cause.

Preserve a package prerm script return value for use by default_prerm(),
sharing the corresponding code from default_postinst() for consistency.
Also use consistent code for handling of /etc/init.d/ scripts.

Run Tested on: LEDE 17.01.4 running ar71xx.

Signed-off-by: Tony Ambardar <itugrok@yahoo.com>
package/base-files/files/lib/functions.sh

index 23598f9c7464456081a542207de884fb7151d58b..50a7b408698cbf5141d65f1f4eaf851c16d84876 100755 (executable)
@@ -152,22 +152,27 @@ config_list_foreach() {
 
 default_prerm() {
        local root="${IPKG_INSTROOT}"
-       local name
+       local pkgname="$(basename ${1%.*})"
+       local ret=0
 
-       name=$(basename ${1%.*})
-       [ -f "$root/usr/lib/opkg/info/${name}.prerm-pkg" ] && . "$root/usr/lib/opkg/info/${name}.prerm-pkg"
+       if [ -f "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" ]; then
+               ( . "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" )
+               ret=$?
+       fi
 
        local shell="$(which bash)"
-       for i in `cat "$root/usr/lib/opkg/info/${name}.list" | grep "^/etc/init.d/"`; do
+       for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
                if [ -n "$root" ]; then
                        ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
                else
                        if [ "$PKG_UPGRADE" != "1" ]; then
                                "$i" disable
                        fi
-                       "$i" stop || /bin/true
+                       "$i" stop
                fi
        done
+
+       return $ret
 }
 
 add_group_and_user() {