Skip to content

Commit

Permalink
migration/rdma: Fix rdma_getaddrinfo() error checking
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Markus Armbruster authored and Juan Quintela committed Oct 11, 2023
1 parent 0110c6b commit 0724982
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions migration/rdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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;
}
Expand Down Expand Up @@ -1004,7 +1004,6 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
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);
Expand All @@ -1025,7 +1024,6 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
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);
Expand All @@ -1040,7 +1038,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
err_resolve_create_id:
rdma_destroy_event_channel(rdma->channel);
rdma->channel = NULL;
return ret;
return -1;
}

/*
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -2739,7 +2737,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
rdma_destroy_event_channel(rdma->channel);
rdma->channel = NULL;
rdma->error_state = ret;
return ret;
return -1;

}

Expand Down

0 comments on commit 0724982

Please sign in to comment.