migration/rdma: Fix rdma_getaddrinfo() error checking
rdma_getaddrinfo() returns 0 on success. On error, it returns one of the EAI_ error codes like getaddrinfo() does, or -1 with errno set. This is broken by design: POSIX implicitly specifies the EAI_ error codes to be non-zero, no more. They could clash with -1. Nothing we can do about this design flaw. Both callers of rdma_getaddrinfo() only recognize negative values as error. Works only because systems elect to make the EAI_ error codes negative. Best not to rely on that: change the callers to treat any non-zero value as failure. Also change them to return -1 instead of the value received from getaddrinfo() on failure, to avoid positive error values. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Li Zhijian <lizhijian@fujitsu.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> Message-ID: <20230928132019.2544702-25-armbru@redhat.com>
This commit is contained in:
parent
0110c6b86a
commit
0724982221
@ -941,14 +941,14 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
|
||||
|
||||
if (rdma->host == NULL || !strcmp(rdma->host, "")) {
|
||||
ERROR(errp, "RDMA hostname has not been set");
|
||||
return -EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* create CM channel */
|
||||
rdma->channel = rdma_create_event_channel();
|
||||
if (!rdma->channel) {
|
||||
ERROR(errp, "could not create CM channel");
|
||||
return -EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* create CM id */
|
||||
@ -962,7 +962,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
|
||||
port_str[15] = '\0';
|
||||
|
||||
ret = rdma_getaddrinfo(rdma->host, port_str, NULL, &res);
|
||||
if (ret < 0) {
|
||||
if (ret) {
|
||||
ERROR(errp, "could not rdma_getaddrinfo address %s", rdma->host);
|
||||
goto err_resolve_get_addr;
|
||||
}
|
||||
@ -1004,7 +1004,6 @@ route:
|
||||
rdma_event_str(cm_event->event));
|
||||
error_report("rdma_resolve_addr");
|
||||
rdma_ack_cm_event(cm_event);
|
||||
ret = -EINVAL;
|
||||
goto err_resolve_get_addr;
|
||||
}
|
||||
rdma_ack_cm_event(cm_event);
|
||||
@ -1025,7 +1024,6 @@ route:
|
||||
ERROR(errp, "result not equal to event_route_resolved: %s",
|
||||
rdma_event_str(cm_event->event));
|
||||
rdma_ack_cm_event(cm_event);
|
||||
ret = -EINVAL;
|
||||
goto err_resolve_get_addr;
|
||||
}
|
||||
rdma_ack_cm_event(cm_event);
|
||||
@ -1040,7 +1038,7 @@ err_resolve_get_addr:
|
||||
err_resolve_create_id:
|
||||
rdma_destroy_event_channel(rdma->channel);
|
||||
rdma->channel = NULL;
|
||||
return ret;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2695,7 +2693,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
|
||||
port_str[15] = '\0';
|
||||
|
||||
ret = rdma_getaddrinfo(rdma->host, port_str, NULL, &res);
|
||||
if (ret < 0) {
|
||||
if (ret) {
|
||||
ERROR(errp, "could not rdma_getaddrinfo address %s", rdma->host);
|
||||
goto err_dest_init_bind_addr;
|
||||
}
|
||||
@ -2739,7 +2737,7 @@ err_dest_init_create_listen_id:
|
||||
rdma_destroy_event_channel(rdma->channel);
|
||||
rdma->channel = NULL;
|
||||
rdma->error_state = ret;
|
||||
return ret;
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user