This is an automated email from the ASF dual-hosted git repository. pengzheng pushed a commit to branch hotfix/resource_leaks in repository https://gitbox.apache.org/repos/asf/celix.git
commit f744f0b18b70eec5f420f67920e7343d08d79c5a Author: PengZheng <[email protected]> AuthorDate: Sun Dec 4 14:51:55 2022 +0800 Fix two resource leaks and coverity issues. 1. `psa_tcp_connection_entry_t` leak (cid 211196) 2. `sin` leak 3. unchecked return value (cid 211192) --- .../pubsub_admin_tcp/src/pubsub_tcp_handler.c | 99 +++++++++++----------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/bundles/pubsub/pubsub_admin_tcp/src/pubsub_tcp_handler.c b/bundles/pubsub/pubsub_admin_tcp/src/pubsub_tcp_handler.c index f53fa8ef..a2193847 100644 --- a/bundles/pubsub/pubsub_admin_tcp/src/pubsub_tcp_handler.c +++ b/bundles/pubsub/pubsub_admin_tcp/src/pubsub_tcp_handler.c @@ -553,64 +553,65 @@ int pubsub_tcpHandler_listen(pubsub_tcpHandler_t *handle, char *url) { psa_tcp_connection_entry_t *entry = hashMap_get(handle->connection_url_map, (void *) (intptr_t) url); celixThreadRwlock_unlock(&handle->dbLock); - if (entry == NULL) { - char protocol[] = "tcp"; - int fd = pubsub_tcpHandler_open(handle, url); - rc = fd; - struct sockaddr_in *sin = pubsub_utils_url_from_fd(fd); - // Make handler fd entry - char *pUrl = pubsub_utils_url_get_url(sin, protocol); + if (entry != NULL) { + // already exist + return rc; + } + char protocol[] = "tcp"; + int fd = pubsub_tcpHandler_open(handle, url); + rc = fd; + if (rc < 0) { + return rc; + } + struct sockaddr_in *sin = pubsub_utils_url_from_fd(fd); + // Make handler fd entry + char *pUrl = pubsub_utils_url_get_url(sin, protocol); + if (sin != NULL && pUrl != NULL) { entry = pubsub_tcpHandler_createEntry(handle, fd, pUrl, NULL, sin); - if (entry != NULL) { - __atomic_store_n(&entry->connected, true, __ATOMIC_RELEASE); - free(pUrl); - free(sin); - celixThreadRwlock_writeLock(&handle->dbLock); - if (rc >= 0) { - rc = listen(fd, SOMAXCONN); - if (rc != 0) { - L_ERROR("[TCP Socket] Error listen: %s\n", strerror(errno)); - pubsub_tcpHandler_freeEntry(entry); - entry = NULL; - } - } - if (rc >= 0) { - rc = pubsub_tcpHandler_makeNonBlocking(handle, fd); - if (rc < 0) { - pubsub_tcpHandler_freeEntry(entry); - entry = NULL; - } + } + free(pUrl); + free(sin); + if (entry != NULL) { + __atomic_store_n(&entry->connected, true, __ATOMIC_RELEASE); + if (rc >= 0) { + rc = listen(fd, SOMAXCONN); + if (rc != 0) { + L_ERROR("[TCP Socket] Error listen: %s\n", strerror(errno)); } - if ((rc >= 0) && (handle->efd >= 0)) { + } + if (rc >= 0) { + rc = pubsub_tcpHandler_makeNonBlocking(handle, fd); + } + if ((rc >= 0) && (handle->efd >= 0)) { #if defined(__APPLE__) - struct kevent ev; + struct kevent ev; EV_SET (&ev, fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); rc = kevent(handle->efd, &ev, 1, NULL, 0, NULL); #else - struct epoll_event event; - bzero(&event, sizeof(event)); // zero the struct - event.events = EPOLLIN | EPOLLRDHUP | EPOLLERR; - event.data.fd = fd; - rc = epoll_ctl(handle->efd, EPOLL_CTL_ADD, fd, &event); + struct epoll_event event; + bzero(&event, sizeof(event)); // zero the struct + event.events = EPOLLIN | EPOLLRDHUP | EPOLLERR; + event.data.fd = fd; + rc = epoll_ctl(handle->efd, EPOLL_CTL_ADD, fd, &event); #endif - if (rc < 0) { - L_ERROR("[TCP Socket] Cannot create poll: %s\n", strerror(errno)); - errno = 0; - pubsub_tcpHandler_freeEntry(entry); - entry = NULL; - } - if (entry) { - L_INFO("[TCP Socket] Using %s for service annunciation", entry->url); - hashMap_put(handle->interface_fd_map, (void *) (intptr_t) entry->fd, entry); - hashMap_put(handle->interface_url_map, entry->url, entry); - } + if (rc == 0) { + L_INFO("[TCP Socket] Using %s for service annunciation", entry->url); + celixThreadRwlock_writeLock(&handle->dbLock); + hashMap_put(handle->interface_fd_map, (void *) (intptr_t) entry->fd, entry); + hashMap_put(handle->interface_url_map, entry->url, entry); + celixThreadRwlock_unlock(&handle->dbLock); + entry = NULL; + } else { + L_ERROR("[TCP Socket] Cannot create poll: %s\n", strerror(errno)); } - celixThreadRwlock_unlock(&handle->dbLock); - } else { - L_ERROR("[TCP Socket] Error listen socket cannot bind to %s: %s\n", url ? url : "", strerror(errno)); - free(pUrl); - close(fd); } + if (entry) { + pubsub_tcpHandler_freeEntry(entry); + entry = NULL; + } + } else { + L_ERROR("[TCP Socket] Error listen socket cannot bind to %s: %s\n", url ? url : "", strerror(errno)); + close(fd); } return rc; }
