X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fimport%2Fimportd.c;h=58807378a7e58e5cc463d71c14f295bb1f8dc8f0;hp=2eef476015281677a5f6e83c02d71924ed53f9db;hb=ce06fdfb3de7a6591041828361f8d10c04a4677e;hpb=c529695e7a30b300fdaa61ace4a8a4ed0e94ad1c diff --git a/src/import/importd.c b/src/import/importd.c index 2eef47601..58807378a 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -20,6 +20,7 @@ ***/ #include +#include #include "sd-bus.h" #include "util.h" @@ -29,8 +30,9 @@ #include "def.h" #include "socket-util.h" #include "mkdir.h" -#include "import-util.h" #include "def.h" +#include "missing.h" +#include "import-util.h" typedef struct Transfer Transfer; typedef struct Manager Manager; @@ -518,12 +520,10 @@ static int manager_on_notify(sd_event_source *s, int fd, uint32_t revents, void return -errno; } + cmsg_close_all(&msghdr); + for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) { - if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { - close_many((int*) CMSG_DATA(cmsg), (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int)); - log_warning("Somebody sent us unexpected fds, ignoring."); - return 0; - } else if (cmsg->cmsg_level == SOL_SOCKET && + if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS && cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) { @@ -643,6 +643,23 @@ static Transfer *manager_find(Manager *m, TransferType type, const char *dkr_ind return NULL; } +static int check_btrfs(sd_bus_error *error) { + struct statfs sfs; + + if (statfs("/var/lib/machines", &sfs) < 0) { + if (errno != ENOENT) + return -errno; + + if (statfs("/var/lib", &sfs) < 0) + return -errno; + } + + if (!F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "/var/lib/machines is not a btrfs file system. Operation is not supported on legacy file systems."); + + return 0; +} + static int method_pull_tar_or_raw(sd_bus *bus, sd_bus_message *msg, void *userdata, sd_bus_error *error) { _cleanup_(transfer_unrefp) Transfer *t = NULL; const char *remote, *local, *verify, *object; @@ -688,6 +705,10 @@ static int method_pull_tar_or_raw(sd_bus *bus, sd_bus_message *msg, void *userda if (v < 0) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown verification mode %s", verify); + r = check_btrfs(error); + if (r < 0) + return r; + type = streq_ptr(sd_bus_message_get_member(msg), "PullTar") ? TRANSFER_TAR : TRANSFER_RAW; if (manager_find(m, type, NULL, remote)) @@ -779,6 +800,10 @@ static int method_pull_dkr(sd_bus *bus, sd_bus_message *msg, void *userdata, sd_ if (v != IMPORT_VERIFY_NO) return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "DKR does not support verification."); + r = check_btrfs(error); + if (r < 0) + return r; + if (manager_find(m, TRANSFER_DKR, index_url, remote)) return sd_bus_error_setf(error, BUS_ERROR_TRANSFER_IN_PROGRESS, "Transfer for %s already in progress.", remote);