[Openvpn-devel] [M] Change in openvpn[master]: oob: Add client PROBE_REPLY parser

"stipa \(Code Review\) via Openvpn-devel" <[email protected]> Wed, 29 Jul 2026 12:22:54 +0000
Newsgroups net.sourceforge.lists.openvpn-devel
Message-ID <9db6fb0731d49b17ab32e0071aa0fa5a27ba15d4-EmailReplacePatchSet-HTML@gerrit.openvpn.net>
--===============3770097776259194412==
Content-Transfer-Encoding: 8bit
Content-Disposition: inline
Content-Type: multipart/alternative; boundary="RIeYWC5O+qA="; charset=UTF-8

--RIeYWC5O+qA=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Attention is currently required from: flichtenheld, plaisthos=2E

Hello fli=
chtenheld, plaisthos, 

I'd like you to reexamine a change=2E Please visit
=

    http://gerrit=2Eopenvpn=2Enet/c/openvpn/+/1745?usp=3Demail

to look at=
 the new patch set (#10)=2E


Change subject: oob: Add client PROBE_REPLY p=
arser
=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=
=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=
=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E=2E

oob: Ad=
d client PROBE_REPLY parser

Add oob_client_reply_read(), the client-side c=
ounterpart of
oob_server_probe_read(): it scans the TLV payload of a receiv=
ed PROBE_REPLY
for the probe_reply TLV, skipping other/future TLV types=2E =
Both readers use
the shared ctrl_msg_find_tlv() from control_msg=2Eh for th=
e scan=2E

Exercised by unit tests; the client probe path calls it in a fol=
low-up=2E

Change-Id: If04ce09d4c353f5384c0c48f48f63e05869a373f
Signed-off-=
by: Lev Stipakov <lev@openvpn=2Enet>
---
M src/openvpn/oob=2Ec
M src/openvp=
n/oob=2Eh
M tests/unit_tests/openvpn/test_oob=2Ec
3 files changed, 117 inse=
rtions(+), 0 deletions(-)


  git pull ssh://gerrit=2Eopenvpn=2Enet:29418/o=
penvpn refs/changes/45/1745/10

diff --git a/src/openvpn/oob=2Ec b/src/open=
vpn/oob=2Ec
index c841d59=2E=2Ebc0e7a3 100644
--- a/src/openvpn/oob=2Ec
+++=
 b/src/openvpn/oob=2Ec
@@ -112,6 +112,23 @@
 }
 
 bool
+oob_client_reply_re=
ad(struct buffer *payload, struct oob_probe_reply *reply)
+{
+    if (!ctrl=
_msg_read_header(payload, OOB_MSG_PROBE_REPLY))
+    {
+        return fals=
e;
+    }
+
+    struct buffer value;
+    if (!ctrl_msg_find_tlv(payload, =
OOB_TLV_PROBE_REPLY, &value))
+    {
+        return false;
+    }
+
+    r=
eturn oob_probe_reply_read(&value, reply);
+}
+
+bool
 oob_timestamp_in_win=
