9462ef6485
- util: improvements in error handling 09877303-virSocketAddrParseInternal.patch, 412afdb8-intro-virSocketAddrParseAny.patch bsc#1080957 - Update to libvirt 4.2.0 - Many incremental improvements and bug fixes, see http://libvirt.org/news.html - Dropped patches: 6b3d716e-keycodemap-py3.patch, 33c6eb96-fix-libvirtd-reload-deadlock.patch, 464889ff-rpc-aquire-ref-dispatch.patch, c6f1d519-rpc-simplify-dispatch.patch, 06e7ebb6-rpc-invoke-dispatch-unlocked.patch, 86cae503-rpc-fix-pre-exec.patch, eefabb38-rpc-virtlockd-virtlogd-single-thread.patch, fbf31e1a-CVE-2018-1064.patch, fb327ac2-virtlockd-admin-socket.patch, 64370c4b-libxl-MigrateBegin.patch, 99486799-libxl-MigrateConfirm.patch, f5eacf2a-libxl-MigratePerform.patch, 4e6fcdb6-libxl-libxlDomObjFromDomain-cleanup.patch, fe51dbda-libxl-use-FindByRef.patch, 60b3fcd9-libxl-MigratePrepare.patch, 3c89868c-libxl-lock-after-ListRemove.patch, 13e81fc6-libxl-EndJob-on-error.patch, 594b8b99-libxl-DefineXMLFlags-API-pattern.patch, c66e344e-libxl-dont-deref-NULL.patch, 83edaf44-libxl-dont-hardcode-sched-weight.patch, apibuild-py3.patch OBS-URL: https://build.opensuse.org/request/show/593871 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=683
160 lines
5.6 KiB
Diff
160 lines
5.6 KiB
Diff
commit 412afdb8f4f3f097d6baad3acaeb9e26dfd15836
|
|
Author: Jim Fehlig <jfehlig@suse.com>
|
|
Date: Mon Mar 26 12:53:05 2018 -0600
|
|
|
|
util: introduce virSocketAddrParseAny
|
|
|
|
When preparing for migration, the libxl driver creates a new TCP listen
|
|
socket for the incoming migration by calling virNetSocketNewListenTCP,
|
|
passing the destination host name. virNetSocketNewListenTCP calls
|
|
virSocketAddrParse to check if the host name is a wildcard address, in
|
|
which case it avoids adding the AI_ADDRCONFIG flag to the hints passed to
|
|
getaddrinfo. If the host name is not an IP address, virSocketAddrParse
|
|
reports an error
|
|
|
|
error : virSocketAddrParseInternal:121 : Cannot parse socket address
|
|
'myhost.example.com': Name or service not known
|
|
|
|
But virNetSocketNewListenTCP succeeds regardless and the overall migration
|
|
operation succeeds.
|
|
|
|
Introduce virSocketAddrParseAny and use it when simply testing if a host
|
|
name/addr is parsable.
|
|
|
|
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
|
Reviewed-by: John Ferlan <jferlan@redhat.com>
|
|
|
|
Index: libvirt-4.2.0/src/libvirt_private.syms
|
|
===================================================================
|
|
--- libvirt-4.2.0.orig/src/libvirt_private.syms
|
|
+++ libvirt-4.2.0/src/libvirt_private.syms
|
|
@@ -2725,6 +2725,7 @@ virSocketAddrMask;
|
|
virSocketAddrMaskByPrefix;
|
|
virSocketAddrNumericFamily;
|
|
virSocketAddrParse;
|
|
+virSocketAddrParseAny;
|
|
virSocketAddrParseIPv4;
|
|
virSocketAddrParseIPv6;
|
|
virSocketAddrPrefixToNetmask;
|
|
Index: libvirt-4.2.0/src/rpc/virnetsocket.c
|
|
===================================================================
|
|
--- libvirt-4.2.0.orig/src/rpc/virnetsocket.c
|
|
+++ libvirt-4.2.0/src/rpc/virnetsocket.c
|
|
@@ -333,7 +333,7 @@ int virNetSocketNewListenTCP(const char
|
|
* startup in most cases.
|
|
*/
|
|
if (nodename &&
|
|
- !(virSocketAddrParse(&tmp_addr, nodename, AF_UNSPEC) > 0 &&
|
|
+ !(virSocketAddrParseAny(&tmp_addr, nodename, AF_UNSPEC, false) > 0 &&
|
|
virSocketAddrIsWildcard(&tmp_addr)))
|
|
hints.ai_flags |= AI_ADDRCONFIG;
|
|
|
|
Index: libvirt-4.2.0/src/util/virsocketaddr.c
|
|
===================================================================
|
|
--- libvirt-4.2.0.orig/src/util/virsocketaddr.c
|
|
+++ libvirt-4.2.0/src/util/virsocketaddr.c
|
|
@@ -101,6 +101,7 @@ static int
|
|
virSocketAddrParseInternal(struct addrinfo **res,
|
|
const char *val,
|
|
int family,
|
|
+ int ai_flags,
|
|
bool reportError)
|
|
{
|
|
struct addrinfo hints;
|
|
@@ -114,7 +115,7 @@ virSocketAddrParseInternal(struct addrin
|
|
|
|
memset(&hints, 0, sizeof(hints));
|
|
hints.ai_family = family;
|
|
- hints.ai_flags = AI_NUMERICHOST;
|
|
+ hints.ai_flags = ai_flags;
|
|
if ((err = getaddrinfo(val, NULL, &hints, res)) != 0) {
|
|
if (reportError)
|
|
virReportError(VIR_ERR_SYSTEM_ERROR,
|
|
@@ -143,7 +144,7 @@ int virSocketAddrParse(virSocketAddrPtr
|
|
int len;
|
|
struct addrinfo *res;
|
|
|
|
- if (virSocketAddrParseInternal(&res, val, family, true) < 0)
|
|
+ if (virSocketAddrParseInternal(&res, val, family, AI_NUMERICHOST, true) < 0)
|
|
return -1;
|
|
|
|
if (res == NULL) {
|
|
@@ -163,6 +164,52 @@ int virSocketAddrParse(virSocketAddrPtr
|
|
return len;
|
|
}
|
|
|
|
+/**
|
|
+ * virSocketAddrParseAny:
|
|
+ * @addr: where to store the return value, optional.
|
|
+ * @val: a network host name or a numeric network address IPv4 or IPv6
|
|
+ * @family: address family to pass down to getaddrinfo
|
|
+ * @reportError: boolean to control error reporting
|
|
+ *
|
|
+ * Mostly a wrapper for getaddrinfo() extracting the address storage
|
|
+ * from a host name like acme.example.com or a numeric string like 1.2.3.4
|
|
+ * or 2001:db8:85a3:0:0:8a2e:370:7334.
|
|
+ *
|
|
+ * When @val is a network host name, this function may be susceptible to a
|
|
+ * delay due to potentially lengthy netork host address lookups.
|
|
+ *
|
|
+ * Returns the length of the network address or -1 in case of error.
|
|
+ */
|
|
+int virSocketAddrParseAny(virSocketAddrPtr addr,
|
|
+ const char *val,
|
|
+ int family,
|
|
+ bool reportError)
|
|
+{
|
|
+ int len;
|
|
+ struct addrinfo *res;
|
|
+
|
|
+ if (virSocketAddrParseInternal(&res, val, family, 0, reportError) < 0)
|
|
+ return -1;
|
|
+
|
|
+ if (res == NULL) {
|
|
+ if (reportError) {
|
|
+ virReportError(VIR_ERR_SYSTEM_ERROR,
|
|
+ _("No socket addresses found for '%s'"),
|
|
+ val);
|
|
+ }
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ len = res->ai_addrlen;
|
|
+ if (addr != NULL) {
|
|
+ memcpy(&addr->data.stor, res->ai_addr, len);
|
|
+ addr->len = res->ai_addrlen;
|
|
+ }
|
|
+
|
|
+ freeaddrinfo(res);
|
|
+ return len;
|
|
+}
|
|
+
|
|
/*
|
|
* virSocketAddrParseIPv4:
|
|
* @val: an IPv4 numeric address
|
|
@@ -1105,7 +1152,7 @@ virSocketAddrNumericFamily(const char *a
|
|
struct addrinfo *res;
|
|
unsigned short family;
|
|
|
|
- if (virSocketAddrParseInternal(&res, address, AF_UNSPEC, false) < 0)
|
|
+ if (virSocketAddrParseInternal(&res, address, AF_UNSPEC, AI_NUMERICHOST, false) < 0)
|
|
return -1;
|
|
|
|
family = res->ai_addr->sa_family;
|
|
Index: libvirt-4.2.0/src/util/virsocketaddr.h
|
|
===================================================================
|
|
--- libvirt-4.2.0.orig/src/util/virsocketaddr.h
|
|
+++ libvirt-4.2.0/src/util/virsocketaddr.h
|
|
@@ -92,6 +92,11 @@ int virSocketAddrParse(virSocketAddrPtr
|
|
const char *val,
|
|
int family);
|
|
|
|
+int virSocketAddrParseAny(virSocketAddrPtr addr,
|
|
+ const char *val,
|
|
+ int family,
|
|
+ bool reportError);
|
|
+
|
|
int virSocketAddrParseIPv4(virSocketAddrPtr addr,
|
|
const char *val);
|
|
|