machinectl: be more careful when generating machine name from path name

Let's use our new path_extract_filename() for extracting the basename
from a path in a safe fashion.

Let's do this for all our three local import calls.
This commit is contained in:
Lennart Poettering 2018-10-26 16:53:43 +02:00
parent 176a05c24b
commit e288e0599e

View file

@ -2000,28 +2000,38 @@ static int transfer_image_common(sd_bus *bus, sd_bus_message *m) {
return -r; return -r;
} }
static const char *nullify_dash(const char *p) {
if (isempty(p))
return NULL;
if (streq(p, "-"))
return NULL;
return p;
}
static int import_tar(int argc, char *argv[], void *userdata) { static int import_tar(int argc, char *argv[], void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *ll = NULL; _cleanup_free_ char *ll = NULL, *fn = NULL;
_cleanup_close_ int fd = -1;
const char *local = NULL, *path = NULL; const char *local = NULL, *path = NULL;
_cleanup_close_ int fd = -1;
sd_bus *bus = userdata; sd_bus *bus = userdata;
int r; int r;
assert(bus); assert(bus);
if (argc >= 2) if (argc >= 2)
path = argv[1]; path = nullify_dash(argv[1]);
if (isempty(path) || streq(path, "-"))
path = NULL;
if (argc >= 3) if (argc >= 3)
local = argv[2]; local = nullify_dash(argv[2]);
else if (path) else if (path) {
local = basename(path); r = path_extract_filename(path, &fn);
if (isempty(local) || streq(local, "-")) if (r < 0)
local = NULL; return log_error_errno(r, "Cannot extract container name from filename: %m");
local = fn;
}
if (!local) { if (!local) {
log_error("Need either path or local name."); log_error("Need either path or local name.");
return -EINVAL; return -EINVAL;
@ -2069,26 +2079,26 @@ static int import_tar(int argc, char *argv[], void *userdata) {
static int import_raw(int argc, char *argv[], void *userdata) { static int import_raw(int argc, char *argv[], void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *ll = NULL; _cleanup_free_ char *ll = NULL, *fn = NULL;
_cleanup_close_ int fd = -1;
const char *local = NULL, *path = NULL; const char *local = NULL, *path = NULL;
_cleanup_close_ int fd = -1;
sd_bus *bus = userdata; sd_bus *bus = userdata;
int r; int r;
assert(bus); assert(bus);
if (argc >= 2) if (argc >= 2)
path = argv[1]; path = nullify_dash(argv[1]);
if (isempty(path) || streq(path, "-"))
path = NULL;
if (argc >= 3) if (argc >= 3)
local = argv[2]; local = nullify_dash(argv[2]);
else if (path) else if (path) {
local = basename(path); r = path_extract_filename(path, &fn);
if (isempty(local) || streq(local, "-")) if (r < 0)
local = NULL; return log_error_errno(r, "Cannot extract container name from filename: %m");
local = fn;
}
if (!local) { if (!local) {
log_error("Need either path or local name."); log_error("Need either path or local name.");
return -EINVAL; return -EINVAL;
@ -2136,25 +2146,26 @@ static int import_raw(int argc, char *argv[], void *userdata) {
static int import_fs(int argc, char *argv[], void *userdata) { static int import_fs(int argc, char *argv[], void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_close_ int fd = -1;
const char *local = NULL, *path = NULL; const char *local = NULL, *path = NULL;
_cleanup_free_ char *fn = NULL;
_cleanup_close_ int fd = -1;
sd_bus *bus = userdata; sd_bus *bus = userdata;
int r; int r;
assert(bus); assert(bus);
if (argc >= 2) if (argc >= 2)
path = argv[1]; path = nullify_dash(argv[1]);
if (isempty(path) || streq(path, "-"))
path = NULL;
if (argc >= 3) if (argc >= 3)
local = argv[2]; local = nullify_dash(argv[2]);
else if (path) else if (path) {
local = basename(path); r = path_extract_filename(path, &fn);
if (isempty(local) || streq(local, "-")) if (r < 0)
local = NULL; return log_error_errno(r, "Cannot extract container name from filename: %m");
local = fn;
}
if (!local) { if (!local) {
log_error("Need either path or local name."); log_error("Need either path or local name.");
return -EINVAL; return -EINVAL;