aboutgitcodebugslistschat
path: root/qrap.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2022-07-06 08:02:24 +0200
committerStefano Brivio <sbrivio@redhat.com>2022-07-06 08:10:55 +0200
commit27aec5911a8fd00068c6db8f1a73d61903488b0c (patch)
treecd416c68d041032eea9c6b99cc1437d1a6081b79 /qrap.c
parentcbac0245c8fd94ce66c05b1abe05bfa0d6dda251 (diff)
downloadpasst-27aec5911a8fd00068c6db8f1a73d61903488b0c.tar
passt-27aec5911a8fd00068c6db8f1a73d61903488b0c.tar.gz
passt-27aec5911a8fd00068c6db8f1a73d61903488b0c.tar.bz2
passt-27aec5911a8fd00068c6db8f1a73d61903488b0c.tar.lz
passt-27aec5911a8fd00068c6db8f1a73d61903488b0c.tar.xz
passt-27aec5911a8fd00068c6db8f1a73d61903488b0c.tar.zst
passt-27aec5911a8fd00068c6db8f1a73d61903488b0c.zip
qrap: Don't rely on errno after perror(), and reset it before usage
In commit fca5e11773d0 ("qrap: Add probe retry on connection reset from passt for KubeVirt integration") I just used errno to check if the connection was reset on recv(), but perror() might set it to EINVAL if e.g. an underlying logging mechanism fails, so we won't actually catch the connection reset. And in case recv() returns 0, errno won't be set, but we're still using it without resetting it first, which leads to unpredictable results in that case. Reset errno before probing with connect(), send() and recv(), and save it for later checks before calling perror(). Fixes: fca5e11773d0 ("qrap: Add probe retry on connection reset from passt for KubeVirt integration") Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'qrap.c')
-rw-r--r--qrap.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/qrap.c b/qrap.c
index 4173281..d73cf6c 100644
--- a/qrap.c
+++ b/qrap.c
@@ -112,8 +112,8 @@ void usage(const char *name)
*/
int main(int argc, char **argv)
{
+ int i, s, qemu_argc = 0, addr_map = 0, has_dev = 0, retry_on_reset, err;
struct timeval tv = { .tv_sec = 0, .tv_usec = (long)(500 * 1000) };
- int i, s, qemu_argc = 0, addr_map = 0, has_dev = 0, retry_on_reset;
char *qemu_argv[ARG_MAX], dev_str[ARG_MAX];
struct sockaddr_un addr = {
.sun_family = AF_UNIX,
@@ -249,14 +249,21 @@ retry:
perror("setsockopt SO_SNDTIMEO");
snprintf(addr.sun_path, UNIX_PATH_MAX, UNIX_SOCK_PATH, i);
- if (connect(s, (const struct sockaddr *)&addr, sizeof(addr)))
+
+ errno = 0;
+
+ if (connect(s, (const struct sockaddr *)&addr, sizeof(addr))) {
+ err = errno;
perror("connect");
- else if (send(s, &probe, sizeof(probe), 0) != sizeof(probe))
+ } else if (send(s, &probe, sizeof(probe), 0) != sizeof(probe)) {
+ err = errno;
perror("send");
- else if (recv(s, &probe_r, 1, MSG_PEEK) <= 0)
+ } else if (recv(s, &probe_r, 1, MSG_PEEK) <= 0) {
+ err = errno;
perror("recv");
- else
+ } else {
break;
+ }
/* FIXME: in a KubeVirt environment, libvirtd invokes qrap three
* times in a strict sequence when a virtual machine needs to
@@ -280,7 +287,7 @@ retry:
* this FIXME will probably remain until the tool itself is
* obsoleted.
*/
- if (retry_on_reset && errno == ECONNRESET) {
+ if (retry_on_reset && err == ECONNRESET) {
retry_on_reset--;
usleep(50 * 1000);
goto retry;