FreeBSD returns a socklen of sockaddr_storage when doing an accept on an unix
STREAM socket. The current code will assume it means a sun_path larger than 0.
That breaks some tests like the one below which don't expect to find "unix::" on
the logs.
As a Linux abstract address would not have a more useful name either, it's
better to check that sun_path starts with a non-zero byte and return 0 length in
case it doesn't.
402: ovs-ofctl replace-flows with --bundle FAILED (ovs-ofctl.at:2928)
2016-07-08T12:44:30.068Z|00020|vconn|DBG|unix:: sent (Success): OFPT_HELLO (OF1.6) (xid=0x1):
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@redhat.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
-get_unix_name_len(socklen_t sun_len)
+get_unix_name_len(const struct sockaddr_un *sun, socklen_t sun_len)
- return (sun_len >= offsetof(struct sockaddr_un, sun_path)
+ return (sun_len >= offsetof(struct sockaddr_un, sun_path) &&
+ sun->sun_path[0] != 0
? sun_len - offsetof(struct sockaddr_un, sun_path)
: 0);
}
? sun_len - offsetof(struct sockaddr_un, sun_path)
: 0);
}
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <stdbool.h>
#include "openvswitch/types.h"
#include <netinet/in.h>
#include <stdbool.h>
#include "openvswitch/types.h"
int make_unix_socket(int style, bool nonblock,
const char *bind_path, const char *connect_path);
int make_unix_socket(int style, bool nonblock,
const char *bind_path, const char *connect_path);
-int get_unix_name_len(socklen_t sun_len);
+int get_unix_name_len(const struct sockaddr_un *sun, socklen_t sun_len);
/* Helpers for calling ioctl() on an AF_INET socket. */
struct ifreq;
/* Helpers for calling ioctl() on an AF_INET socket. */
struct ifreq;
struct stream **streamp)
{
const struct sockaddr_un *sun = (const struct sockaddr_un *) ss;
struct stream **streamp)
{
const struct sockaddr_un *sun = (const struct sockaddr_un *) ss;
- int name_len = get_unix_name_len(ss_len);
+ int name_len = get_unix_name_len(sun, ss_len);
char name[128];
if (name_len > 0) {
char name[128];
if (name_len > 0) {