]> git.ipfire.org Git - thirdparty/haproxy.git/commit
BUG/MEDIUM: systemd-wrapper: return correct exit codes
authorWilly Tarreau <w@1wt.eu>
Thu, 3 Nov 2016 19:31:40 +0000 (20:31 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 3 Nov 2016 19:34:20 +0000 (20:34 +0100)
commitf7659cb10cb0420c7ca06fad1067207021d2a078
treefe266bbd60e82f327b71d9a187761b0926e0759d
parent9df94c2b25365d8b04aa0f071cb9b5addbead20b
BUG/MEDIUM: systemd-wrapper: return correct exit codes

Gabriele Cerami reported the the exit codes of the systemd-wrapper are
wrong. In short, it directly returns the output of the wait syscall's
status, which is a composite value made of error code an signal numbers.
In general it contains the signal number on the lower bits and the error
code on the higher bits, but exit() truncates it to the lowest 8 bits,
causing config validations to incorrectly report a success. Example :

  $ ./haproxy-systemd-wrapper -c -f /dev/null
  <7>haproxy-systemd-wrapper: executing /tmp/haproxy -c -f /dev/null -Ds
  Configuration file has no error but will not start (no listener) => exit(2).
  <5>haproxy-systemd-wrapper: exit, haproxy RC=512
  $ echo $?
  0

If the process is killed however, the signal number is directly reported
in the exit code.

Let's fix all this to ensure that the exit code matches what the shell does,
which means that codes 0..127 are for exit codes, codes 128..254 for signals,
and code 255 for unknown exit code. Now the return code is correct :

  $ ./haproxy-systemd-wrapper -c -f /dev/null
  <7>haproxy-systemd-wrapper: executing /tmp/haproxy -c -f /dev/null -Ds
  Configuration file has no error but will not start (no listener) => exit(2).
  <5>haproxy-systemd-wrapper: exit, haproxy RC=2
  $ echo $?
  2

  $ ./haproxy-systemd-wrapper -f /tmp/cfg.conf
  <7>haproxy-systemd-wrapper: executing /tmp/haproxy -f /dev/null -Ds
  ^C
  <5>haproxy-systemd-wrapper: exit, haproxy RC=130
  $ echo $?
  130

This fix must be backported to 1.6 and 1.5.
src/haproxy-systemd-wrapper.c