dow(uint64_t probe_ts, uint64_t now, uint64_t window_secs)
 {
     uint64_t=
 diff =3D (now > probe_ts) ? (now - probe_ts) : (probe_ts - now);
diff --gi=
t a/src/openvpn/oob=2Eh b/src/openvpn/oob=2Eh
index 49d64e8=2E=2E80775a4 10=
0644
--- a/src/openvpn/oob=2Eh
+++ b/src/openvpn/oob=2Eh
@@ -132,6 +132,19 =
@@
 bool oob_client_reply_write(struct buffer *buf, const struct oob_probe_=
reply *reply);
 
 /**
+ * Read a received OOB PROBE_REPLY: verify its messa=
ge-type header, then scan
+ * for the probe_reply TLV; the client-side coun=
terpart of
+ * oob_server_probe_read()=2E TLV types other than probe_reply =
are skipped=2E
+ * payload is consumed as it is read=2E
+ *
+ * @param payl=
oad  buffer positioned at the start of the OOB message payload
+ * @param r=
eply    filled with the parsed probe_reply on success
+ * @return true if t=
he header matched and a well-formed probe_reply was found,
+ *         fals=
e otherwise
+ */
+bool oob_client_reply_read(struct buffer *payload, struct=
 oob_probe_reply *reply);
+
+/**
  * Check whether a probe timestamp is wit=
hin an acceptable window around the
  * current time=2E Used to cheaply dro=
p replayed or implausibly-timed probes
  * before doing any further work (s=
ee the probe_parameter timestamp rationale
diff --git a/tests/unit_tests/op=
envpn/test_oob=2Ec b/tests/unit_tests/openvpn/test_oob=2Ec
index 371cbc6=2E=
=2E48bec2d 100644
--- a/tests/unit_tests/openvpn/test_oob=2Ec
+++ b/tests/u=
nit_tests/openvpn/test_oob=2Ec
@@ -434,6 +434,89 @@
     gc_free(&gc);
 }
 =

+/* A PROBE_REPLY carrying a probe_reply is found by the client scan, with=
 all
+ * fields surviving=2E */
+static void
+test_client_reply_read_finds_=
reply(void **state)
+{
+    struct gc_arena gc =3D gc_new();
+    struct bu=
ffer buf =3D alloc_buf_gc(128, &gc);
+
+    struct oob_probe_reply in =3D {=

+        =2Epriority =3D 5,
+        =2Eweight =3D 50,
+        =2Econnect=
_lifetime =3D 120,
+        =2Eflags =3D 1,
+    };
+    memcpy(in=2Epeer_s=
ession_id=2Eid, "SRVREPLY", SID_SIZE);
+    assert_true(oob_client_reply_wr=
ite(&buf, &in));
+
+    struct oob_probe_reply out =3D { 0 };
+    assert_t=
rue(oob_client_reply_read(&buf, &out));
+    assert_memory_equal(out=2Epeer=
_session_id=2Eid, in=2Epeer_session_id=2Eid, SID_SIZE);
+    assert_int_equ=
al(out=2Epriority, in=2Epriority);
+    assert_int_equal(out=2Eweight, in=
=2Eweight);
+    assert_int_equal(out=2Econnect_lifetime, in=2Econnect_life=
time);
+    assert_int_equal(out=2Eflags, in=2Eflags);
+
+    gc_free(&gc);=

+}
+
+/* TLVs other than probe_reply are skipped=2E */
+static void
+test_=
client_reply_read_skips_unknown(void **state)
+{
+    struct gc_arena gc =
=3D gc_new();
+    struct buffer buf =3D alloc_buf_gc(128, &gc);
+
+    ass=
ert_true(buf_write_u16(&buf, OOB_MSG_PROBE_REPLY));
+    assert_true(ctrl_m=
sg_tlv_write_header(&buf, 0x7ff, false, 4));
+    assert_true(buf_write_u32=
(&buf, 0xabad1dea));
+    struct oob_probe_reply in =3D { =2Epriority =3D 7=
 };
+    assert_true(oob_probe_reply_write(&buf, &in));
+
+    struct oob_p=
robe_reply out =3D { 0 };
+    assert_true(oob_client_reply_read(&buf, &out=
));
+    assert_int_equal(out=2Epriority, 7);
+
+    gc_free(&gc);
+}
+
+/*=
 A payload with no probe_reply is rejected=2E */
+static void
+test_client_=
reply_read_missing(void **state)
+{
+    struct gc_arena gc =3D gc_new();
+=
    struct buffer buf =3D alloc_buf_gc(128, &gc);
+
+    assert_true(buf_wr=
ite_u16(&buf, OOB_MSG_PROBE_REPLY));
+    assert_true(ctrl_msg_tlv_write_he=
ader(&buf, 0x7ff, false, 4));
+    assert_true(buf_write_u32(&buf, 0));
+
+=
    struct oob_probe_reply out =3D { 0 };
+    assert_false(oob_client_repl=
y_read(&buf, &out));
+
+    gc_free(&gc);
+}
+
+/* Likewise, a PROBE_REPLY =
reader rejects a payload with the wrong message
+ * type even when a valid =
probe_reply TLV follows=2E */
+static void
+test_client_reply_read_wrong_ms=
g_type(void **state)
+{
+    struct gc_arena gc =3D gc_new();
+    struct b=
uffer buf =3D alloc_buf_gc(128, &gc);
+
+    assert_true(buf_write_u16(&buf=
, OOB_MSG_SERVER_PROBE));
+    struct oob_probe_reply in =3D { =2Epriority =
=3D 7 };
+    assert_true(oob_probe_reply_write(&buf, &in));
+
+    struct =
oob_probe_reply out =3D { 0 };
+    assert_false(oob_client_reply_read(&buf=
, &out));
+
+    gc_free(&gc);
+}
+
 int
 main(void)
 {
@@ -455,6 +538,10 @=
@
         cmocka_unit_test(test_build_probe_reply_valid),
         cmocka_=
unit_test(test_build_probe_reply_stale),
         cmocka_unit_test(test_bui=
ld_probe_reply_no_parameter),
+        cmocka_unit_test(test_client_reply_r=
ead_finds_reply),
+        cmocka_unit_test(test_client_reply_read_skips_un=
known),
+        cmocka_unit_test(test_client_reply_read_missing),
+       =
 cmocka_unit_test(test_client_reply_read_wrong_msg_type),
     };
 
     re=
turn cmocka_run_group_tests_name("oob tests", tests, NULL, NULL);

-- 
To v=
iew, visit http://gerrit=2Eopenvpn=2Enet/c/openvpn/+/1745?usp=3Demail
To un=
subscribe, or for help writing mail filters, visit http://gerrit=2Eopenvpn=
=2Enet/settings?usp=3Demail

Gerrit-MessageType: newpatchset
Gerrit-Project=
: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: If04ce09d4c353f5384c0c48f=
48f63e05869a373f
Gerrit-Change-Number: 1745
Gerrit-PatchSet: 10
Gerrit-Owne=
r: stipa <lstipakov@gmail=2Ecom>
Gerrit-Reviewer: flichtenheld <frank@licht=
enheld=2Ecom>
Gerrit-Reviewer: plaisthos <arne-openvpn@rfc2549=2Eorg>
Gerri=
t-CC: openvpn-devel <openvpn-devel@lists=2Esourceforge=2Enet>
Gerrit-Attent=
ion: plaisthos <arne-openvpn@rfc2549=2Eorg>
Gerrit-Attention: flichtenheld =
<frank@lichtenheld=2Ecom>

--RIeYWC5O+qA=
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html><html><head><style></style></head><body><p> Attention is cur=
rently required from: flichtenheld, plaisthos=2E </p>
<p>stipa <strong>uplo=
aded patch set #10</strong> to this change=2E</p><p><a href=3D"http://gerri=
t=2Eopenvpn=2Enet/c/openvpn/+/1745?usp=3Demail">View Change</a></p><pre cla=
ss=3D"blocks" style=3D"font-family: monospace,monospace; white-space: pre-w=
rap;">oob: Add client PROBE_REPLY parser<br><br>Add oob_client_reply_read()=
, the client-side counterpart of<br>oob_server_probe_read(): it scans the T=
LV payload of a received PROBE_REPLY<br>for the probe_reply TLV, skipping o=
ther/future TLV types=2E Both readers use<br>the shared ctrl_msg_find_tlv()=
 from control_msg=2Eh for the scan=2E<br><br>Exercised by unit tests; the c=
lient probe path calls it in a follow-up=2E<br><br>Change-Id: If04ce09d4c35=
3f5384c0c48f48f63e05869a373f<br>Signed-off-by: Lev Stipakov &lt;lev@openvpn=
=2Enet&gt;<br>---<br>M src/openvpn/oob=2Ec<br>M src/openvpn/oob=2Eh<br>M te=
sts/unit_tests/openvpn/test_oob=2Ec<br>3 files changed, 117 insertions(+), =
0 deletions(-)<br><br></pre><pre class=3D"blocks" style=3D"font-family: mon=
ospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit=2Eopenvpn=
=2Enet:29418/openvpn refs/changes/45/1745/10</pre><pre style=3D"font-family=
: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/openv=
pn/oob=2Ec b/src/openvpn/oob=2Ec</span><br><span>index c841d59=2E=2Ebc0e7a3=
 100644</span><br><span>--- a/src/openvpn/oob=2Ec</span><br><span>+++ b/src=
/openvpn/oob=2Ec</span><br><span>@@ -112,6 +112,23 @@</span><br><span> }</s=
pan><br><span> </span><br><span> bool</span><br><span style=3D"color: hsl(1=
20, 100%, 40%);">+oob_client_reply_read(struct buffer *payload, struct oob_=
probe_reply *reply)</span><br><span style=3D"color: hsl(120, 100%, 40%);">+=
{</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    if (!ctrl_msg_=
read_header(payload, OOB_MSG_PROBE_REPLY))</span><br><span style=3D"color: =
hsl(120, 100%, 40%);">+    {</span><br><span style=3D"color: hsl(120, 100%,=
 40%);">+        return false;</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+    }</span><br><span style=3D"color: hsl(120, 100%, 40%);">+</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+    struct buffer valu=
e;</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    if (!ctrl_msg=
_find_tlv(payload, OOB_TLV_PROBE_REPLY, &amp;value))</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+    {</span><br><span style=3D"color: hsl=
(120, 100%, 40%);">+        return false;</span><br><span style=3D"color: h=
sl(120, 100%, 40%);">+    }</span><br><span style=3D"color: hsl(120, 100%, =
40%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    return =
oob_probe_reply_read(&amp;value, reply);</span><br><span style=3D"color: hs=
l(120, 100%, 40%);">+}</span><br><span style=3D"color: hsl(120, 100%, 40%);=
">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+bool</span><br><=
span> oob_timestamp_in_window(uint64_t probe_ts, uint64_t now, uint64_t win=
dow_secs)</span><br><span> {</span><br><span>     uint64_t diff =3D (now &g=
t; probe_ts) ? (now - probe_ts) : (probe_ts - now);</span><br><span>diff --=
git a/src/openvpn/oob=2Eh b/src/openvpn/oob=2Eh</span><br><span>index 49d64=
e8=2E=2E80775a4 100644</span><br><span>--- a/src/openvpn/oob=2Eh</span><br>=
<span>+++ b/src/openvpn/oob=2Eh</span><br><span>@@ -132,6 +132,19 @@</span>=
<br><span> bool oob_client_reply_write(struct buffer *buf, const struct oob=
_probe_reply *reply);</span><br><span> </span><br><span> /**</span><br><spa=
n style=3D"color: hsl(120, 100%, 40%);">+ * Read a received OOB PROBE_REPLY=
: verify its message-type header, then scan</span><br><span style=3D"color:=
 hsl(120, 100%, 40%);">+ * for the probe_reply TLV; the client-side counter=
part of</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ * oob_serve=
r_probe_read()=2E TLV types other than probe_reply are skipped=2E</span><br=
><span style=3D"color: hsl(120, 100%, 40%);">+ * payload is consumed as it =
is read=2E</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ *</span>=
<br><span style=3D"color: hsl(120, 100%, 40%);">+ * @param payload  buffer =
positioned at the start of the OOB message payload</span><br><span style=3D=
"color: hsl(120, 100%, 40%);">+ * @param reply    filled with the parsed pr=
obe_reply on success</span><br><span style=3D"color: hsl(120, 100%, 40%);">=
+ * @return true if the header matched and a well-formed probe_reply was fo=
und,</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ *         fals=
e otherwise</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ */</spa=
n><br><span style=3D"color: hsl(120, 100%, 40%);">+bool oob_client_reply_re=
ad(struct buffer *payload, struct oob_probe_reply *reply);</span><br><span =
style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl=
(120, 100%, 40%);">+/**</span><br><span>  * Check whether a probe timestamp=
 is within an acceptable window around the</span><br><span>  * current time=
=2E Used to cheaply drop replayed or implausibly-timed probes</span><br><sp=
an>  * before doing any further work (see the probe_parameter timestamp rat=
ionale</span><br><span>diff --git a/tests/unit_tests/openvpn/test_oob=2Ec b=
/tests/unit_tests/openvpn/test_oob=2Ec</span><br><span>index 371cbc6=2E=2E4=
8bec2d 100644</span><br><span>--- a/tests/unit_tests/openvpn/test_oob=2Ec</=
span><br><span>+++ b/tests/unit_tests/openvpn/test_oob=2Ec</span><br><span>=
@@ -434,6 +434,89 @@</span><br><span>     gc_free(&amp;gc);</span><br><span=
> }</span><br><span> </span><br><span style=3D"color: hsl(120, 100%, 40%);"=
>+/* A PROBE_REPLY carrying a probe_reply is found by the client scan, with=
 all</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ * fields survi=
ving=2E */</span><br><span style=3D"color: hsl(120, 100%, 40%);">+static vo=
id</span><br><span style=3D"color: hsl(120, 100%, 40%);">+test_client_reply=
_read_finds_reply(void **state)</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+{</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    st=
ruct gc_arena gc =3D gc_new();</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+    struct buffer buf =3D alloc_buf_gc(128, &amp;gc);</span><br>=
<span style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"colo=
r: hsl(120, 100%, 40%);">+    struct oob_probe_reply in =3D {</span><br><sp=
an style=3D"color: hsl(120, 100%, 40%);">+        =2Epriority =3D 5,</span>=
<br><span style=3D"color: hsl(120, 100%, 40%);">+        =2Eweight =3D 50,<=
/span><br><span style=3D"color: hsl(120, 100%, 40%);">+        =2Econnect_l=
ifetime =3D 120,</span><br><span style=3D"color: hsl(120, 100%, 40%);">+   =
     =2Eflags =3D 1,</span><br><span style=3D"color: hsl(120, 100%, 40%);">=
+    };</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    memcpy(i=
n=2Epeer_session_id=2Eid, &quot;SRVREPLY&quot;, SID_SIZE);</span><br><span =
style=3D"color: hsl(120, 100%, 40%);">+    assert_true(oob_client_reply_wri=
te(&amp;buf, &amp;in));</span><br><span style=3D"color: hsl(120, 100%, 40%)=
;">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    struct oob_=
probe_reply out =3D { 0 };</span><br><span style=3D"color: hsl(120, 100%, 4=
0%);">+    assert_true(oob_client_reply_read(&amp;buf, &amp;out));</span><b=
r><span style=3D"color: hsl(120, 100%, 40%);">+    assert_memory_equal(out=
=2Epeer_session_id=2Eid, in=2Epeer_session_id=2Eid, SID_SIZE);</span><br><s=
pan style=3D"color: hsl(120, 100%, 40%);">+    assert_int_equal(out=2Eprior=
ity, in=2Epriority);</span><br><span style=3D"color: hsl(120, 100%, 40%);">=
+    assert_int_equal(out=2Eweight, in=2Eweight);</span><br><span style=3D"=
color: hsl(120, 100%, 40%);">+    assert_int_equal(out=2Econnect_lifetime, =
in=2Econnect_lifetime);</span><br><span style=3D"color: hsl(120, 100%, 40%)=
;">+    assert_int_equal(out=2Eflags, in=2Eflags);</span><br><span style=3D=
"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(120, 10=
0%, 40%);">+    gc_free(&amp;gc);</span><br><span style=3D"color: hsl(120, =
100%, 40%);">+}</span><br><span style=3D"color: hsl(120, 100%, 40%);">+</sp=
an><br><span style=3D"color: hsl(120, 100%, 40%);">+/* TLVs other than prob=
e_reply are skipped=2E */</span><br><span style=3D"color: hsl(120, 100%, 40=
%);">+static void</span><br><span style=3D"color: hsl(120, 100%, 40%);">+te=
st_client_reply_read_skips_unknown(void **state)</span><br><span style=3D"c=
olor: hsl(120, 100%, 40%);">+{</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+    struct gc_arena gc =3D gc_new();</span><br><span style=3D"co=
lor: hsl(120, 100%, 40%);">+    struct buffer buf =3D alloc_buf_gc(128, &am=
p;gc);</span><br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br><s=
pan style=3D"color: hsl(120, 100%, 40%);">+    assert_true(buf_write_u16(&a=
mp;buf, OOB_MSG_PROBE_REPLY));</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+    assert_true(ctrl_msg_tlv_write_header(&amp;buf, 0x7ff, false=
, 4));</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    assert_tr=
ue(buf_write_u32(&amp;buf, 0xabad1dea));</span><br><span style=3D"color: hs=
l(120, 100%, 40%);">+    struct oob_probe_reply in =3D { =2Epriority =3D 7 =
};</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    assert_true(o=
ob_probe_reply_write(&amp;buf, &amp;in));</span><br><span style=3D"color: h=
sl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);=
">+    struct oob_probe_reply out =3D { 0 };</span><br><span style=3D"color=
: hsl(120, 100%, 40%);">+    assert_true(oob_client_reply_read(&amp;buf, &a=
mp;out));</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    assert=
_int_equal(out=2Epriority, 7);</span><br><span style=3D"color: hsl(120, 100=
%, 40%);">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    gc_f=
ree(&amp;gc);</span><br><span style=3D"color: hsl(120, 100%, 40%);">+}</spa=
n><br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+/* A payload with no probe_reply is rejec=
ted=2E */</span><br><span style=3D"color: hsl(120, 100%, 40%);">+static voi=
d</span><br><span style=3D"color: hsl(120, 100%, 40%);">+test_client_reply_=
read_missing(void **state)</span><br><span style=3D"color: hsl(120, 100%, 4=
0%);">+{</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    struct =
gc_arena gc =3D gc_new();</span><br><span style=3D"color: hsl(120, 100%, 40=
%);">+    struct buffer buf =3D alloc_buf_gc(128, &amp;gc);</span><br><span=
 style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hs=
