diff --git a/include/sysutils/SocketClient.h b/include/sysutils/SocketClient.h index d6bb7d5df..7d2b1d67c 100644 --- a/include/sysutils/SocketClient.h +++ b/include/sysutils/SocketClient.h @@ -8,6 +8,7 @@ class SocketClient { int mSocket; + bool mSocketOwned; pthread_mutex_t mWriteMutex; /* Peer process ID */ @@ -24,8 +25,8 @@ class SocketClient { int mRefCount; public: - SocketClient(int sock); - virtual ~SocketClient() {} + SocketClient(int sock, bool owned); + virtual ~SocketClient(); int getSocket() { return mSocket; } pid_t getPid() const { return mPid; } diff --git a/libsysutils/src/SocketClient.cpp b/libsysutils/src/SocketClient.cpp index 90ca52e74..722dcb291 100644 --- a/libsysutils/src/SocketClient.cpp +++ b/libsysutils/src/SocketClient.cpp @@ -10,8 +10,9 @@ #include -SocketClient::SocketClient(int socket) +SocketClient::SocketClient(int socket, bool owned) : mSocket(socket) + , mSocketOwned(owned) , mPid(-1) , mUid(-1) , mGid(-1) @@ -32,6 +33,13 @@ SocketClient::SocketClient(int socket) } } +SocketClient::~SocketClient() +{ + if (mSocketOwned) { + close(mSocket); + } +} + int SocketClient::sendMsg(int code, const char *msg, bool addErrno) { char *buf; const char* arg; diff --git a/libsysutils/src/SocketListener.cpp b/libsysutils/src/SocketListener.cpp index fcad624b1..3f871ea88 100644 --- a/libsysutils/src/SocketListener.cpp +++ b/libsysutils/src/SocketListener.cpp @@ -79,7 +79,7 @@ int SocketListener::startListener() { SLOGE("Unable to listen on socket (%s)", strerror(errno)); return -1; } else if (!mListen) - mClients->push_back(new SocketClient(mSock)); + mClients->push_back(new SocketClient(mSock, false)); if (pipe(mCtrlPipe)) { SLOGE("pipe failed (%s)", strerror(errno)); @@ -191,7 +191,7 @@ void SocketListener::runListener() { continue; } pthread_mutex_lock(&mClientsLock); - mClients->push_back(new SocketClient(c)); + mClients->push_back(new SocketClient(c, true)); pthread_mutex_unlock(&mClientsLock); } @@ -225,12 +225,8 @@ void SocketListener::runListener() { } } pthread_mutex_unlock(&mClientsLock); - /* Destroy the client */ - int socket = c->getSocket(); - if (c->decRef()) { - // Note: 'c' is deleted memory at this point. - close(socket); - } + /* Remove our reference to the client */ + c->decRef(); } } }