{"id":815965,"url":"http://patchwork.ozlabs.org/api/patches/815965/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/1505871820-31580-2-git-send-email-liuhangbin@gmail.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1505871820-31580-2-git-send-email-liuhangbin@gmail.com>","list_archive_url":null,"date":"2017-09-20T01:43:39","name":"[PATCHv3,iproute2,1/2] lib/libnetlink: re malloc buff if size is not enough","commit_ref":null,"pull_url":null,"state":"superseded","archived":true,"hash":"3ac35056c80fb9584eeb94a69f558787ac4fc810","submitter":{"id":15639,"url":"http://patchwork.ozlabs.org/api/people/15639/?format=json","name":"Hangbin Liu","email":"liuhangbin@gmail.com"},"delegate":{"id":389,"url":"http://patchwork.ozlabs.org/api/users/389/?format=json","username":"shemminger","first_name":"stephen","last_name":"hemminger","email":"shemminger@vyatta.com"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1505871820-31580-2-git-send-email-liuhangbin@gmail.com/mbox/","series":[{"id":4000,"url":"http://patchwork.ozlabs.org/api/series/4000/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=4000","date":"2017-09-20T01:43:38","name":"libnetlink: malloc correct buff at run time","version":1,"mbox":"http://patchwork.ozlabs.org/series/4000/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/815965/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/815965/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"QIa2kuN4\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xxjGC4Qbsz9sPs\n\tfor <patchwork-incoming@ozlabs.org>;\n\tWed, 20 Sep 2017 11:44:19 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751585AbdITBoR (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tTue, 19 Sep 2017 21:44:17 -0400","from mail-pg0-f68.google.com ([74.125.83.68]:33832 \"EHLO\n\tmail-pg0-f68.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751524AbdITBoJ (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Tue, 19 Sep 2017 21:44:09 -0400","by mail-pg0-f68.google.com with SMTP id u18so792686pgo.1\n\tfor <netdev@vger.kernel.org>; Tue, 19 Sep 2017 18:44:08 -0700 (PDT)","from leo.usersys.redhat.com ([209.132.188.80])\n\tby smtp.gmail.com with ESMTPSA id\n\tq23sm5070313pfk.182.2017.09.19.18.44.05\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 19 Sep 2017 18:44:07 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20161025;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=qm/bY9kROf26yZk2ohmQ5YLRSl77EOs7Y6syk7uG1NU=;\n\tb=QIa2kuN41Ow6tBpznhYv3vQQU3MgoiK5Z2XKXDA/fgcKSiv+b1baxXS/3jS+UYBEGM\n\tbuyeERaWG89RrnzTE6B3tZ+MwHlmqcPNA4jJPYl0y2f3rLhq+UucJwSa78Eh/a4+U62p\n\tFLyAzmk3xwakC5vxRCqSveL140LUeVJ7X954IKHjAl0LNdHZeRrLe4bwpKzT1kNUOiyN\n\tEIuVheVHDsMJvj6WCWt64S1mTp4G7jxD4fXqHtChD+i5hobTO4LMAyywGKrutybfdudV\n\tc86vWGEJTSxMYMtXt7r3T4wTV95SOH6qt0KZYSKxBxOBYwEx2NHPJfFlcAFsxaOYebDn\n\tU+IQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=qm/bY9kROf26yZk2ohmQ5YLRSl77EOs7Y6syk7uG1NU=;\n\tb=pyWfY7IZL9rMLwUFcq9mXJtHJxDhF4TEpbHmYeop+wxr9+zQOg5bpqCPcKDjk5VD6h\n\t+ShXAU4AUOwQUVaIIt+L0kUtW4qJ3hQbq3CBtqbx1bJ4JtQkDcmU5vmIDNdwW5ExeumK\n\tq59gSgXH3O4F9AoaIveVXfP9/AIj3ugBg1OuiMANlHZVWyLKEArL2m8v3lHRXr5b4Cz5\n\titabEWNuK2hp/fEiAcFocON4n+1kYnul66KKzHtqTbAwXBcGHRyFg1yikAP8dx3Ex3uT\n\tTsBhgt1ga3EeQU8XYv4CfVYjSaazR3gwsCsHgc9i2bspMoMsQ/cZaAQfYpNzO3rNci4K\n\tn65A==","X-Gm-Message-State":"AHPjjUhb74ZtglXMQWjoRtimCCre7zx/W7TPU0jWbiHhhTZG9ud8McNk\n\tGzm+2d4NMUNPpBFM1JnKPt+A7g==","X-Google-Smtp-Source":"AOwi7QAke5kRD1/2qVCWnFw8U+mvaXvpvYr7jzYp9IQiaEVzfO7RPk+PrwwFm91vwb1b9swhrCvHIA==","X-Received":"by 10.98.153.198 with SMTP id t67mr533184pfk.62.1505871848004;\n\tTue, 19 Sep 2017 18:44:08 -0700 (PDT)","From":"Hangbin Liu <liuhangbin@gmail.com>","To":"netdev@vger.kernel.org","Cc":"Stephen Hemminger <stephen@networkplumber.org>,\n\tMichal Kubecek <mkubecek@suse.cz>, Phil Sutter <phil@nwl.cc>,\n\tHangbin Liu <liuhangbin@gmail.com>","Subject":"[PATCHv3 iproute2 1/2] lib/libnetlink: re malloc buff if size is\n\tnot enough","Date":"Wed, 20 Sep 2017 09:43:39 +0800","Message-Id":"<1505871820-31580-2-git-send-email-liuhangbin@gmail.com>","X-Mailer":"git-send-email 2.5.5","In-Reply-To":"<1505871820-31580-1-git-send-email-liuhangbin@gmail.com>","References":"<1505871820-31580-1-git-send-email-liuhangbin@gmail.com>","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"With commit 72b365e8e0fd (\"libnetlink: Double the dump buffer size\")\nwe doubled the buffer size to support more VFs. But the VFs number is\nincreasing all the time. Some customers even use more than 200 VFs now.\n\nWe could not double it everytime when the buffer is not enough. Let's just\nnot hard code the buffer size and malloc the correct number when running.\n\nIntroduce function rtnl_recvmsg() to always return a newly allocated buffer.\nThe caller need to free it after using.\n\nSigned-off-by: Hangbin Liu <liuhangbin@gmail.com>\nSigned-off-by: Phil Sutter <phil@nwl.cc>\n---\n lib/libnetlink.c | 114 ++++++++++++++++++++++++++++++++++++++-----------------\n 1 file changed, 80 insertions(+), 34 deletions(-)","diff":"diff --git a/lib/libnetlink.c b/lib/libnetlink.c\nindex be7ac86..ab45b48 100644\n--- a/lib/libnetlink.c\n+++ b/lib/libnetlink.c\n@@ -402,6 +402,64 @@ static void rtnl_dump_error(const struct rtnl_handle *rth,\n \t}\n }\n \n+static int rtnl_recvmsg(int fd, struct msghdr *msg, char **answer)\n+{\n+\tstruct iovec *iov;\n+\tint len = -1, buf_len = 32768;\n+\tchar *bufp, *buf = NULL;\n+\n+\tint flag = MSG_PEEK | MSG_TRUNC;\n+\n+realloc:\n+\tbufp = realloc(buf, buf_len);\n+\n+\tif (bufp == NULL) {\n+\t\tfprintf(stderr, \"malloc error: not enough buffer\\n\");\n+\t\tfree(buf);\n+\t\treturn -ENOMEM;\n+\t}\n+\tbuf = bufp;\n+\tiov = msg->msg_iov;\n+\tiov->iov_base = buf;\n+\tiov->iov_len = buf_len;\n+\n+recv:\n+\tlen = recvmsg(fd, msg, flag);\n+\n+\tif (len < 0) {\n+\t\tif (errno == EINTR || errno == EAGAIN)\n+\t\t\tgoto recv;\n+\t\tfprintf(stderr, \"netlink receive error %s (%d)\\n\",\n+\t\t\tstrerror(errno), errno);\n+\t\tfree(buf);\n+\t\treturn -errno;\n+\t}\n+\n+\tif (len == 0) {\n+\t\tfprintf(stderr, \"EOF on netlink\\n\");\n+\t\tfree(buf);\n+\t\treturn -ENODATA;\n+\t}\n+\n+\tif (len > buf_len) {\n+\t\tbuf_len = len;\n+\t\tflag = 0;\n+\t\tgoto realloc;\n+\t}\n+\n+\tif (flag != 0) {\n+\t\tflag = 0;\n+\t\tgoto recv;\n+\t}\n+\n+\tif (answer)\n+\t\t*answer = buf;\n+\telse\n+\t\tfree(buf);\n+\n+\treturn len;\n+}\n+\n int rtnl_dump_filter_l(struct rtnl_handle *rth,\n \t\t       const struct rtnl_dump_filter_arg *arg)\n {\n@@ -413,31 +471,18 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,\n \t\t.msg_iov = &iov,\n \t\t.msg_iovlen = 1,\n \t};\n-\tchar buf[32768];\n+\tchar *buf;\n \tint dump_intr = 0;\n \n-\tiov.iov_base = buf;\n \twhile (1) {\n \t\tint status;\n \t\tconst struct rtnl_dump_filter_arg *a;\n \t\tint found_done = 0;\n \t\tint msglen = 0;\n \n-\t\tiov.iov_len = sizeof(buf);\n-\t\tstatus = recvmsg(rth->fd, &msg, 0);\n-\n-\t\tif (status < 0) {\n-\t\t\tif (errno == EINTR || errno == EAGAIN)\n-\t\t\t\tcontinue;\n-\t\t\tfprintf(stderr, \"netlink receive error %s (%d)\\n\",\n-\t\t\t\tstrerror(errno), errno);\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tif (status == 0) {\n-\t\t\tfprintf(stderr, \"EOF on netlink\\n\");\n-\t\t\treturn -1;\n-\t\t}\n+\t\tstatus = rtnl_recvmsg(rth->fd, &msg, &buf);\n+\t\tif (status < 0)\n+\t\t\treturn status;\n \n \t\tif (rth->dump_fp)\n \t\t\tfwrite(buf, 1, NLMSG_ALIGN(status), rth->dump_fp);\n@@ -462,8 +507,10 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,\n \n \t\t\t\tif (h->nlmsg_type == NLMSG_DONE) {\n \t\t\t\t\terr = rtnl_dump_done(h);\n-\t\t\t\t\tif (err < 0)\n+\t\t\t\t\tif (err < 0) {\n+\t\t\t\t\t\tfree(buf);\n \t\t\t\t\t\treturn -1;\n+\t\t\t\t\t}\n \n \t\t\t\t\tfound_done = 1;\n \t\t\t\t\tbreak; /* process next filter */\n@@ -471,19 +518,23 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,\n \n \t\t\t\tif (h->nlmsg_type == NLMSG_ERROR) {\n \t\t\t\t\trtnl_dump_error(rth, h);\n+\t\t\t\t\tfree(buf);\n \t\t\t\t\treturn -1;\n \t\t\t\t}\n \n \t\t\t\tif (!rth->dump_fp) {\n \t\t\t\t\terr = a->filter(&nladdr, h, a->arg1);\n-\t\t\t\t\tif (err < 0)\n+\t\t\t\t\tif (err < 0) {\n+\t\t\t\t\t\tfree(buf);\n \t\t\t\t\t\treturn err;\n+\t\t\t\t\t}\n \t\t\t\t}\n \n skip_it:\n \t\t\t\th = NLMSG_NEXT(h, msglen);\n \t\t\t}\n \t\t}\n+\t\tfree(buf);\n \n \t\tif (found_done) {\n \t\t\tif (dump_intr)\n@@ -543,7 +594,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,\n \t\t.msg_iov = &iov,\n \t\t.msg_iovlen = 1,\n \t};\n-\tchar   buf[32768] = {};\n+\tchar *buf;\n \n \tn->nlmsg_seq = seq = ++rtnl->seq;\n \n@@ -556,22 +607,12 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,\n \t\treturn -1;\n \t}\n \n-\tiov.iov_base = buf;\n \twhile (1) {\n-\t\tiov.iov_len = sizeof(buf);\n-\t\tstatus = recvmsg(rtnl->fd, &msg, 0);\n+\t\tstatus = rtnl_recvmsg(rtnl->fd, &msg, &buf);\n+\n+\t\tif (status < 0)\n+\t\t\treturn status;\n \n-\t\tif (status < 0) {\n-\t\t\tif (errno == EINTR || errno == EAGAIN)\n-\t\t\t\tcontinue;\n-\t\t\tfprintf(stderr, \"netlink receive error %s (%d)\\n\",\n-\t\t\t\tstrerror(errno), errno);\n-\t\t\treturn -1;\n-\t\t}\n-\t\tif (status == 0) {\n-\t\t\tfprintf(stderr, \"EOF on netlink\\n\");\n-\t\t\treturn -1;\n-\t\t}\n \t\tif (msg.msg_namelen != sizeof(nladdr)) {\n \t\t\tfprintf(stderr,\n \t\t\t\t\"sender address length == %d\\n\",\n@@ -585,6 +626,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,\n \t\t\tif (l < 0 || len > status) {\n \t\t\t\tif (msg.msg_flags & MSG_TRUNC) {\n \t\t\t\t\tfprintf(stderr, \"Truncated message\\n\");\n+\t\t\t\t\tfree(buf);\n \t\t\t\t\treturn -1;\n \t\t\t\t}\n \t\t\t\tfprintf(stderr,\n@@ -611,6 +653,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,\n \t\t\t\t\tif (answer)\n \t\t\t\t\t\tmemcpy(answer, h,\n \t\t\t\t\t\t       MIN(maxlen, h->nlmsg_len));\n+\t\t\t\t\tfree(buf);\n \t\t\t\t\treturn 0;\n \t\t\t\t}\n \n@@ -619,12 +662,14 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,\n \t\t\t\t\trtnl_talk_error(h, err, errfn);\n \n \t\t\t\terrno = -err->error;\n+\t\t\t\tfree(buf);\n \t\t\t\treturn -1;\n \t\t\t}\n \n \t\t\tif (answer) {\n \t\t\t\tmemcpy(answer, h,\n \t\t\t\t       MIN(maxlen, h->nlmsg_len));\n+\t\t\t\tfree(buf);\n \t\t\t\treturn 0;\n \t\t\t}\n \n@@ -633,6 +678,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,\n \t\t\tstatus -= NLMSG_ALIGN(len);\n \t\t\th = (struct nlmsghdr *)((char *)h + NLMSG_ALIGN(len));\n \t\t}\n+\t\tfree(buf);\n \n \t\tif (msg.msg_flags & MSG_TRUNC) {\n \t\t\tfprintf(stderr, \"Message truncated\\n\");\n","prefixes":["PATCHv3","iproute2","1/2"]}