[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] libxl: Add libxl__prepare_sockaddr_un() helper
commit 0beaf66e4f6d33bcbc47e740a168534f8727ef8d Author: Anthony PERARD <anthony.perard@xxxxxxxxxx> AuthorDate: Tue Jul 24 12:31:58 2018 +0100 Commit: Anthony PERARD <anthony.perard@xxxxxxxxxx> CommitDate: Tue Aug 21 11:57:50 2018 +0100 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 <anthony.perard@xxxxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/libxl_internal.h | 4 ++++ tools/libxl/libxl_qmp.c | 10 ++++------ tools/libxl/libxl_utils.c | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) 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 <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> +#include <sys/un.h> #include <sys/file.h> #include <sys/ioctl.h> @@ -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 -- generated by git-patchbot for /home/xen/git/xen.git#staging _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |