Page MenuHomeFreeBSD

D60249.id188423.diff
No OneTemporary

D60249.id188423.diff

diff --git a/sys/netlink/netlink_io.c b/sys/netlink/netlink_io.c
--- a/sys/netlink/netlink_io.c
+++ b/sys/netlink/netlink_io.c
@@ -295,6 +295,9 @@
NL_LOG(LOG_DEBUG2, "retcode: %d", error);
}
ack:
+ /* A reply that ran out of memory is incomplete. */
+ if (npt->nw->enomem && error == 0)
+ error = ENOMEM;
if ((hdr->nlmsg_flags & NLM_F_ACK) || (error != 0 && error != EINTR)) {
if (!npt->nw->suppress_ack) {
NL_LOG(LOG_DEBUG3, "ack");
diff --git a/sys/netlink/netlink_message_writer.c b/sys/netlink/netlink_message_writer.c
--- a/sys/netlink/netlink_message_writer.c
+++ b/sys/netlink/netlink_message_writer.c
@@ -271,8 +271,16 @@
int payload_len;
uint32_t flags = nlp->nl_flags;
struct nl_writer *nw = npt->nw;
+ int malloc_flag = nw->malloc_flag;
bool cap_ack;
+ /*
+ * The reader waits for the ack. No locks are held here, so wait for
+ * memory, also if the reply has run out of it.
+ */
+ nw->enomem = false;
+ nw->malloc_flag = M_WAITOK;
+
payload_len = sizeof(struct nlmsgerr);
/*
@@ -292,8 +300,8 @@
NL_LOG(LOG_DEBUG3, "acknowledging message type %d seq %d",
hdr->nlmsg_type, hdr->nlmsg_seq);
- if (!nlmsg_add(nw, nlp->nl_port, hdr->nlmsg_seq, NLMSG_ERROR, nl_flags, payload_len))
- goto enomem;
+ nlmsg_add(nw, nlp->nl_port, hdr->nlmsg_seq, NLMSG_ERROR, nl_flags,
+ payload_len);
errmsg = nlmsg_reserve_data(nw, payload_len, struct nlmsgerr);
errmsg->error = error;
@@ -307,12 +315,8 @@
if (npt->cookie != NULL)
nlattr_add_raw(nw, npt->cookie);
- if (nlmsg_end(nw))
- return;
-enomem:
- NLP_LOG(LOG_DEBUG, nlp, "error allocating ack data for message %d seq %u",
- hdr->nlmsg_type, hdr->nlmsg_seq);
- nlmsg_abort(nw);
+ nlmsg_end(nw);
+ nw->malloc_flag = malloc_flag;
}
bool
@@ -327,7 +331,9 @@
NL_LOG(LOG_DEBUG2, "record error=%d at off %d (%p)", error,
nw->buf->datalen, perror);
*perror = error;
- nlmsg_end(nw);
+ /* A dump that ran out of memory ends with the ack instead. */
+ if (!nlmsg_end(nw))
+ return (false);
nw->suppress_ack = true;
return (true);

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 3, 10:32 PM (1 m, 35 s ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40157948
Default Alt Text
D60249.id188423.diff (2 KB)

Event Timeline