(I wonder if lladdr is too rarely-used option... :) )
Well, I researched on this problem a bit and wrote a patch, which is
probably low-quality (ideologically wrong) but, at least, fixes the
problem for me.
* Interesting note: line in options.c in current svn got comment '/*
FQDN -- IP address only */' near it and the same problem. Something is
quite wrong here...
P.S. Sorry for quite imperfect English.
--
"If everything seems under control, you're not going fast enough"
diff -dpr def/openvpn-2.1~rc9/options.c openvpn-2.1~rc9/options.c
*** def/openvpn-2.1~rc9/options.c 2008-09-05 21:13:50.765908501 +0500
--- openvpn-2.1~rc9/options.c 2008-09-06 12:12:44.089177436 +0500
*************** add_option (struct options *options,
*** 3432,3442 ****
else if (streq (p[0], "lladdr") && p[1])
{
VERIFY_PERMISSION (OPT_P_UP);
! if (ip_addr_dotted_quad_safe (p[1]))
options->lladdr = p[1];
else
{
! msg (msglevel, "lladdr parm '%s' must be an IP address", p[1]);
goto err;
}
}
--- 3432,3442 ----
else if (streq (p[0], "lladdr") && p[1])
{
VERIFY_PERMISSION (OPT_P_UP);
! if (mac_addr_safe (p[1]))
options->lladdr = p[1];
else
{
! msg (msglevel, "lladdr parm '%s' must be an MAC address", p[1]);
goto err;
}
}
diff -dpr def/openvpn-2.1~rc9/socket.c openvpn-2.1~rc9/socket.c
*** def/openvpn-2.1~rc9/socket.c 2008-09-05 21:13:54.719908359 +0500
--- openvpn-2.1~rc9/socket.c 2008-09-06 12:51:34.860177616 +0500
*************** ip_addr_dotted_quad_safe (const char *do
*** 294,299 ****
--- 294,340 ----
}
}
+ bool
+ mac_addr_safe (const char *mac_addr)
+ {
+ /* verify non-NULL */
+ if (!mac_addr)
+ return false;
+
+ /* verify length is within limits */
+ if (strlen (mac_addr) > 17)
+ return false;
+
+ /* verify that all chars are either alphanumeric or ':' and that no
+ alphanumeric substring is greater than 2 chars */
+ {
+ int nnum = 0;
+ const char *p = mac_addr;
+ int c;
+
+ while ((c = *p++))
+ {
+ if ( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') )
+ {
+ ++nnum;
+ if (nnum > 2)
+ return false;
+ }
+ else if (c == ':')
+ {
+ nnum = 0;
+ }
+ else
+ return false;
+ }
+ }
+
+ /* error-checking is left to script invoked in lladdr.c */
+ return true;
+
+ }
+
+
static void
update_remote (const char* host,
struct openvpn_sockaddr *addr,
diff -dpr def/openvpn-2.1~rc9/socket.h openvpn-2.1~rc9/socket.h
*** def/openvpn-2.1~rc9/socket.h 2008-09-05 21:13:47.757908852 +0500
--- openvpn-2.1~rc9/socket.h 2008-09-06 12:10:39.586178166 +0500
*************** void link_socket_update_buffer_sizes (st
*** 397,402 ****
--- 397,403 ----
#define OIA_ERROR -1
int openvpn_inet_aton (const char *dotted_quad, struct in_addr *addr);
bool ip_addr_dotted_quad_safe (const char *dotted_quad);
+ bool mac_addr_safe (const char *mac_addr);
socket_descriptor_t create_socket_tcp (void);