Fix rsync exit handling in create mode.
authorAndre Noll <maan@tuebingen.mpg.de>
Mon, 13 Jun 2016 15:54:37 +0000 (17:54 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 24 Jun 2016 14:17:16 +0000 (16:17 +0200)
The logic in handle_rsync_exit() is horribly broken in case dss is
run in create mode and the rsync process terminates unsuccessfully.

First we claim to restart rsync, which is wrong. Next we call the
post-create hook despite the documentation says that this hook is
only run on *successful* termination. Finally, we dereference a NULL
pointer to print the path of the snapshot.

Fortunately, all three issues are easy to fix by special casing create
mode in handle_rsync_exit().

dss.c

diff --git a/dss.c b/dss.c
index bdbdd04..0bc8913 100644 (file)
--- a/dss.c
+++ b/dss.c
@@ -862,6 +862,10 @@ static int handle_rsync_exit(int status)
        if (es != 0 && es != 24) {
                DSS_WARNING_LOG(("rsync exit code %d, error count %d\n",
                        es, ++num_consecutive_rsync_errors));
+               if (conf.create_given) {
+                       ret = -E_BAD_EXIT_CODE;
+                       goto out;
+               }
                if (num_consecutive_rsync_errors > conf.max_rsync_errors_arg) {
                        ret = -E_TOO_MANY_RSYNC_ERRORS;
                        snapshot_creation_status = HS_READY;