[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 <lev@openvpn=
=2Enet><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, &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(&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(&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, &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, "SRVREPLY", SID_SIZE);</span><br><span =
style=3D"color: hsl(120, 100%, 40%);">+ assert_true(oob_client_reply_wri=
te(&buf, &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(&buf, &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(&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(&buf, 0x7ff, false=
, 4));</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ assert_tr=
ue(buf_write_u32(&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(&buf, &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(&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(&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, &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(&buf, OOB_MSG_PROBE_=
REPLY));</span><br><span style=3D"color: hsl(120, 100%, 40%);">+ assert_=
true(ctrl_msg_tlv_write_header(&buf, 0x7ff, false, 4));</span><br><span=
style=3D"color: hsl(120, 100%, 40%);">+ assert_true(buf_write_u32(&=
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(&buf, &out));</span><br><span style=
=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"color: hsl(120,=
100%, 40%);">+ gc_free(&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, &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(&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(&buf, &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(&buf, &out));</span><=
br><span style=3D"color: hsl(120, 100%, 40%);">+</span><br><span style=3D"c=
olor: hsl(120, 100%, 40%);">+ gc_free(&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("oob tests", 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 <lstipakov@gmail=2Ecom> </div>
<div s=
tyle=3D"display:none"> Gerrit-Reviewer: flichtenheld <frank@lichtenheld=
=2Ecom> </div>
<div style=3D"display:none"> Gerrit-Reviewer: plaisthos &=
lt;arne-openvpn@rfc2549=2Eorg> </div>
<div style=3D"display:none"> Gerri=
t-CC: openvpn-devel <openvpn-devel@lists=2Esourceforge=2Enet> </div>
=
<div style=3D"display:none"> Gerrit-Attention: plaisthos <arne-openvpn@r=
fc2549=2Eorg> </div>
<div style=3D"display:none"> Gerrit-Attention: flic=
htenheld <frank@lichtenheld=2Ecom> </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==--