mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
Better error reporting for failed migration
If the hostname as returned by "gethostname" resolves to "localhost" (as it does with the broken Fedora-12 installer), then live migration will fail because the source will try to migrate to itself. Detect this situation up-front and abort the live migration before we do any real work. * src/util/util.h src/util/util.c: add a new virGetHostnameLocalhost with an optional localhost check, and rewire virGetHostname() to use it * src/libvirt_private.syms: expose the new function * src/qemu/qemu_driver.c: use it in qemudDomainMigratePrepare2()
This commit is contained in:
parent
8ba9e794e6
commit
b97c24b2e1
@ -565,6 +565,7 @@ virExecDaemonize;
|
||||
virSetCloseExec;
|
||||
virSetNonBlock;
|
||||
virFormatMacAddr;
|
||||
virGetHostnameLocalhost;
|
||||
virGetHostname;
|
||||
virParseMacAddr;
|
||||
virFileDeletePid;
|
||||
|
@ -7748,7 +7748,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
|
||||
if (port == QEMUD_MIGRATION_NUM_PORTS) port = 0;
|
||||
|
||||
/* Get hostname */
|
||||
if ((hostname = virGetHostname(dconn)) == NULL)
|
||||
if ((hostname = virGetHostnameLocalhost(0)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
/* XXX this really should have been a properly well-formed
|
||||
|
@ -2263,11 +2263,11 @@ char *virIndexToDiskName(int idx, const char *prefix)
|
||||
#define AI_CANONIDN 0
|
||||
#endif
|
||||
|
||||
char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
|
||||
char *virGetHostnameLocalhost(int allow_localhost)
|
||||
{
|
||||
int r;
|
||||
char hostname[HOST_NAME_MAX+1], *result;
|
||||
struct addrinfo hints, *info;
|
||||
struct addrinfo hints, *info, *res;
|
||||
|
||||
r = gethostname (hostname, sizeof(hostname));
|
||||
if (r == -1) {
|
||||
@ -2287,6 +2287,34 @@ char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
|
||||
hostname, gai_strerror(r));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* if we aren't allowing localhost, then we iterate through the
|
||||
* list and make sure none of the IPv4 addresses are 127.0.0.1 and
|
||||
* that none of the IPv6 addresses are ::1
|
||||
*/
|
||||
if (!allow_localhost) {
|
||||
res = info;
|
||||
while (res) {
|
||||
if (res->ai_family == AF_INET) {
|
||||
if (htonl(((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr) == INADDR_LOOPBACK) {
|
||||
virUtilError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("canonical hostname pointed to localhost, but this is not allowed"));
|
||||
freeaddrinfo(info);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else if (res->ai_family == AF_INET6) {
|
||||
if (IN6_IS_ADDR_LOOPBACK(&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr)) {
|
||||
virUtilError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("canonical hostname pointed to localhost, but this is not allowed"));
|
||||
freeaddrinfo(info);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
res = res->ai_next;
|
||||
}
|
||||
}
|
||||
|
||||
if (info->ai_canonname == NULL) {
|
||||
virUtilError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("could not determine canonical host name"));
|
||||
@ -2303,6 +2331,11 @@ char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
|
||||
return result;
|
||||
}
|
||||
|
||||
char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return virGetHostnameLocalhost(1);
|
||||
}
|
||||
|
||||
/* send signal to a single process */
|
||||
int virKillProcess(pid_t pid, int sig)
|
||||
{
|
||||
|
@ -233,6 +233,7 @@ static inline int getuid (void) { return 0; }
|
||||
static inline int getgid (void) { return 0; }
|
||||
#endif
|
||||
|
||||
char *virGetHostnameLocalhost(int allow_localhost);
|
||||
char *virGetHostname(virConnectPtr conn);
|
||||
|
||||
int virKillProcess(pid_t pid, int sig);
|
||||
|
Loading…
x
Reference in New Issue
Block a user