l(120, 100%, 40%);">+    assert_true(buf_write_u16(&amp;buf, OOB_MSG_PROBE_=
REPLY));</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    assert_=
true(ctrl_msg_tlv_write_header(&amp;buf, 0x7ff, false, 4));</span><br><span=
 style=3D"color: hsl(120, 100%, 40%);">+    assert_true(buf_write_u32(&amp;=
buf, 0));</span><br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br=
><span style=3D"color: hsl(120, 100%, 40%);">+    struct oob_probe_reply ou=
t =3D { 0 };</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    ass=
ert_false(oob_client_reply_read(&amp;buf, &amp;out));</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(120,=
 100%, 40%);">+    gc_free(&amp;gc);</span><br><span style=3D"color: hsl(12=
0, 100%, 40%);">+}</span><br><span style=3D"color: hsl(120, 100%, 40%);">+<=
/span><br><span style=3D"color: hsl(120, 100%, 40%);">+/* Likewise, a PROBE=
_REPLY reader rejects a payload with the wrong message</span><br><span styl=
e=3D"color: hsl(120, 100%, 40%);">+ * type even when a valid probe_reply TL=
V follows=2E */</span><br><span style=3D"color: hsl(120, 100%, 40%);">+stat=
ic void</span><br><span style=3D"color: hsl(120, 100%, 40%);">+test_client_=
reply_read_wrong_msg_type(void **state)</span><br><span style=3D"color: hsl=
(120, 100%, 40%);">+{</span><br><span style=3D"color: hsl(120, 100%, 40%);"=
>+    struct gc_arena gc =3D gc_new();</span><br><span style=3D"color: hsl(=
120, 100%, 40%);">+    struct buffer buf =3D alloc_buf_gc(128, &amp;gc);</s=
pan><br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+    assert_true(buf_write_u16(&amp;buf, O=
OB_MSG_SERVER_PROBE));</span><br><span style=3D"color: hsl(120, 100%, 40%);=
">+    struct oob_probe_reply in =3D { =2Epriority =3D 7 };</span><br><span=
 style=3D"color: hsl(120, 100%, 40%);">+    assert_true(oob_probe_reply_wri=
te(&amp;buf, &amp;in));</span><br><span style=3D"color: hsl(120, 100%, 40%)=
;">+</span><br><span style=3D"color: hsl(120, 100%, 40%);">+    struct oob_=
probe_reply out =3D { 0 };</span><br><span style=3D"color: hsl(120, 100%, 4=
0%);">+    assert_false(oob_client_reply_read(&amp;buf, &amp;out));</span><=
br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"c=
olor: hsl(120, 100%, 40%);">+    gc_free(&amp;gc);</span><br><span style=3D=
"color: hsl(120, 100%, 40%);">+}</span><br><span style=3D"color: hsl(120, 1=
00%, 40%);">+</span><br><span> int</span><br><span> main(void)</span><br><s=
pan> {</span><br><span>@@ -455,6 +538,10 @@</span><br><span>         cmocka=
_unit_test(test_build_probe_reply_valid),</span><br><span>         cmocka_u=
nit_test(test_build_probe_reply_stale),</span><br><span>         cmocka_uni=
t_test(test_build_probe_reply_no_parameter),</span><br><span style=3D"color=
: hsl(120, 100%, 40%);">+        cmocka_unit_test(test_client_reply_read_fi=
nds_reply),</span><br><span style=3D"color: hsl(120, 100%, 40%);">+        =
cmocka_unit_test(test_client_reply_read_skips_unknown),</span><br><span sty=
le=3D"color: hsl(120, 100%, 40%);">+        cmocka_unit_test(test_client_re=
ply_read_missing),</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ =
       cmocka_unit_test(test_client_reply_read_wrong_msg_type),</span><br><=
