aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan O'Hara <rohara@redhat.com>2013-08-20 09:29:51 -0500
committerSimon Horman <horms@verge.net.au>2013-08-22 14:05:37 +0900
commit7aa3bd42505aadcccd3e59a372bceb5e85479292 (patch)
tree7fa3800104e47e056340b3c6402962c42110e499
parent6ec5f5e7fdcd88862f5e988270ce2d478e8c89b6 (diff)
downloadipvsadm-7aa3bd42505aadcccd3e59a372bceb5e85479292.tar.gz
libipvs: CHECK_IPV4 and CHECK_PE macros should not call return
The CHECK_IPV4 and CHECK_PE macros will call return if a conditional is true. This is a problem for any caller that has allocated memory and needs to do cleanup before returning. This patch replaces the return in both macros with a goto statement. As a result, each caller needs a out_err label. Signed-off-by: Ryan O'Hara <rohara@redhat.com> Acked-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--libipvs/libipvs.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/libipvs/libipvs.c b/libipvs/libipvs.c
index 309ccce..04473fb 100644
--- a/libipvs/libipvs.c
+++ b/libipvs/libipvs.c
@@ -42,11 +42,11 @@ static int family, try_nl = 1;
#endif
#define CHECK_IPV4(s, ret) if (s->af && s->af != AF_INET) \
- { errno = EAFNOSUPPORT; return ret; } \
+ { errno = EAFNOSUPPORT; goto out_err; } \
s->__addr_v4 = s->addr.ip; \
#define CHECK_PE(s, ret) if (s->pe_name[0]) \
- { errno = EAFNOSUPPORT; return ret; }
+ { errno = EAFNOSUPPORT; goto out_err; }
#define CHECK_COMPAT_DEST(s, ret) CHECK_IPV4(s, ret)
@@ -266,6 +266,8 @@ int ipvs_add_service(ipvs_service_t *svc)
CHECK_COMPAT_SVC(svc, -1);
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_ADD, (char *)svc,
sizeof(struct ip_vs_service_kern));
+out_err:
+ return -1;
}
@@ -286,6 +288,8 @@ int ipvs_update_service(ipvs_service_t *svc)
CHECK_COMPAT_SVC(svc, -1);
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_EDIT, (char *)svc,
sizeof(struct ip_vs_service_kern));
+out_err:
+ return -1;
}
@@ -306,6 +310,8 @@ int ipvs_del_service(ipvs_service_t *svc)
CHECK_COMPAT_SVC(svc, -1);
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_DEL, (char *)svc,
sizeof(struct ip_vs_service_kern));
+out_err:
+ return -1;
}
@@ -331,6 +337,8 @@ int ipvs_zero_service(ipvs_service_t *svc)
CHECK_COMPAT_SVC(svc, -1);
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_ZERO, (char *)svc,
sizeof(struct ip_vs_service_kern));
+out_err:
+ return -1;
}
#ifdef LIBIPVS_USE_NL
@@ -384,6 +392,8 @@ nla_put_failure:
memcpy(&svcdest.dest, dest, sizeof(svcdest.dest));
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_ADDDEST,
(char *)&svcdest, sizeof(svcdest));
+out_err:
+ return -1;
}
@@ -413,6 +423,8 @@ nla_put_failure:
memcpy(&svcdest.dest, dest, sizeof(svcdest.dest));
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_EDITDEST,
(char *)&svcdest, sizeof(svcdest));
+out_err:
+ return -1;
}
@@ -443,6 +455,8 @@ nla_put_failure:
memcpy(&svcdest.dest, dest, sizeof(svcdest.dest));
return setsockopt(sockfd, IPPROTO_IP, IP_VS_SO_SET_DELDEST,
(char *)&svcdest, sizeof(svcdest));
+out_err:
+ return -1;
}
@@ -974,6 +988,9 @@ ipvs_get_service_err2:
svc->addr.ip = svc->__addr_v4;
svc->pe_name[0] = '\0';
return svc;
+out_err:
+ free(svc);
+ return NULL;
}
#ifdef LIBIPVS_USE_NL