{
struct lxc_list *it;
- if (!criu_version_ok(criu_version))
- return false;
-
if (geteuid()) {
ERROR("Must be root to checkpoint");
return false;
}
+ if (!criu_version_ok(criu_version))
+ return false;
+
/* We only know how to restore containers with veth networks. */
lxc_list_for_each(it, &c->lxc_conf->network) {
struct lxc_netdev *n = it->elem;
break;
default:
ERROR("Found un-dumpable network: %s (%s)", lxc_net_type_to_str(n->type), n->name);
+ if (criu_version) {
+ free(*criu_version);
+ *criu_version = NULL;
+ }
return false;
}
}
ret = pipe(criuout);
if (ret < 0) {
SYSERROR("pipe() failed");
+ free(criu_version);
return false;
}
if (w == -1) {
SYSERROR("waitpid");
close(criuout[0]);
+ free(criu_version);
return false;
}
if (!ret)
ERROR("criu output: %s", buf);
+
+ free(criu_version);
return ret;
}
fail:
int pipefd[2];
char *criu_version = NULL;
- if (!criu_ok(c, &criu_version))
- return false;
-
if (geteuid()) {
ERROR("Must be root to restore");
return false;
return false;
}
+ if (!criu_ok(c, &criu_version)) {
+ close(pipefd[0]);
+ close(pipefd[1]);
+ return false;
+ }
+
pid = fork();
if (pid < 0) {
close(pipefd[0]);
close(pipefd[1]);
+ free(criu_version);
return false;
}
}
close(pipefd[1]);
+ free(criu_version);
nread = read(pipefd[0], &status, sizeof(status));
close(pipefd[0]);