File 1971-Allow-dist-input_handler-to-be-added-if-the-dist-con.patch of Package erlang
From df872c1c70c710d3a848fe2d69dd1a721dd86123 Mon Sep 17 00:00:00 2001
From: Zeyu Zhang <zeyu@fb.com>
Date: Sun, 9 Apr 2023 20:56:08 -0700
Subject: [PATCH 1/2] Allow dist input_handler to be added if the dist control
is an internal port
---
erts/doc/src/erlang.xml | 25 +++++++++++++++----------
erts/emulator/beam/dist.c | 4 ++--
2 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index d7fa7b8149..3af27e7bea 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -1927,16 +1927,22 @@ end</code>
channel.
</p>
<note><p>
- Only the process registered as distribution
- controller for the distribution channel identified by
- <c><anno>DHandle</anno></c> is allowed to call this
- function.
+ When the distribution controller for the distribution
+ channel identified by <c><anno>DHandle</anno></c> is a
+ process, it is the only process allowed to call this
+ function.
+ This function is also allowed to be called when the
+ distribution controller for the distribution channel
+ identified by <c><anno>DHandle</anno></c> is a port.
+ The data received by the port should in this case be delivered to
+ the process identified by <c><anno>InputHandler</anno></c>
+ which in turn should call
+ <seemfa marker="erlang#dist_ctrl_put_data/2"><c>erlang:dist_ctrl_put_data/2</c></seemfa>.
</p></note>
<p>
This function is used when implementing an alternative
- distribution carrier using processes as distribution
- controllers. <c><anno>DHandle</anno></c> is retrieved
- via the callback
+ distribution carrier. <c><anno>DHandle</anno></c> is
+ retrieved via the callback
<seeguide marker="erts:alt_dist#hs_data_f_handshake_complete"><c>f_handshake_complete</c></seeguide>.
More information can be found in the documentation of
<seeguide marker="erts:alt_dist#distribution_module">ERTS
@@ -1967,9 +1973,8 @@ end</code>
</p></note>
<p>
This function is used when implementing an alternative
- distribution carrier using processes as distribution
- controllers. <c><anno>DHandle</anno></c> is retrieved
- via the callback
+ distribution carrier. <c><anno>DHandle</anno></c> is
+ retrieved via the callback
<seeguide marker="erts:alt_dist#hs_data_f_handshake_complete"><c>f_handshake_complete</c></seeguide>.
More information can be found in the documentation of
<seeguide marker="erts:alt_dist#distribution_module">ERTS
diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c
index ca6aa40185..9cee9f0678 100644
--- a/erts/emulator/beam/dist.c
+++ b/erts/emulator/beam/dist.c
@@ -4386,13 +4386,13 @@ dist_get_stat_1(BIF_ALIST_1)
BIF_RETTYPE
dist_ctrl_input_handler_2(BIF_ALIST_2)
{
- DistEntry *dep = ERTS_PROC_GET_DIST_ENTRY(BIF_P);
Uint32 conn_id;
+ DistEntry *dep = erts_dhandle_to_dist_entry(BIF_ARG_1, &conn_id);
if (!dep)
BIF_ERROR(BIF_P, EXC_NOTSUP);
- if (erts_dhandle_to_dist_entry(BIF_ARG_1, &conn_id) != dep)
+ if ((ERTS_PROC_GET_DIST_ENTRY(BIF_P) != dep) && !is_internal_port(dep->cid))
BIF_ERROR(BIF_P, BADARG);
if (is_not_internal_pid(BIF_ARG_2))
--
2.35.3