span>     };</span><br><span> </span><br><span>     return cmocka_run_group=
_tests_name(&quot;oob tests&quot;, tests, NULL, NULL);</span><br><span></sp=
an><br></pre><p>To view, visit <a href=3D"http://gerrit=2Eopenvpn=2Enet/c/o=
penvpn/+/1745?usp=3Demail">change 1745</a>=2E To unsubscribe, or for help w=
riting mail filters, visit <a href=3D"http://gerrit=2Eopenvpn=2Enet/setting=
s?usp=3Demail">settings</a>=2E</p><div itemscope itemtype=3D"http://schema=
=2Eorg/EmailMessage"><div itemscope itemprop=3D"action" itemtype=3D"http://=
schema=2Eorg/ViewAction"><link itemprop=3D"url" href=3D"http://gerrit=2Eope=
nvpn=2Enet/c/openvpn/+/1745?usp=3Demail"/><meta itemprop=3D"name" content=
=3D"View Change"/></div></div>

<div style=3D"display:none"> Gerrit-Message=
Type: newpatchset </div>
<div style=3D"display:none"> Gerrit-Project: openv=
pn </div>
<div style=3D"display:none"> Gerrit-Branch: master </div>
<div st=
yle=3D"display:none"> Gerrit-Change-Id: If04ce09d4c353f5384c0c48f48f63e0586=
9a373f </div>
<div style=3D"display:none"> Gerrit-Change-Number: 1745 </div=
>
<div style=3D"display:none"> Gerrit-PatchSet: 10 </div>
<div style=3D"dis=
play:none"> Gerrit-Owner: stipa &lt;lstipakov@gmail=2Ecom&gt; </div>
<div s=
tyle=3D"display:none"> Gerrit-Reviewer: flichtenheld &lt;frank@lichtenheld=
=2Ecom&gt; </div>
<div style=3D"display:none"> Gerrit-Reviewer: plaisthos &=
lt;arne-openvpn@rfc2549=2Eorg&gt; </div>
<div style=3D"display:none"> Gerri=
t-CC: openvpn-devel &lt;openvpn-devel@lists=2Esourceforge=2Enet&gt; </div>
=
<div style=3D"display:none"> Gerrit-Attention: plaisthos &lt;arne-openvpn@r=
fc2549=2Eorg&gt; </div>
<div style=3D"display:none"> Gerrit-Attention: flic=
htenheld &lt;frank@lichtenheld=2Ecom&gt; </div>

</body></html>
--RIeYWC5O+qA=--


--===============3770097776259194412==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============3770097776259194412==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

--===============3770097776259194412==--