ports/net-mgmt/wmi-client/files/patch-Samba_source_libcli_nbt_nbtsocket.c
Alexey Dokuchaev 92606b55b4 net-mgmt/wmi-client: backport three fixes to nbtsocket.c from upstream
to address some known issues with the port, namely:

  - Prevent segmentation fault in certain scenarios
  - Fix busy loop on empty UDP packet (CVE-2020-14303)
  - Plug memory leak in nbt_name_request_destructor()

While here, remove needless .include <bsd.port.options.mk> and vocalize
the installation command.

Commits:	ebab6d6, 3cc0f1e
Obtained from:	https://git.samba.org/?p=samba.git;a=history;f=libcli/nbt/nbtsocket.c
PR:		237038
2021-04-29 10:48:06 +00:00

82 lines
2.5 KiB
C

--- Samba/source/libcli/nbt/nbtsocket.c.orig 2011-11-22 22:40:25 UTC
+++ Samba/source/libcli/nbt/nbtsocket.c
@@ -45,6 +45,7 @@ static int nbt_name_request_destructor(struct nbt_name
req->name_trn_id = 0;
}
if (req->te) {
+ talloc_free(req->te);
req->te = NULL;
}
if (req->nbtsock->send_queue == NULL) {
@@ -168,8 +169,23 @@ static void nbt_name_socket_recv(struct nbt_name_socke
return;
}
+ /*
+ * Given a zero length, data_blob_talloc() returns the
+ * NULL blob {NULL, 0}.
+ *
+ * We only want to error return here on a real out of memory condition
+ * (i.e. dsize != 0, so the UDP packet has data, but the return of the
+ * allocation failed, so blob.data==NULL).
+ *
+ * Given an actual zero length UDP packet having blob.data == NULL
+ * isn't an out of memory error condition, that's the defined semantics
+ * of data_blob_talloc() when asked for zero bytes.
+ *
+ * We still need to continue to do the zero-length socket_recvfrom()
+ * read in order to clear the "read pending" condition on the socket.
+ */
blob = data_blob_talloc(tmp_ctx, NULL, dsize);
- if (blob.data == NULL) {
+ if (blob.data == NULL && dsize != 0) {
talloc_free(tmp_ctx);
return;
}
@@ -226,6 +242,16 @@ static void nbt_name_socket_recv(struct nbt_name_socke
return;
}
+ talloc_steal(req, packet);
+ talloc_steal(req, src);
+ talloc_free(tmp_ctx);
+ nbt_name_socket_handle_response_packet(req, packet, src);
+}
+
+void nbt_name_socket_handle_response_packet(struct nbt_name_request *req,
+ struct nbt_name_packet *packet,
+ struct socket_address *src)
+{
/* if this is a WACK response, this we need to go back to waiting,
but perhaps increase the timeout */
if ((packet->operation & NBT_OPCODE) == NBT_OPCODE_WACK) {
@@ -246,7 +272,6 @@ static void nbt_name_socket_recv(struct nbt_name_socke
req->te = event_add_timed(req->nbtsock->event_ctx, req,
timeval_current_ofs(req->timeout, 0),
nbt_name_socket_timeout, req);
- talloc_free(tmp_ctx);
return;
}
@@ -268,7 +293,6 @@ static void nbt_name_socket_recv(struct nbt_name_socke
/* if we don't want multiple replies then we are done */
if (req->allow_multiple_replies &&
req->num_replies < NBT_MAX_REPLIES) {
- talloc_free(tmp_ctx);
return;
}
@@ -278,13 +302,11 @@ static void nbt_name_socket_recv(struct nbt_name_socke
done:
if (DEBUGLVL(9)) {
- talloc_report(tmp_ctx, stdout);
talloc_report(req, stdout);
}
if (req->async.fn) {
req->async.fn(req);
}
- talloc_free(tmp_ctx);
}
/*