* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
lxc_log_define(lxc_af_unix, lxc);
-int lxc_af_unix_open(const char *path, int type, int flags)
+int lxc_abstract_unix_open(const char *path, int type, int flags)
{
int fd;
size_t len;
if (fd < 0)
return -1;
+ /* Clear address structure */
memset(&addr, 0, sizeof(addr));
if (!path)
return fd;
addr.sun_family = AF_UNIX;
- /* copy entire buffer in case of abstract socket */
- len = sizeof(addr.sun_path);
- if (path[0]) {
- len = strlen(path);
- if (len >= sizeof(addr.sun_path)) {
- process_lock();
- close(fd);
- process_unlock();
- errno = ENAMETOOLONG;
- return -1;
- }
+
+ len = strlen(&path[1]) + 1;
+ if (len >= sizeof(addr.sun_path) - 1) {
+ process_lock();
+ close(fd);
+ process_unlock();
+ errno = ENAMETOOLONG;
+ return -1;
}
- memcpy(addr.sun_path, path, len);
+ /* addr.sun_path[0] has already been set to 0 by memset() */
+ strncpy(&addr.sun_path[1], &path[1], strlen(&path[1]));
- if (bind(fd, (struct sockaddr *)&addr, sizeof(addr))) {
+ if (bind(fd, (struct sockaddr *)&addr, offsetof(struct sockaddr_un, sun_path) + len)) {
int tmp = errno;
process_lock();
close(fd);
return fd;
}
-int lxc_af_unix_close(int fd)
+int lxc_abstract_unix_close(int fd)
{
struct sockaddr_un addr;
socklen_t addrlen = sizeof(addr);
return 0;
}
-int lxc_af_unix_connect(const char *path)
+int lxc_abstract_unix_connect(const char *path)
{
int fd;
+ size_t len;
struct sockaddr_un addr;
process_lock();
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
- /* copy entire buffer in case of abstract socket */
- memcpy(addr.sun_path, path,
- path[0]?strlen(path):sizeof(addr.sun_path));
- if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) {
+ len = strlen(&path[1]) + 1;
+ if (len >= sizeof(addr.sun_path) - 1) {
+ process_lock();
+ close(fd);
+ process_unlock();
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ /* addr.sun_path[0] has already been set to 0 by memset() */
+ strncpy(&addr.sun_path[1], &path[1], strlen(&path[1]));
+
+ if (connect(fd, (struct sockaddr *)&addr, offsetof(struct sockaddr_un, sun_path) + len)) {
int tmp = errno;
process_lock();
close(fd);
return fd;
}
-int lxc_af_unix_send_fd(int fd, int sendfd, void *data, size_t size)
+int lxc_abstract_unix_send_fd(int fd, int sendfd, void *data, size_t size)
{
struct msghdr msg = { 0 };
struct iovec iov;
return sendmsg(fd, &msg, 0);
}
-int lxc_af_unix_recv_fd(int fd, int *recvfd, void *data, size_t size)
+int lxc_abstract_unix_recv_fd(int fd, int *recvfd, void *data, size_t size)
{
struct msghdr msg = { 0 };
struct iovec iov;
return ret;
}
-int lxc_af_unix_send_credential(int fd, void *data, size_t size)
+int lxc_abstract_unix_send_credential(int fd, void *data, size_t size)
{
struct msghdr msg = { 0 };
struct iovec iov;
return sendmsg(fd, &msg, 0);
}
-int lxc_af_unix_rcv_credential(int fd, void *data, size_t size)
+int lxc_abstract_unix_rcv_credential(int fd, void *data, size_t size)
{
struct msghdr msg = { 0 };
struct iovec iov;
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-extern int lxc_af_unix_open(const char *path, int type, int flags);
-extern int lxc_af_unix_close(int fd);
-extern int lxc_af_unix_connect(const char *path);
-extern int lxc_af_unix_send_fd(int fd, int sendfd, void *data, size_t size);
-extern int lxc_af_unix_recv_fd(int fd, int *recvfd, void *data, size_t size);
-extern int lxc_af_unix_send_credential(int fd, void *data, size_t size);
-extern int lxc_af_unix_rcv_credential(int fd, void *data, size_t size);
+extern int lxc_abstract_unix_open(const char *path, int type, int flags);
+extern int lxc_abstract_unix_close(int fd);
+extern int lxc_abstract_unix_connect(const char *path);
+extern int lxc_abstract_unix_send_fd(int fd, int sendfd, void *data, size_t size);
+extern int lxc_abstract_unix_recv_fd(int fd, int *recvfd, void *data, size_t size);
+extern int lxc_abstract_unix_send_credential(int fd, void *data, size_t size);
+extern int lxc_abstract_unix_rcv_credential(int fd, void *data, size_t size);
int ret,rspfd;
struct lxc_cmd_rsp *rsp = &cmd->rsp;
- ret = lxc_af_unix_recv_fd(sock, &rspfd, rsp, sizeof(*rsp));
+ ret = lxc_abstract_unix_recv_fd(sock, &rspfd, rsp, sizeof(*rsp));
if (ret < 0) {
ERROR("command %s failed to receive response",
lxc_cmd_str(cmd->req.cmd));
if (fill_sock_name(offset, len, name, lxcpath))
return -1;
- sock = lxc_af_unix_connect(path);
+ sock = lxc_abstract_unix_connect(path);
if (sock < 0) {
if (errno == ECONNREFUSED)
*stopped = 1;
return -1;
}
- ret = lxc_af_unix_send_credential(sock, &cmd->req, sizeof(cmd->req));
+ ret = lxc_abstract_unix_send_credential(sock, &cmd->req, sizeof(cmd->req));
if (ret != sizeof(cmd->req)) {
SYSERROR("command %s failed to send req to '@%s' %d",
lxc_cmd_str(cmd->req.cmd), offset, ret);
memset(&rsp, 0, sizeof(rsp));
rsp.data = INT_TO_PTR(ttynum);
- if (lxc_af_unix_send_fd(fd, masterfd, &rsp, sizeof(rsp)) < 0) {
+ if (lxc_abstract_unix_send_fd(fd, masterfd, &rsp, sizeof(rsp)) < 0) {
ERROR("failed to send tty to client");
lxc_console_free(handler->conf, fd);
goto out_close;
struct lxc_cmd_req req;
struct lxc_handler *handler = data;
- ret = lxc_af_unix_rcv_credential(fd, &req, sizeof(req));
+ ret = lxc_abstract_unix_rcv_credential(fd, &req, sizeof(req));
if (ret == -EACCES) {
/* we don't care for the peer, just send and close */
struct lxc_cmd_rsp rsp = { .ret = ret };
if (fill_sock_name(offset, len, name, lxcpath))
return -1;
- fd = lxc_af_unix_open(path, SOCK_STREAM, 0);
+ fd = lxc_abstract_unix_open(path, SOCK_STREAM, 0);
if (fd < 0) {
ERROR("failed (%d) to create the command service point %s", errno, offset);
if (errno == EADDRINUSE) {
if (lxc_monitor_sock_name(mon->lxcpath, &addr) < 0)
return -1;
- fd = lxc_af_unix_open(addr.sun_path, SOCK_STREAM, O_TRUNC);
+ fd = lxc_abstract_unix_open(addr.sun_path, SOCK_STREAM, O_TRUNC);
if (fd < 0) {
ERROR("failed to open unix socket : %s", strerror(errno));
return -1;
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
+#include <stddef.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdint.h>
struct sockaddr_un addr;
int fd,ret;
int retry,backoff_ms[] = {10, 50, 100};
+ size_t len;
if (lxc_monitor_sock_name(lxcpath, &addr) < 0)
return -1;
return -1;
}
+ len = strlen(&addr.sun_path[1]) + 1;
+ if (len >= sizeof(addr.sun_path) - 1) {
+ ret = -1;
+ errno = ENAMETOOLONG;
+ goto err1;
+ }
+
for (retry = 0; retry < sizeof(backoff_ms)/sizeof(backoff_ms[0]); retry++) {
- ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
+ ret = connect(fd, (struct sockaddr *)&addr, offsetof(struct sockaddr_un, sun_path) + len);
if (ret == 0 || errno != ECONNREFUSED)
break;
ERROR("connect : backing off %d", backoff_ms[retry]);