diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 433898aa34d..12016d9b6c7 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -6010,9 +6010,10 @@ void do_connect(struct st_command *command) { /* If the socket is specified just as a name without path + or an abstract socket indicator ('@'), then append tmpdir in front */ - if (*ds_sock.str != FN_LIBCHAR) + if (*ds_sock.str != FN_LIBCHAR && *ds_sock.str != '@') { char buff[FN_REFLEN]; fn_format(buff, ds_sock.str, TMPDIR, "", 0); diff --git a/mysql-test/main/connect-abstract.cnf b/mysql-test/main/connect-abstract.cnf new file mode 100644 index 00000000000..5798c4f2f2a --- /dev/null +++ b/mysql-test/main/connect-abstract.cnf @@ -0,0 +1,9 @@ + +!include include/default_my.cnf + +[mysqld.1] +socket= @ENV.ABSTRACT_SOCKET + +# Using @OPT.port here for uniqueness +[ENV] +ABSTRACT_SOCKET= @mtr-test-abstract-socket-@OPT.port diff --git a/mysql-test/main/connect-abstract.result b/mysql-test/main/connect-abstract.result new file mode 100644 index 00000000000..68a9674dfaa --- /dev/null +++ b/mysql-test/main/connect-abstract.result @@ -0,0 +1,5 @@ +connect con1,localhost,root,,test,,$ABSTRACT_SOCKET; +select 1; +1 +1 +disconnect con1; diff --git a/mysql-test/main/connect-abstract.test b/mysql-test/main/connect-abstract.test new file mode 100644 index 00000000000..0f212fe5a0d --- /dev/null +++ b/mysql-test/main/connect-abstract.test @@ -0,0 +1,6 @@ +--source include/linux.inc +--source include/not_embedded.inc + +connect(con1,localhost,root,,test,,$ABSTRACT_SOCKET); +select 1; +disconnect con1; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 2db3bbe1bac..716bd472934 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2784,9 +2784,10 @@ static void network_init(void) */ if (mysqld_unix_port[0] && !opt_bootstrap) { + size_t port_len; DBUG_PRINT("general",("UNIX Socket is %s",mysqld_unix_port)); - if (strlen(mysqld_unix_port) > (sizeof(UNIXaddr.sun_path) - 1)) + if ((port_len=strlen(mysqld_unix_port)) > (sizeof(UNIXaddr.sun_path) - 1)) { sql_print_error("The socket file path is too long (> %u): %s", (uint) sizeof(UNIXaddr.sun_path) - 1, mysqld_unix_port); @@ -2804,14 +2805,25 @@ static void network_init(void) bzero((char*) &UNIXaddr, sizeof(UNIXaddr)); UNIXaddr.sun_family = AF_UNIX; strmov(UNIXaddr.sun_path, mysqld_unix_port); - (void) unlink(mysqld_unix_port); +#if defined(__linux__) + /* Abstract socket */ + if (mysqld_unix_port[0] == '@') + UNIXaddr.sun_path[0]= '\0'; + else +#endif + (void) unlink(mysqld_unix_port); arg= 1; (void) mysql_socket_setsockopt(unix_sock,SOL_SOCKET,SO_REUSEADDR, (char*)&arg, sizeof(arg)); umask(0); if (mysql_socket_bind(unix_sock, reinterpret_cast(&UNIXaddr), - sizeof(UNIXaddr)) < 0) +#if defined(__linux__) + offsetof(struct sockaddr_un, sun_path) + port_len +#else + sizeof(UNIXaddr) +#endif + ) < 0) { sql_perror("Can't start server : Bind on unix socket"); /* purecov: tested */ sql_print_error("Do you already have another mysqld server running on socket: %s ?",mysqld_unix_port);