Hi Mert,

On 10.07.2019 at 17:47, Mert Dirik wrote:
After upgrading to Debian 10 we noticed a slightly different behaviour
in  /lib/lsb/init-functions.d/40-systemd which caused one of our scripts
to break and which also causes some /etc/init.d files like
/etc/init.d/mysql
to no longer to display their help text when calling them without a
parameter.

The root cause are accesses to the $1 and $2 variables without checking
if they are defined beforehand. When running code using "set -u", this
causes the above mentioned error.

Which command did you use to make that happen? I'm asking because I
can't test it right now.

To wit:

 root@kvm1:~# /etc/init.d/rsync
 Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart|status}

vs.

 root@kvm1:~# /etc/init.d/mysql
 /lib/lsb/init-functions.d/40-systemd: line 11: 1: unbound variable


[Suggested patch]

It seems OK.

What I'd rather do is drop the "##*/" substitution, and set a default
value if $1 is unset, and let the statement continue:

          executable="$__init_d_script_name"
          argument="$1"
      elif [ "${0##*/}" = "init-d-script" ] ||
-         [ "${0##*/}" = "${1##*/}" ]; then # scripts run with old
init-d-script
+         [ "${0}" = "${1:-}" ]; then # scripts run with old  init-d-script
          executable="$1"
-        argument="$2"
+        argument="${2:-}"
      else # plain old scripts
          executable="$0"
          argument="$1"

Dropping the "##*/" substitution isn't actually related to this change
but dropping it allows the use of ":-" syntax in the same line. I was
in fact thinking about dropping it irrelevant to this issue.


Another important issue here is the use of "set -e" and "set -u" on
the /etc/init.d/mysql script. It is ineffective right now because
later in 40-systemd file they are set back to their defaults (set +e
and set +u). I don't know the policy or best practices about this
topic but either one of the scripts should be accommodated to be in
compliance with the other.

I'm sorry I can't test any of this right now as I don't have a
suitable and up-to-date test system ready and I'm not sure when I'll
be.


In this case, line 16 has to be changed to 'argument="${1:-}', too (last line of your patch), since the call without argument falls through to the else branch, i.e.

    # diff -C1 40-systemd.orig 40-systemd
    *** 40-systemd.orig     2019-07-09 16:27:19.380695186 +0200
    --- 40-systemd  2019-07-11 16:58:33.113302048 +0200
    ***************
    *** 10,17 ****
          elif [ "${0##*/}" = "init-d-script" ] ||
    !          [ "${0##*/}" = "${1##*/}" ]; then # scripts run with old  init-d-script
          executable="$1"
    !         argument="$2"
          else # plain old scripts
          executable="$0"
    !         argument="$1"
          fi
    --- 10,17 ----
          elif [ "${0##*/}" = "init-d-script" ] ||
    !          [ "${0}" = "${1:-}" ]; then # scripts run with old init-d-script
          executable="$1"
    !         argument="${2:-}"
          else # plain old scripts
          executable="$0"
    !         argument="${1:-}"
          fi


Behaviour after the change:

 # /etc/init.d/mysql
 Usage: /etc/init.d/mysql start|stop|restart|reload|force-reload|status|bootstrap


HTH,
Thomas

_______________________________________________
Pkg-systemd-maintainers mailing list
Pkg-systemd-maintainers@alioth-lists.debian.net
https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/pkg-systemd-maintainers

Reply via email to