提交 b4919a5f 编写于 作者: O Olaf Hering 提交者: Greg Kroah-Hartman

Tools: hv: fix send/recv buffer allocation

hv_kvp_daemon fails to start in current openSuSE 13.1 snapshots because
the kvp_send_buffer is too small to hold cn_msg+hv_kvp_msg, the very
first sendmsg returns with EFAULT. In addition it fixes the Network info
tab in Windows Server 2012R2 in SLES11.

Adjust the code in kvp and vss daemon to allocate the needed buffers at
runtime. To keep the code simple, the buffer_len includes also the
nlmsghdr, although only the recv_buffer needs this extra space.
Signed-off-by: NOlaf Hering <olaf@aepfle.de>
Signed-off-by: NK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 cfc25993
...@@ -79,8 +79,6 @@ enum { ...@@ -79,8 +79,6 @@ enum {
DNS DNS
}; };
static char kvp_send_buffer[4096];
static char kvp_recv_buffer[4096 * 2];
static struct sockaddr_nl addr; static struct sockaddr_nl addr;
static int in_hand_shake = 1; static int in_hand_shake = 1;
...@@ -1437,10 +1435,21 @@ int main(void) ...@@ -1437,10 +1435,21 @@ int main(void)
int pool; int pool;
char *if_name; char *if_name;
struct hv_kvp_ipaddr_value *kvp_ip_val; struct hv_kvp_ipaddr_value *kvp_ip_val;
char *kvp_send_buffer;
char *kvp_recv_buffer;
size_t kvp_recv_buffer_len;
daemon(1, 0); daemon(1, 0);
openlog("KVP", 0, LOG_USER); openlog("KVP", 0, LOG_USER);
syslog(LOG_INFO, "KVP starting; pid is:%d", getpid()); syslog(LOG_INFO, "KVP starting; pid is:%d", getpid());
kvp_recv_buffer_len = NLMSG_HDRLEN + sizeof(struct cn_msg) + sizeof(struct hv_kvp_msg);
kvp_send_buffer = calloc(1, kvp_recv_buffer_len);
kvp_recv_buffer = calloc(1, kvp_recv_buffer_len);
if (!(kvp_send_buffer && kvp_recv_buffer)) {
syslog(LOG_ERR, "Failed to allocate netlink buffers");
exit(EXIT_FAILURE);
}
/* /*
* Retrieve OS release information. * Retrieve OS release information.
*/ */
...@@ -1514,7 +1523,7 @@ int main(void) ...@@ -1514,7 +1523,7 @@ int main(void)
continue; continue;
} }
len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0, len = recvfrom(fd, kvp_recv_buffer, kvp_recv_buffer_len, 0,
addr_p, &addr_l); addr_p, &addr_l);
if (len < 0) { if (len < 0) {
......
...@@ -38,8 +38,6 @@ ...@@ -38,8 +38,6 @@
#include <linux/netlink.h> #include <linux/netlink.h>
#include <syslog.h> #include <syslog.h>
static char vss_recv_buffer[4096];
static char vss_send_buffer[4096];
static struct sockaddr_nl addr; static struct sockaddr_nl addr;
#ifndef SOL_NETLINK #ifndef SOL_NETLINK
...@@ -147,6 +145,9 @@ int main(void) ...@@ -147,6 +145,9 @@ int main(void)
struct cn_msg *incoming_cn_msg; struct cn_msg *incoming_cn_msg;
int op; int op;
struct hv_vss_msg *vss_msg; struct hv_vss_msg *vss_msg;
char *vss_send_buffer;
char *vss_recv_buffer;
size_t vss_recv_buffer_len;
if (daemon(1, 0)) if (daemon(1, 0))
return 1; return 1;
...@@ -154,6 +155,14 @@ int main(void) ...@@ -154,6 +155,14 @@ int main(void)
openlog("Hyper-V VSS", 0, LOG_USER); openlog("Hyper-V VSS", 0, LOG_USER);
syslog(LOG_INFO, "VSS starting; pid is:%d", getpid()); syslog(LOG_INFO, "VSS starting; pid is:%d", getpid());
vss_recv_buffer_len = NLMSG_HDRLEN + sizeof(struct cn_msg) + sizeof(struct hv_vss_msg);
vss_send_buffer = calloc(1, vss_recv_buffer_len);
vss_recv_buffer = calloc(1, vss_recv_buffer_len);
if (!(vss_send_buffer && vss_recv_buffer)) {
syslog(LOG_ERR, "Failed to allocate netlink buffers");
exit(EXIT_FAILURE);
}
fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
if (fd < 0) { if (fd < 0) {
syslog(LOG_ERR, "netlink socket creation failed; error:%d %s", syslog(LOG_ERR, "netlink socket creation failed; error:%d %s",
...@@ -215,7 +224,7 @@ int main(void) ...@@ -215,7 +224,7 @@ int main(void)
continue; continue;
} }
len = recvfrom(fd, vss_recv_buffer, sizeof(vss_recv_buffer), 0, len = recvfrom(fd, vss_recv_buffer, vss_recv_buffer_len, 0,
addr_p, &addr_l); addr_p, &addr_l);
if (len < 0) { if (len < 0) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册