mirror of
https://github.com/OpenVPN/openvpn.git
synced 2025-05-08 21:25:53 +08:00
Allow trailing \r and \n in control channel message
Writing a reason from a script will easily end up adding extra \r\n characters at the end of the reason. Our current code pushes this to the peer. So be more liberal in accepting these message. Github: closes OpenVPN/openvpn#568 This is the backport of the fix (commit be31325e1dfdffb) to release/2.5. Change-Id: I47c992b6b73b1475cbff8a28f720cf50dc1fbe3e Signed-off-by: Arne Schwabe <arne@rfc2549.org> Signed-off-by: Frank Lichtenheld <frank@lichtenheld.com> Acked-by: Gert Doering <gert@greenie.muc.de> Message-Id: <20240711113022.52076-1-frank@lichtenheld.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg28923.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
parent
d4921ba22f
commit
dddb87f126
@ -221,6 +221,46 @@ parse_incoming_control_channel_command(struct context *c, struct buffer *buf)
|
||||
}
|
||||
}
|
||||
|
||||
static struct buffer
|
||||
extract_command_buffer(struct buffer *buf, struct gc_arena *gc)
|
||||
{
|
||||
/* commands on the control channel are seperated by 0x00 bytes.
|
||||
* cmdlen does not include the 0 byte of the string */
|
||||
int cmdlen = (int)strnlen(BSTR(buf), BLEN(buf));
|
||||
|
||||
if (cmdlen >= BLEN(buf))
|
||||
{
|
||||
buf_advance(buf, cmdlen);
|
||||
/* Return empty buffer */
|
||||
struct buffer empty = { 0 };
|
||||
return empty;
|
||||
}
|
||||
|
||||
/* include the NUL byte and ensure NUL termination */
|
||||
cmdlen += 1;
|
||||
|
||||
/* Construct a buffer that only holds the current command and
|
||||
* its closing NUL byte */
|
||||
struct buffer cmdbuf = alloc_buf_gc(cmdlen, gc);
|
||||
buf_write(&cmdbuf, BPTR(buf), cmdlen);
|
||||
|
||||
/* Remove \r and \n at the end of the buffer to avoid
|
||||
* problems with scripts and other that add extra \r and \n */
|
||||
buf_chomp(&cmdbuf);
|
||||
|
||||
/* check we have only printable characters or null byte in the
|
||||
* command string and no newlines */
|
||||
if (!string_check_buf(&cmdbuf, CC_PRINT | CC_NULL, CC_CRLF))
|
||||
{
|
||||
msg(D_PUSH_ERRORS, "WARNING: Received control with invalid characters: %s",
|
||||
format_hex(BPTR(&cmdbuf), BLEN(&cmdbuf), 256, gc));
|
||||
cmdbuf.len = 0;
|
||||
}
|
||||
|
||||
buf_advance(buf, cmdlen);
|
||||
return cmdbuf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle incoming configuration
|
||||
* messages on the control channel.
|
||||
@ -236,41 +276,14 @@ check_incoming_control_channel(struct context *c)
|
||||
struct buffer buf = alloc_buf_gc(len, &gc);
|
||||
if (tls_rec_payload(c->c2.tls_multi, &buf))
|
||||
{
|
||||
|
||||
while (BLEN(&buf) > 1)
|
||||
{
|
||||
/* commands on the control channel are seperated by 0x00 bytes.
|
||||
* cmdlen does not include the 0 byte of the string */
|
||||
int cmdlen = (int)strnlen(BSTR(&buf), BLEN(&buf));
|
||||
struct buffer cmdbuf = extract_command_buffer(&buf, &gc);
|
||||
|
||||
if (cmdlen < BLEN(&buf))
|
||||
if (cmdbuf.len > 0)
|
||||
{
|
||||
/* include the NUL byte and ensure NUL termination */
|
||||
int cmdlen = (int)strlen(BSTR(&buf)) + 1;
|
||||
|
||||
/* Construct a buffer that only holds the current command and
|
||||
* its closing NUL byte */
|
||||
struct buffer cmdbuf = alloc_buf_gc(cmdlen, &gc);
|
||||
buf_write(&cmdbuf, BPTR(&buf), cmdlen);
|
||||
|
||||
/* check we have only printable characters or null byte in the
|
||||
* command string and no newlines */
|
||||
if (!string_check_buf(&buf, CC_PRINT | CC_NULL, CC_CRLF))
|
||||
{
|
||||
msg(D_PUSH_ERRORS, "WARNING: Received control with invalid characters: %s",
|
||||
format_hex(BPTR(&buf), BLEN(&buf), 256, &gc));
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_incoming_control_channel_command(c, &cmdbuf);
|
||||
}
|
||||
parse_incoming_control_channel_command(c, &cmdbuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg(D_PUSH_ERRORS, "WARNING: Ignoring control channel "
|
||||
"message command without NUL termination");
|
||||
}
|
||||
buf_advance(&buf, cmdlen);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user