From: Anthony PERARD Date: Tue, 24 Jul 2018 11:31:58 +0000 (+0100) Subject: libxl: Add libxl__prepare_sockaddr_un() helper X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~3439 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=0beaf66e4f6d33bcbc47e740a168534f8727ef8d;p=xen.git libxl: Add libxl__prepare_sockaddr_un() helper There is going to be a few more users that want to use UNIX socket, this helper is to prepare the `struct sockaddr_un` and check that the path isn't too long. Also start to use it in libxl_qmp.c. Signed-off-by: Anthony PERARD Reviewed-by: Roger Pau Monné Acked-by: Wei Liu --- diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 843c625142..ab1de80522 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -4420,6 +4421,9 @@ static inline bool libxl__string_is_default(char **s) { return *s == NULL; } + +_hidden int libxl__prepare_sockaddr_un(libxl__gc *gc, struct sockaddr_un *un, + const char *path, const char *what); #endif /* diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 1ffa17b632..7965ee37b9 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -428,6 +428,7 @@ static libxl__qmp_handler *qmp_init_handler(libxl__gc *gc, uint32_t domid) static int qmp_open(libxl__qmp_handler *qmp, const char *qmp_socket_path, int timeout) { + GC_INIT(qmp->ctx); int ret = -1; int i = 0; struct sockaddr_un addr; @@ -447,13 +448,9 @@ static int qmp_open(libxl__qmp_handler *qmp, const char *qmp_socket_path, goto out; } - if (sizeof(addr.sun_path) <= strlen(qmp_socket_path)) { - ret = -1; + ret = libxl__prepare_sockaddr_un(gc, &addr, qmp_socket_path, "QMP socket"); + if (ret) goto out; - } - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, qmp_socket_path, sizeof(addr.sun_path)); do { ret = connect(qmp->qmp_fd, (struct sockaddr *) &addr, sizeof(addr)); @@ -471,6 +468,7 @@ static int qmp_open(libxl__qmp_handler *qmp, const char *qmp_socket_path, out: if (ret == -1 && qmp->qmp_fd > -1) close(qmp->qmp_fd); + GC_FREE; return ret; } diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 507ee56c7c..5854717b11 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -1234,6 +1234,21 @@ int libxl__random_bytes(libxl__gc *gc, uint8_t *buf, size_t len) return ret; } +int libxl__prepare_sockaddr_un(libxl__gc *gc, + struct sockaddr_un *un, const char *path, + const char *what) +{ + if (sizeof(un->sun_path) <= strlen(path)) { + LOG(ERROR, "UNIX socket path '%s' is too long for %s", path, what); + LOG(DEBUG, "Path must be less than %zu bytes", sizeof(un->sun_path)); + return ERROR_INVAL; + } + memset(un, 0, sizeof(struct sockaddr_un)); + un->sun_family = AF_UNIX; + strncpy(un->sun_path, path, sizeof(un->sun_path)); + return 0; +} + /* * Local variables: * mode: C