From: Krzysztof Jackiewicz Date: Thu, 7 Jul 2022 12:00:27 +0000 (+0200) Subject: Remove unused sendmsg functionality X-Git-Tag: submit/sessiond/20220715.092836~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f80c8c603657856b1025078c9ea80377f8350a1f;p=platform%2Fcore%2Fsecurity%2Fsecurity-manager.git Remove unused sendmsg functionality Kind of reverts 0798413641b7961a0132050aef6bd03270936625 Change-Id: I815e63a370528762f69b760340398e068b541b74 --- diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 8e2f849d..7b2350da 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -45,7 +45,6 @@ INCLUDE_DIRECTORIES( ) SET(SERVER_SOURCES - ${SERVER_PATH}/main/generic-socket-manager.cpp ${SERVER_PATH}/main/socket-manager.cpp ${SERVER_PATH}/main/server-main.cpp ${SERVER_PATH}/main/service-thread.cpp diff --git a/src/server/main/generic-socket-manager.cpp b/src/server/main/generic-socket-manager.cpp deleted file mode 100644 index cc46bb09..00000000 --- a/src/server/main/generic-socket-manager.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2013-2020 Samsung Electronics Co., Ltd. All rights reserved. - * - * This file is licensed under the terms of MIT License or the Apache License - * Version 2.0 of your choice. See the LICENSE.MIT file for MIT license details. - * See the LICENSE file or the notice below for Apache License Version 2.0 - * details. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * @file generic-socket-manager.cpp - * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) - * @version 1.0 - * @brief Implementation of GenericSocketService and GenericSocketManager. - */ - -#include -#include - -#include - -namespace SecurityManager { - -class SendMsgData::Internal { -public: - Internal(int resultCode, int fileDesc) - : m_resultCode(resultCode) - , m_fileDesc(fileDesc) - { - memset(&m_hdr, 0, sizeof(msghdr)); - memset(m_cmsgbuf, 0, CMSG_SPACE(sizeof(int))); - - m_iov.iov_base = &m_resultCode; - m_iov.iov_len = sizeof(m_resultCode); - - m_hdr.msg_iov = &m_iov; - m_hdr.msg_iovlen = 1; - - if (fileDesc != -1) { - m_hdr.msg_control = m_cmsgbuf; - m_hdr.msg_controllen = CMSG_SPACE(sizeof(int)); - - cmsghdr *m_cmsg = CMSG_FIRSTHDR(&m_hdr); - m_cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - m_cmsg->cmsg_level = SOL_SOCKET; - m_cmsg->cmsg_type = SCM_RIGHTS; - - memmove(CMSG_DATA(m_cmsg), &m_fileDesc, sizeof(int)); - } - } - - msghdr* data() { return &m_hdr; } - -private: - msghdr m_hdr; - iovec m_iov; - unsigned char m_cmsgbuf[CMSG_SPACE(sizeof(int))]; - int m_resultCode; - int m_fileDesc; -}; - -SendMsgData::SendMsgData() - : m_resultCode(0) - , m_fileDesc(-1) - , m_flags(0) - , m_pimpl(NULL) -{} - -SendMsgData::SendMsgData(int resultCode, int fileDesc, int flags) - : m_resultCode(resultCode) - , m_fileDesc(fileDesc) - , m_flags(flags) - , m_pimpl(NULL) -{} - -SendMsgData::SendMsgData(const SendMsgData &second) - : m_resultCode(second.m_resultCode) - , m_fileDesc(second.m_fileDesc) - , m_flags(second.m_flags) - , m_pimpl(NULL) -{} - -SendMsgData::~SendMsgData() { - delete m_pimpl; -} - -SendMsgData& SendMsgData::operator=(const SendMsgData &second) { - m_resultCode = second.m_resultCode; - m_fileDesc = second.m_fileDesc; - m_flags = second.m_flags; - delete m_pimpl; - m_pimpl = NULL; - return *this; -} - -msghdr* SendMsgData::getMsghdr() { - if (!m_pimpl) - m_pimpl = new Internal(m_resultCode, m_fileDesc); - return m_pimpl->data(); -} - -int SendMsgData::flags() { - return m_flags; -} - -} // namespace SecurityManager - diff --git a/src/server/main/include/generic-socket-manager.h b/src/server/main/include/generic-socket-manager.h index 7f7872c0..5934ae15 100644 --- a/src/server/main/include/generic-socket-manager.h +++ b/src/server/main/include/generic-socket-manager.h @@ -36,10 +36,6 @@ #include #include -extern "C" { -struct msghdr; -} // extern "C" - namespace SecurityManager { typedef int InterfaceID; @@ -63,19 +59,16 @@ struct GenericSocketService { ServiceDescription(const char *path, const char *smackLabel, InterfaceID interfaceID = 0, - bool useSendMsg = false, bool systemdOnly = false) : smackLabel(smackLabel) , interfaceID(interfaceID) , serviceHandlerPath(path) - , useSendMsg(useSendMsg) , systemdOnly(systemdOnly) {} SmackLabel smackLabel; // Smack label for socket InterfaceID interfaceID; // All data from serviceHandlerPath will be marked with this interfaceHandler ServiceHandlerPath serviceHandlerPath; // Path to file - bool useSendMsg; bool systemdOnly; }; @@ -126,31 +119,11 @@ protected: GenericSocketManager *m_serviceManager; }; -class SendMsgData { -public: - class Internal; - - SendMsgData(); - SendMsgData(int resultCode, int fileDesc, int flags = 0); - SendMsgData(const SendMsgData &second); - SendMsgData& operator=(const SendMsgData &second); - virtual ~SendMsgData(); - - msghdr* getMsghdr(); - int flags(); -private: - int m_resultCode; - int m_fileDesc; - int m_flags; - Internal *m_pimpl; -}; - struct GenericSocketManager { virtual void MainLoop() = 0; virtual void RegisterSocketService(GenericSocketService *ptr) = 0; virtual void Close(ConnectionID connectionID) = 0; virtual void Write(ConnectionID connectionID, const RawBuffer &rawBuffer) = 0; - virtual void Write(ConnectionID connectionID, const SendMsgData &sendMsgData) = 0; virtual ~GenericSocketManager(){} }; diff --git a/src/server/main/include/socket-manager.h b/src/server/main/include/socket-manager.h index 97792d3e..69a33ecf 100644 --- a/src/server/main/include/socket-manager.h +++ b/src/server/main/include/socket-manager.h @@ -55,7 +55,6 @@ public: virtual void RegisterSocketService(GenericSocketService *service); virtual void Close(ConnectionID connectionID); virtual void Write(ConnectionID connectionID, const RawBuffer &rawBuffer); - virtual void Write(ConnectionID connectionID, const SendMsgData &sendMsgData); protected: void CreateDomainSocket( @@ -68,8 +67,6 @@ protected: void ReadyForRead(int sock); void ReadyForWrite(int sock); - void ReadyForWriteBuffer(int sock); - void ReadyForSendMsg(int sock); void ReadyForAccept(int sock); void ProcessQueue(void); void NotifyMe(void); @@ -79,19 +76,16 @@ protected: bool isListen; bool isOpen; bool isTimeout; - bool useSendMsg; InterfaceID interfaceID; GenericSocketService *service; time_t timeout; RawBuffer rawBuffer; - std::queue sendMsgDataQueue; int counter; SocketDescription() : isListen(false) , isOpen(false) , isTimeout(false) - , useSendMsg(false) , interfaceID(-1) , service(NULL) , timeout(0) @@ -108,11 +102,6 @@ protected: RawBuffer rawBuffer; }; - struct WriteData { - ConnectionID connectionID; - SendMsgData sendMsgData; - }; - struct Timeout { time_t time; int sock; @@ -128,7 +117,6 @@ protected: bool m_working; std::mutex m_eventQueueMutex; std::queue m_writeBufferQueue; - std::queue m_writeDataQueue; std::queue m_closeQueue; int m_notifyMe[2]; int m_counter; diff --git a/src/server/main/socket-manager.cpp b/src/server/main/socket-manager.cpp index c08e796d..2bd4f3a7 100644 --- a/src/server/main/socket-manager.cpp +++ b/src/server/main/socket-manager.cpp @@ -224,7 +224,6 @@ void SocketManager::ReadyForAccept(int sock) { auto &desc = CreateDefaultReadSocketDescription(client, true); desc.interfaceID = m_socketDescriptionVector[sock].interfaceID; desc.service = m_socketDescriptionVector[sock].service; - desc.useSendMsg = m_socketDescriptionVector[sock].useSendMsg; GenericSocketService::AcceptEvent event( ConnectionID{client, desc.counter}, @@ -268,50 +267,7 @@ void SocketManager::ReadyForRead(int sock) { } } -void SocketManager::ReadyForSendMsg(int sock) { - auto &desc = m_socketDescriptionVector[sock]; - - if (desc.sendMsgDataQueue.empty()) { - FD_CLR(sock, &m_writeSet); - return; - } - - auto data = desc.sendMsgDataQueue.front(); - ssize_t result = sendmsg(sock, data.getMsghdr(), data.flags()); - - if (result == -1) { - int err = errno; - switch (err) { - case EAGAIN: - case EINTR: - break; - case EPIPE: - default: - LogError("Error during send: " << GetErrnoString(err)); - CloseSocket(sock); - break; - } - return; - } else { - desc.sendMsgDataQueue.pop(); - } - - if (desc.sendMsgDataQueue.empty()) { - FD_CLR(sock, &m_writeSet); - } - - desc.timeout = monotonicNow() + SOCKET_TIMEOUT; - - GenericSocketService::WriteEvent event; - event.connectionID.sock = sock; - event.connectionID.counter = desc.counter; - event.size = result; - event.left = desc.sendMsgDataQueue.size(); - - desc.service->Event(std::move(event)); -} - -void SocketManager::ReadyForWriteBuffer(int sock) { +void SocketManager::ReadyForWrite(int sock) { auto &desc = m_socketDescriptionVector[sock]; size_t size = desc.rawBuffer.size(); ssize_t result = write(sock, &desc.rawBuffer[0], size); @@ -347,11 +303,6 @@ void SocketManager::ReadyForWriteBuffer(int sock) { desc.service->Event(std::move(event)); } -void SocketManager::ReadyForWrite(int sock) { - m_socketDescriptionVector[sock].useSendMsg ? - ReadyForSendMsg(sock) : ReadyForWriteBuffer(sock); -} - void SocketManager::MainLoop() { // remove evironment values passed by systemd sd_listen_fds(1); @@ -584,7 +535,6 @@ void SocketManager::CreateDomainSocket( description.isListen = true; description.interfaceID = desc.interfaceID; - description.useSendMsg = desc.useSendMsg; description.service = service; LogDebug("Listen on socket: " << sockfd << @@ -629,24 +579,12 @@ void SocketManager::Write(ConnectionID connectionID, const RawBuffer &rawBuffer) NotifyMe(); } -void SocketManager::Write(ConnectionID connectionID, const SendMsgData &sendMsgData) { - WriteData data; - data.connectionID = connectionID; - data.sendMsgData = sendMsgData; - { - std::lock_guard ulock(m_eventQueueMutex); - m_writeDataQueue.push(data); - } - NotifyMe(); -} - void SocketManager::NotifyMe() { TEMP_FAILURE_RETRY(write(m_notifyMe[1], "You have message ;-)", 1)); } void SocketManager::ProcessQueue() { WriteBuffer buffer; - WriteData data; { std::lock_guard ulock(m_eventQueueMutex); while (!m_writeBufferQueue.empty()) { @@ -668,12 +606,6 @@ void SocketManager::ProcessQueue() { continue; } - if (desc.useSendMsg) { - LogError("Some service tried to push rawdata to socket that usees sendmsg! Socket: " - << buffer.connectionID.sock); - continue; - } - std::copy( buffer.rawBuffer.begin(), buffer.rawBuffer.end(), @@ -681,36 +613,6 @@ void SocketManager::ProcessQueue() { FD_SET(buffer.connectionID.sock, &m_writeSet); } - - while (!m_writeDataQueue.empty()) { - data = m_writeDataQueue.front(); - m_writeDataQueue.pop(); - - auto &desc = m_socketDescriptionVector[data.connectionID.sock]; - - if (!desc.isOpen) { - LogDebug("Received packet for sendmsg but connection is closed. Packet ignored! Socket: " - << data.connectionID.sock); - continue; - } - - if (desc.counter != data.connectionID.counter) - { - LogDebug("Received packet for write but counter is broken. Packet ignored! Socket: " - << data.connectionID.sock); - continue; - } - - if (!desc.useSendMsg) { - LogError("Some service tries to push SendMsgData to socket that uses write! Socket: " - << data.connectionID.sock); - continue; - } - - desc.sendMsgDataQueue.push(data.sendMsgData); - - FD_SET(data.connectionID.sock, &m_writeSet); - } } while (1) { @@ -753,8 +655,6 @@ void SocketManager::CloseSocket(int sock) { desc.service = NULL; desc.interfaceID = -1; desc.rawBuffer.clear(); - while (!desc.sendMsgDataQueue.empty()) - desc.sendMsgDataQueue.pop(); if (service) service->Event(std::move(event)); diff --git a/src/server/service/service.cpp b/src/server/service/service.cpp index 5e2088c3..0457627c 100644 --- a/src/server/service/service.cpp +++ b/src/server/service/service.cpp @@ -51,7 +51,6 @@ GenericSocketService::ServiceDescriptionVector Service::GetServiceDescription() {SERVICE_SOCKET, /* path */ "*", /* smackLabel label (not used, we rely on systemd) */ IFACE, /* InterfaceID */ - false, /* useSendMsg */ false}, /* systemdOnly */ }; }