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().
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;