20 msg(
M_WARN,
"Offending option received from server");
73 unsigned int permission_mask,
unsigned int *option_types_found,
84 while (
buf_parse(buf,
',', line,
sizeof(line)))
86 unsigned int push_update_option_flags = 0;
92 while (isspace(line[i]))
109 if (strncmp(&line[i],
"route ", 6) == 0)
120 else if (!strcmp(&line[i],
"push-continuation 2"))
124 else if (!strcmp(&line[i],
"push-continuation 1"))
134 bool honor_received_options,
unsigned int permission_mask,
135 unsigned int *option_types_found)
163#ifndef ENABLE_MANAGEMENT
207 "PUSH_UPDATE,dhcp-option DNS 8.8.8.8, route 0.0.0.0 0.0.0.0 10.10.10.1";
209 unsigned int option_types_found = 0;
212 &option_types_found),
223 const char *
update_msg =
"PUSH_UPDATEerr,dhcp-option DNS 8.8.8.8";
225 unsigned int option_types_found = 0;
228 &option_types_found),
239 const char *
update_msg =
"PUSH_UPDATE ,dhcp-option DNS 8.8.8.8";
241 unsigned int option_types_found = 0;
244 &option_types_found),
255 const char *
update_msg =
"PUSH_UPDATE, -?dns, route something, ?dhcp-option DNS 8.8.8.8";
257 unsigned int option_types_found = 0;
260 &option_types_found),
271 const char *
update_msg =
"PUSH_UPDATE, -dhcp-option, ?-dns";
273 unsigned int option_types_found = 0;
276 &option_types_found),
287 const char *
update_msg =
"PUSH_UPDATE, dev tun";
289 unsigned int option_types_found = 0;
292 &option_types_found),
304 "PUSH_UPDATE,-dhcp-option, route 10.10.10.0, dhcp-option DNS 1.1.1.1, route 10.11.12.0, dhcp-option DOMAIN corp.local, keepalive 10 60";
306 unsigned int option_types_found = 0;
309 &option_types_found),
321 "PUSH_UPDATE,-dhcp-option,dhcp-option DNS 8.8.8.8,redirect-gateway local,route 192.168.1.0 255.255.255.0";
323 unsigned int option_types_found = 0;
326 &option_types_found),
347 unsigned int option_types_found = 0;
353 const char *
msg1 =
"PUSH_UPDATE, route 10.1.0.0 255.255.0.0, route 10.2.0.0 255.255.0.0, route 10.3.0.0 255.255.0.0,push-continuation 2";
357 &option_types_found),
363 const char *
msg2 =
"PUSH_UPDATE, route 10.4.0.0 255.255.0.0, route 10.5.0.0 255.255.0.0, route 10.6.0.0 255.255.0.0,push-continuation 2";
367 &option_types_found),
373 const char *
msg3 =
"PUSH_UPDATE, route 10.7.0.0 255.255.0.0, route 10.8.0.0 255.255.0.0, route 10.9.0.0 255.255.0.0,push-continuation 1";
377 &option_types_found),
391#ifdef ENABLE_MANAGEMENT
393 "PUSH_UPDATE,redirect-gateway local,route 192.168.1.0 255.255.255.0",
397 "PUSH_UPDATE,-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
398 "PUSH_UPDATE, akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8,redirect-gateway local,push-continuation 2",
399 "PUSH_UPDATE,route 192.168.1.0 255.255.255.0,push-continuation 1",
407 "PUSH_UPDATE,-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
408 "PUSH_UPDATE, akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local,push-continuation 2",
409 "PUSH_UPDATE, route 192.168.1.0 255.255.255.0,,push-continuation 1",
413 "PUSH_UPDATE,,-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
414 "PUSH_UPDATE, akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local,push-continuation 2",
415 "PUSH_UPDATE, route 192.168.1.0 255.255.255.0,push-continuation 1",
419 "PUSH_UPDATE,-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
420 "PUSH_UPDATE, akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8, redirect-gateway 10.10.10.10,,push-continuation 2",
421 "PUSH_UPDATE, route 192.168.1.0 255.255.255.0,,push-continuation 1",
425 "PUSH_UPDATE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,push-continuation 2",
426 "PUSH_UPDATE,,,,,,,,,,,,,,,,,,,push-continuation 1",
430 "PUSH_UPDATE,-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
431 "PUSH_UPDATE, akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8,redirect-gateway\n local,push-continuation 2",
432 "PUSH_UPDATE,route 192.168.1.0 255.255.255.0\n\n\n,push-continuation 1",
440 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
441 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
442 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
443 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
444 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 1",
448 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,push-continuation 2",
449 "PUSH_UPDATE,abc,push-continuation 1",
453 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,",
457 "PUSH_UPDATE,a,push-continuation 2",
458 "PUSH_UPDATE,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,push-continuation 2",
459 "PUSH_UPDATE,a,push-continuation 1",
463const char *
msg0 =
"redirect-gateway local,route 192.168.1.0 255.255.255.0";
464const char *
msg1 =
"-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,"
465 " akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8,redirect-gateway local,route 192.168.1.0 255.255.255.0";
468const char *
msg4 =
"-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,"
469 " akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local, route 192.168.1.0 255.255.255.0,";
470const char *
msg5 =
",-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,"
471 " akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local, route 192.168.1.0 255.255.255.0";
472const char *
msg6 =
"-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf, akakakakakakakakakakakaf,"
473 " dhcp-option DNS 8.8.8.8, redirect-gateway 10.10.10.10,, route 192.168.1.0 255.255.255.0,";
474const char *
msg7 =
",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
475const char *
msg8 =
"-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf, akakakakakakakakakakakaf,"
476 " dhcp-option DNS 8.8.8.8,redirect-gateway\n local,route 192.168.1.0 255.255.255.0\n\n\n";
479const char *
msg10 =
"abandon ability able about above absent absorb abstract absurd abuse access accident account accuse achieve"
480 "acid acoustic acquire across act action actor actress actual adapt add addict address adjust"
481 "baby bachelor bacon badge bag balance balcony ball bamboo banana banner bar barely bargain barrel base basic"
482 "basket battle beach bean beauty because become beef before begin behave behind"
483 "cabbage cabin cable cactus cage cake call calm camera camp can canal cancel candy cannon canoe canvas canyon"
484 "capable capital captain car carbon card cargo carpet carry cart case"
485 "daisy damage damp dance danger daring dash daughter dawn day deal debate debris decade december decide decline"
486 "decorate decrease deer defense define defy degree delay deliver demand demise denial";
488const char *
msg11 =
"a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
489 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
490 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
491 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
492 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a";
494const char *
msg12 =
"a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,abc";
496const char *
msg13 =
"a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,";
498const char *
msg14 =
"a,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,a";
500#define PUSH_BUNDLE_SIZE_TEST 184
502#define expect_control_channel_strings(res) \
505 for (int j = 0; res[j] != NULL; j++) \
507 expect_string(send_control_channel_string, str, res[j]); \
515 const unsigned long cid = 0;
524 const unsigned long cid = 0;
533 const unsigned long cid = 0;
541 const unsigned long cid = 0;
550 const unsigned long cid = 0;
559 const unsigned long cid = 0;
568 const unsigned long cid = 0;
577 const unsigned long cid = 0;
586 const unsigned long cid = 0;
595 const unsigned long cid = 0;
604 const unsigned long cid = 0;
612 const unsigned long cid = 0;
621 const unsigned long cid = 0;
630 const unsigned long cid = 0;
639 const unsigned long cid = 0;
644#undef PUSH_BUNDLE_SIZE_TEST
663 free((*(m->
instances))->context.c2.tls_multi);
692 const struct CMUnitTest tests[] = {
704#ifdef ENABLE_MANAGEMENT
724 return cmocka_run_group_tests(tests, NULL, NULL);
bool buf_string_compare_advance(struct buffer *src, const char *match)
void free_buf(struct buffer *buf)
struct buffer alloc_buf(size_t size)
bool buf_parse(struct buffer *buf, const int delim, char *line, const int size)
static bool buf_write(struct buffer *dest, const void *src, size_t size)
Header file for server-mode related structures and functions.
#define OPT_P_NCP
Negotiable crypto parameters.
#define OPT_P_EXPLICIT_NOTIFY
#define OPT_P_ROUTE_EXTRAS
bool check_push_update_option_flags(char *line, int *i, unsigned int *flags)
Checks the formatting and validity of options inside push-update messages.
bool apply_pull_filter(const struct options *o, char *line)
Filter an option line by all pull filters.
int process_push_update(struct context *c, struct options *o, unsigned int permission_mask, unsigned int *option_types_found, struct buffer *buf, bool msg_sender)
Handles the receiving of a push-update message and applies updates to the specified options.
#define PUSH_OPT_OPTIONAL
#define PUSH_MSG_CONTINUATION
static int send_push_update(struct multi_context *m, const void *target, const char *msg, const push_update_type type, const size_t push_bundle_size)
A function to send a PUSH_UPDATE control message from server to client(s).
#define IV_PROTO_PUSH_UPDATE
Supports push-update.
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Contains all state information for one tunnel.
struct context_2 c2
Level 2 context.
struct options options
Options loaded from command line or configuration file.
Main OpenVPN server state structure.
struct context top
Storage structure for process-wide configuration.
struct multi_instance ** instances
Array of multi_instances.
Server-mode state structure for one single VPN tunnel.
struct context context
The context structure storing state for this VPN tunnel.
unsigned int push_update_options_found
struct pull_filter_list * pull_filter_list
Security parameter state for a single VPN tunnel.
bool options_postprocess_pull(struct options *options, struct env_set *es)
static void test_send_push_msg2(void **state)
bool send_control_channel_string(struct context *c, const char *str, msglvl_t msglevel)
static int teardown(void **state)
static void test_send_push_msg9(void **state)
static void test_send_push_msg11(void **state)
void throw_signal_soft(const int signum, const char *signal_text)
Throw a soft global signal.
static void test_send_push_msg4(void **state)
static void test_send_push_msg1(void **state)
bool mroute_extract_openvpn_sockaddr(struct mroute_addr *addr, const struct openvpn_sockaddr *osaddr, bool use_port)
static void test_send_push_msg3(void **state)
static void reset_route_counters(void)
static void test_send_push_msg0(void **state)
static void test_send_push_msg8(void **state)
struct multi_instance * lookup_by_cid(struct multi_context *m, const unsigned long cid)
static void test_send_push_msg12(void **state)
static int teardown2(void **state)
static int route_add_count
static void test_incoming_push_message_bad_format(void **state)
#define expect_control_channel_strings(res)
static void test_send_push_msg6(void **state)
static void test_send_push_msg7(void **state)
static void test_incoming_push_message_error2(void **state)
static void test_send_push_msg5(void **state)
static int setup2(void **state)
static void test_incoming_push_continuation_route_accumulation(void **state)
Test that routes accumulate correctly across multiple continuation messages.
static int route_reset_count
bool apply_push_options(struct context *c, struct options *options, struct buffer *buf, unsigned int permission_mask, unsigned int *option_types_found, struct env_set *es, bool is_update)
static void test_send_push_msg10(void **state)
static void test_incoming_push_message_mix(void **state)
static int setup(void **state)
static void test_incoming_push_message_basic(void **state)
static void test_incoming_push_message_1(void **state)
static void test_incoming_push_message_error1(void **state)
static void test_incoming_push_message_mix2(void **state)
static void test_send_push_msg13(void **state)
unsigned int extract_iv_proto(const char *peer_info)
Extracts the IV_PROTO variable and returns its value or 0 if it cannot be extracted.
void unlearn_ifconfig_ipv6(struct multi_context *m, struct multi_instance *mi)
void unlearn_ifconfig(struct multi_context *m, struct multi_instance *mi)
static void test_incoming_push_message_not_updatable_option(void **state)
#define PUSH_BUNDLE_SIZE_TEST
static void test_send_push_msg14(void **state)
void update_vhash(struct multi_context *m, struct multi_instance *mi, const char *new_ip, const char *new_ipv6)
Update the vhash with new IP/IPv6 addresses in the multi_context when a push-update message containin...
unsigned int pull_permission_mask(const struct context *c)
int process_incoming_push_msg(struct context *c, const struct buffer *buffer, bool honor_received_options, unsigned int permission_mask, unsigned int *option_types_found)
const char * tls_common_name(const struct tls_multi *multi, const bool null)
Returns the common name field for the given tunnel.