X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmemif%2Fmemif_socket.c;h=0c71f6c454d43fa73a4eddaa511d8cdf8856e8ca;hb=8dad92662b2ec72b2b0eb0b23b31e124514c7ff3;hp=01a935f87c9fd7ba5d872cfe5d4d6fe263057d94;hpb=c41a04958b09535ffc97e993233aec874cc42b1d;p=dpdk.git diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c index 01a935f87c..0c71f6c454 100644 --- a/drivers/net/memif/memif_socket.c +++ b/drivers/net/memif/memif_socket.c @@ -852,7 +852,7 @@ memif_listener_handler(void *arg) return; error: - if (sockfd > 0) { + if (sockfd >= 0) { close(sockfd); sockfd = -1; } @@ -860,11 +860,16 @@ memif_listener_handler(void *arg) rte_free(cc); } +#define MEMIF_SOCKET_UN_SIZE \ + (offsetof(struct sockaddr_un, sun_path) + MEMIF_SOCKET_KEY_LEN) + static struct memif_socket * -memif_socket_create(struct pmd_internals *pmd, char *key, uint8_t listener) +memif_socket_create(struct pmd_internals *pmd, + const char *key, uint8_t listener) { struct memif_socket *sock; - struct sockaddr_un un; + struct sockaddr_un *un; + char un_buf[MEMIF_SOCKET_UN_SIZE]; int sockfd; int ret; int on = 1; @@ -876,7 +881,7 @@ memif_socket_create(struct pmd_internals *pmd, char *key, uint8_t listener) } sock->listener = listener; - rte_memcpy(sock->filename, key, 256); + strlcpy(sock->filename, key, MEMIF_SOCKET_KEY_LEN); TAILQ_INIT(&sock->dev_queue); if (listener != 0) { @@ -884,15 +889,16 @@ memif_socket_create(struct pmd_internals *pmd, char *key, uint8_t listener) if (sockfd < 0) goto error; - un.sun_family = AF_UNIX; - memcpy(un.sun_path, sock->filename, - sizeof(un.sun_path) - 1); + memset(un_buf, 0, sizeof(un_buf)); + un = (struct sockaddr_un *)un_buf; + un->sun_family = AF_UNIX; + strlcpy(un->sun_path, sock->filename, MEMIF_SOCKET_KEY_LEN); ret = setsockopt(sockfd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); if (ret < 0) goto error; - ret = bind(sockfd, (struct sockaddr *)&un, sizeof(un)); + ret = bind(sockfd, (struct sockaddr *)un, MEMIF_SOCKET_UN_SIZE); if (ret < 0) goto error; ret = listen(sockfd, 1); @@ -918,9 +924,12 @@ memif_socket_create(struct pmd_internals *pmd, char *key, uint8_t listener) error: MIF_LOG(ERR, "%s: Failed to setup socket %s: %s", - rte_vdev_device_name(pmd->vdev), key, strerror(errno)); + rte_vdev_device_name(pmd->vdev) ? + rte_vdev_device_name(pmd->vdev) : "NULL", key, strerror(errno)); if (sock != NULL) rte_free(sock); + if (sockfd >= 0) + close(sockfd); return NULL; } @@ -928,9 +937,10 @@ static struct rte_hash * memif_create_socket_hash(void) { struct rte_hash_parameters params = { 0 }; + params.name = MEMIF_SOCKET_HASH_NAME; params.entries = 256; - params.key_len = 256; + params.key_len = MEMIF_SOCKET_KEY_LEN; params.hash_func = rte_jhash; params.hash_func_init_val = 0; return rte_hash_create(¶ms); @@ -945,7 +955,7 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) struct pmd_internals *tmp_pmd; struct rte_hash *hash; int ret; - char key[256]; + char key[MEMIF_SOCKET_KEY_LEN]; hash = rte_hash_find_existing(MEMIF_SOCKET_HASH_NAME); if (hash == NULL) { @@ -956,8 +966,8 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) } } - memset(key, 0, 256); - rte_memcpy(key, socket_filename, strlen(socket_filename)); + memset(key, 0, MEMIF_SOCKET_KEY_LEN); + strlcpy(key, socket_filename, MEMIF_SOCKET_KEY_LEN); ret = rte_hash_lookup_data(hash, key, (void **)&socket); if (ret < 0) { socket = memif_socket_create(pmd, key, @@ -1010,6 +1020,7 @@ memif_socket_remove_device(struct rte_eth_dev *dev) struct memif_socket *socket = NULL; struct memif_socket_dev_list_elt *elt, *next; struct rte_hash *hash; + int ret; hash = rte_hash_find_existing(MEMIF_SOCKET_HASH_NAME); if (hash == NULL) @@ -1037,7 +1048,10 @@ memif_socket_remove_device(struct rte_eth_dev *dev) /* remove listener socket file, * so we can create new one later. */ - remove(socket->filename); + ret = remove(socket->filename); + if (ret < 0) + MIF_LOG(ERR, "Failed to remove socket file: %s", + socket->filename); } rte_free(socket); } @@ -1113,7 +1127,7 @@ memif_connect_slave(struct rte_eth_dev *dev) return 0; error: - if (sockfd > 0) { + if (sockfd >= 0) { close(sockfd); sockfd = -1; }