Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/813276/?format=api
{ "id": 813276, "url": "http://patchwork.ozlabs.org/api/patches/813276/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1505296780-8444-2-git-send-email-liuhangbin@gmail.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "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": "<1505296780-8444-2-git-send-email-liuhangbin@gmail.com>", "list_archive_url": null, "date": "2017-09-13T09:59:39", "name": "[PATCHv2,iproute2,1/2] lib/libnetlink: re malloc buff if size is not enough", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "b97389a59835359eebba160b0bf821ba4a2e3f5e", "submitter": { "id": 15639, "url": "http://patchwork.ozlabs.org/api/people/15639/?format=api", "name": "Hangbin Liu", "email": "liuhangbin@gmail.com" }, "delegate": { "id": 389, "url": "http://patchwork.ozlabs.org/api/users/389/?format=api", "username": "shemminger", "first_name": "stephen", "last_name": "hemminger", "email": "shemminger@vyatta.com" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1505296780-8444-2-git-send-email-liuhangbin@gmail.com/mbox/", "series": [ { "id": 2859, "url": "http://patchwork.ozlabs.org/api/series/2859/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=2859", "date": "2017-09-13T09:59:38", "name": "libnetlink: malloc correct buff at run time", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/2859/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/813276/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/813276/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=\"JTFsVGRb\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xscbs47pKz9s76\n\tfor <patchwork-incoming@ozlabs.org>;\n\tWed, 13 Sep 2017 20:00:25 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752009AbdIMKAW (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 13 Sep 2017 06:00:22 -0400", "from mail-pg0-f66.google.com ([74.125.83.66]:37050 \"EHLO\n\tmail-pg0-f66.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751714AbdIMKAT (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Wed, 13 Sep 2017 06:00:19 -0400", "by mail-pg0-f66.google.com with SMTP id v5so7419496pgn.4\n\tfor <netdev@vger.kernel.org>; Wed, 13 Sep 2017 03:00:19 -0700 (PDT)", "from leo.usersys.redhat.com ([209.132.188.80])\n\tby smtp.gmail.com with ESMTPSA id\n\ts62sm26284740pfe.91.2017.09.13.03.00.15\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 13 Sep 2017 03:00:17 -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=HMeYXlWhvTL+ZozncANg02jbmt63urSoVQTXOPSylYY=;\n\tb=JTFsVGRbvc9068tF+39+A0lCXQN5j/AVg+MyEnta0oagTQqjIIe7i7CJW/YKTwtG8X\n\tiEwV3vCpmBUehyFfeOLsynvcyCgJ7mHu6yxUSCIgARgTolOfd947JQSAKNyXkg3AvIZ5\n\tDc89WzrZOnh7YlYnw6nzOOdOYWInvRK3Udx9VovrMBV2FzctjVlHfHcuz2Jsi1gHNol9\n\tuFjjUyE1CgOHAI+CW0HMaIMPXcZlgKEv1uIjdImSTDAVI+JIKzeeQQt+C52WHwCb7y7n\n\ta4BycOcgzktSAZKA52FfL4l6n3cWXCfhD8+LoxldA+hTKwvUW+WCU3fNk+cnpTWkepNt\n\t1gBw==", "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=HMeYXlWhvTL+ZozncANg02jbmt63urSoVQTXOPSylYY=;\n\tb=HAwHgAjHqgED4NVDnzRNqDeN3G/qK/4wiwYhDlBIRxvFxVgRDymNGr46Uk1Lky0y6o\n\tJUbExH0S2zFxsmfbmeEvNKzJRl9xl1hTKKLkNMFZtGLaKJ1dfdXs0qnpXn1BD8At/Z+c\n\tBErkc3eiRKVgngqnwuDy3zDStpaQQ7OGJwfGtgK71BQKtxXJLMzrvoXRjmOL2fU24Leb\n\tOCjPt3iysD3iLCmKJbo0C3orJiP3bN3s8CFaj8OO9xyv4/mtWVXWZYGYM1eFU69VDciH\n\tt4kVh44Yi2O0YXMUfu5DDj8T63O+gvoV6d3OCx5NZ4sjcfyWA+VllmHkyp4mtL3On4C0\n\t6coQ==", "X-Gm-Message-State": "AHPjjUj71uT7BriQTXQf9HU1wXmKcK73HFjCfJuu6bcBaq+aM7P7S9wn\n\tdjW8vEB2vlJvYs8K", "X-Google-Smtp-Source": "ADKCNb7Hwa+hxpFWbYrUl3jxUSdfnOlBPfK+0vL3GN7gTL7zTI5oahiJK5WxeP6MpZIEYsH/OseY3g==", "X-Received": "by 10.98.197.134 with SMTP id\n\tj128mr17297308pfg.113.1505296818923; \n\tWed, 13 Sep 2017 03:00:18 -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": "[PATCHv2 iproute2 1/2] lib/libnetlink: re malloc buff if size is\n\tnot enough", "Date": "Wed, 13 Sep 2017 17:59:39 +0800", "Message-Id": "<1505296780-8444-2-git-send-email-liuhangbin@gmail.com>", "X-Mailer": "git-send-email 2.5.5", "In-Reply-To": "<1505296780-8444-1-git-send-email-liuhangbin@gmail.com>", "References": "<1505296780-8444-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 | 112 ++++++++++++++++++++++++++++++++++++++-----------------\n 1 file changed, 78 insertions(+), 34 deletions(-)", "diff": "diff --git a/lib/libnetlink.c b/lib/libnetlink.c\nindex be7ac86..e3fa7cf 100644\n--- a/lib/libnetlink.c\n+++ b/lib/libnetlink.c\n@@ -402,6 +402,62 @@ 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\treturn len;\n+\t}\n+\n+\tif (len == 0) {\n+\t\tfprintf(stderr, \"EOF on netlink\\n\");\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 +469,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 +505,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 +516,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 +592,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 +605,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 +624,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 +651,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 +660,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 +676,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": [ "PATCHv2", "iproute2", "1/2" ] }