From: Stefano Brivio <sbrivio@redhat.com>
To: passt-dev@passt.top
Cc: Chris Kuhn <kuhnchris+passt@kuhnchris.eu>, lemmi <lemmi@nerd2nerd.org>
Subject: [PATCH 1/4] netlink: Use 8 KiB * netlink message header size as response buffer
Date: Wed, 8 Mar 2023 08:35:13 +0100 [thread overview]
Message-ID: <20230308073516.2189680-2-sbrivio@redhat.com> (raw)
In-Reply-To: <20230308073516.2189680-1-sbrivio@redhat.com>
...instead of BUFSIZ. On musl, BUFSIZ is 1024, so we'll typically
truncate the response to the request we send in nl_link(). It's
usually 8192 or more with glibc.
There doesn't seem to be any macro defining the rtnetlink maximum
message size, and iproute2 just hardcodes 1024 * 1024 for the receive
buffer, but the example in netlink(7) makes somewhat sense, looking
at the kernel implementation.
It's not very clean, but we're very unlikely to hit that limit,
and if we do, we'll find out painlessly, because NLA_OK() will tell
us right away.
Reported-by: Chris Kuhn <kuhnchris+passt@kuhnchris.eu>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
netlink.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/netlink.c b/netlink.c
index 8f785ca..0e0be4f 100644
--- a/netlink.c
+++ b/netlink.c
@@ -34,6 +34,8 @@
#include "log.h"
#include "netlink.h"
+#define NLBUFSIZ (8192 * sizeof(struct nlmsghdr)) /* See netlink(7) */
+
/* Socket in init, in target namespace, sequence (just needs to be monotonic) */
static int nl_sock = -1;
static int nl_sock_ns = -1;
@@ -105,7 +107,7 @@ fail:
static int nl_req(int ns, char *buf, const void *req, ssize_t len)
{
int s = ns ? nl_sock_ns : nl_sock, done = 0;
- char flush[BUFSIZ];
+ char flush[NLBUFSIZ];
ssize_t n;
while (!done && (n = recv(s, flush, sizeof(flush), MSG_DONTWAIT)) > 0) {
@@ -121,7 +123,8 @@ static int nl_req(int ns, char *buf, const void *req, ssize_t len)
}
}
- if ((send(s, req, len, 0) < len) || (len = recv(s, buf, BUFSIZ, 0)) < 0)
+ if ((send(s, req, len, 0) < len) ||
+ (len = recv(s, buf, NLBUFSIZ, 0)) < 0)
return -errno;
return len;
@@ -149,7 +152,7 @@ unsigned int nl_get_ext_if(sa_family_t af)
};
struct nlmsghdr *nh;
struct rtattr *rta;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
@@ -227,7 +230,7 @@ void nl_route(int ns, unsigned int ifi, sa_family_t af, void *gw)
struct nlmsghdr *nh;
struct rtattr *rta;
struct rtmsg *rtm;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
@@ -336,7 +339,7 @@ void nl_addr(int ns, unsigned int ifi, sa_family_t af,
struct ifaddrmsg *ifa;
struct nlmsghdr *nh;
struct rtattr *rta;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
@@ -446,7 +449,7 @@ void nl_link(int ns, unsigned int ifi, void *mac, int up, int mtu)
struct ifinfomsg *ifm;
struct nlmsghdr *nh;
struct rtattr *rta;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
--
@@ -34,6 +34,8 @@
#include "log.h"
#include "netlink.h"
+#define NLBUFSIZ (8192 * sizeof(struct nlmsghdr)) /* See netlink(7) */
+
/* Socket in init, in target namespace, sequence (just needs to be monotonic) */
static int nl_sock = -1;
static int nl_sock_ns = -1;
@@ -105,7 +107,7 @@ fail:
static int nl_req(int ns, char *buf, const void *req, ssize_t len)
{
int s = ns ? nl_sock_ns : nl_sock, done = 0;
- char flush[BUFSIZ];
+ char flush[NLBUFSIZ];
ssize_t n;
while (!done && (n = recv(s, flush, sizeof(flush), MSG_DONTWAIT)) > 0) {
@@ -121,7 +123,8 @@ static int nl_req(int ns, char *buf, const void *req, ssize_t len)
}
}
- if ((send(s, req, len, 0) < len) || (len = recv(s, buf, BUFSIZ, 0)) < 0)
+ if ((send(s, req, len, 0) < len) ||
+ (len = recv(s, buf, NLBUFSIZ, 0)) < 0)
return -errno;
return len;
@@ -149,7 +152,7 @@ unsigned int nl_get_ext_if(sa_family_t af)
};
struct nlmsghdr *nh;
struct rtattr *rta;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
@@ -227,7 +230,7 @@ void nl_route(int ns, unsigned int ifi, sa_family_t af, void *gw)
struct nlmsghdr *nh;
struct rtattr *rta;
struct rtmsg *rtm;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
@@ -336,7 +339,7 @@ void nl_addr(int ns, unsigned int ifi, sa_family_t af,
struct ifaddrmsg *ifa;
struct nlmsghdr *nh;
struct rtattr *rta;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
@@ -446,7 +449,7 @@ void nl_link(int ns, unsigned int ifi, void *mac, int up, int mtu)
struct ifinfomsg *ifm;
struct nlmsghdr *nh;
struct rtattr *rta;
- char buf[BUFSIZ];
+ char buf[NLBUFSIZ];
ssize_t n;
size_t na;
--
2.39.2
next prev parent reply other threads:[~2023-03-08 7:35 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-08 7:35 [PATCH 0/4] Fix build against musl C library Stefano Brivio
2023-03-08 7:35 ` Stefano Brivio [this message]
2023-03-08 22:06 ` [PATCH 1/4] netlink: Use 8 KiB * netlink message header size as response buffer David Gibson
2023-03-08 7:35 ` [PATCH 2/4] conf, passt: Rename stderr to force_stderr Stefano Brivio
2023-03-08 22:10 ` David Gibson
2023-03-08 7:35 ` [PATCH 3/4] treewide: Fix header includes to build with musl Stefano Brivio
2023-03-08 22:11 ` David Gibson
2023-03-08 7:35 ` [PATCH 4/4] util: Carry own definition of __bswap_constant{16,32} Stefano Brivio
2023-03-08 22:11 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230308073516.2189680-2-sbrivio@redhat.com \
--to=sbrivio@redhat.com \
--cc=kuhnchris+passt@kuhnchris.eu \
--cc=lemmi@nerd2nerd.org \
--cc=passt-dev@passt.top \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).