summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorqctecmdr Service <qctecmdr@qualcomm.com>2019-01-17 14:19:17 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2019-01-17 14:19:17 -0800
commit47b591383b447b5c64e9e0ee706f1a4ca69c7d33 (patch)
treed521acf2efcb07c4adea977dc79eb58f19a96755 /utils
parent7d9edb3c227a53d146afd00967b9619da33e5fad (diff)
parentcd387d1e8eb7dbf07741005f0cf33677a911dd43 (diff)
downloadgps-47b591383b447b5c64e9e0ee706f1a4ca69c7d33.tar.gz
Merge "LocIpc could be using data member from a deleted obj"
Diffstat (limited to 'utils')
-rw-r--r--utils/LocIpc.cpp113
-rw-r--r--utils/LocIpc.h3
2 files changed, 51 insertions, 65 deletions
diff --git a/utils/LocIpc.cpp b/utils/LocIpc.cpp
index f7e163d..7347b78 100644
--- a/utils/LocIpc.cpp
+++ b/utils/LocIpc.cpp
@@ -69,8 +69,9 @@ bool LocIpc::startListeningNonBlocking(const std::string& name) {
}
bool LocIpc::startListeningBlocking(const std::string& name) {
-
+ bool stopRequested = false;
int fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+
if (fd < 0) {
LOC_LOGe("create socket error. reason:%s", strerror(errno));
return false;
@@ -87,89 +88,75 @@ bool LocIpc::startListeningBlocking(const std::string& name) {
if (::bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
LOC_LOGe("bind socket error. reason:%s", strerror(errno));
- ::close(fd);
- fd = -1;
- return false;
- }
+ } else {
+ mIpcFd = fd;
- mIpcFd = fd;
-
- // inform that the socket is ready to receive message
- onListenerReady();
-
- ssize_t nBytes = 0;
- std::string msg = "";
- std::string abort = LOC_MSG_ABORT;
- while (1) {
- msg.resize(LOC_MSG_BUF_LEN);
- nBytes = ::recvfrom(mIpcFd, (void*)(msg.data()), msg.size(), 0, NULL, NULL);
- if (nBytes < 0) {
- break;
- } else if (nBytes == 0) {
- continue;
- }
+ // inform that the socket is ready to receive message
+ onListenerReady();
- if (strncmp(msg.data(), abort.c_str(), abort.length()) == 0) {
- LOC_LOGi("recvd abort msg.data %s", msg.data());
- break;
- }
+ ssize_t nBytes = 0;
+ std::string msg = "";
+ std::string abort = LOC_MSG_ABORT;
+ while (1) {
+ msg.resize(LOC_MSG_BUF_LEN);
+ nBytes = ::recvfrom(fd, (void*)(msg.data()), msg.size(), 0, NULL, NULL);
+ if (nBytes < 0) {
+ LOC_LOGe("cannot read socket. reason:%s", strerror(errno));
+ break;
+ } else if (0 == nBytes) {
+ continue;
+ }
- if (strncmp(msg.data(), LOC_MSG_HEAD, sizeof(LOC_MSG_HEAD) - 1)) {
- // short message
- msg.resize(nBytes);
- onReceive(msg);
- } else {
- // long message
- size_t msgLen = 0;
- sscanf(msg.data(), LOC_MSG_HEAD"%zu", &msgLen);
- msg.resize(msgLen);
- size_t msgLenReceived = 0;
- while ((msgLenReceived < msgLen) && (nBytes > 0)) {
- nBytes = recvfrom(mIpcFd, (void*)&(msg[msgLenReceived]),
- msg.size() - msgLenReceived, 0, NULL, NULL);
- msgLenReceived += nBytes;
+ if (strncmp(msg.data(), abort.c_str(), abort.length()) == 0) {
+ LOC_LOGi("recvd abort msg.data %s", msg.data());
+ stopRequested = true;
+ break;
}
- if (nBytes > 0) {
+
+ if (strncmp(msg.data(), LOC_MSG_HEAD, sizeof(LOC_MSG_HEAD) - 1)) {
+ // short message
+ msg.resize(nBytes);
onReceive(msg);
} else {
- break;
+ // long message
+ size_t msgLen = 0;
+ sscanf(msg.data(), LOC_MSG_HEAD"%zu", &msgLen);
+ msg.resize(msgLen);
+ size_t msgLenReceived = 0;
+ while ((msgLenReceived < msgLen) && (nBytes > 0)) {
+ nBytes = recvfrom(fd, (void*)&(msg[msgLenReceived]),
+ msg.size() - msgLenReceived, 0, NULL, NULL);
+ msgLenReceived += nBytes;
+ }
+ if (nBytes > 0) {
+ onReceive(msg);
+ } else {
+ LOC_LOGe("cannot read socket. reason:%s", strerror(errno));
+ break;
+ }
}
}
}
- if (mStopRequested) {
- mStopRequested = false;
- return true;
- } else {
- LOC_LOGe("cannot read socket. reason:%s", strerror(errno));
- (void)::close(mIpcFd);
- mIpcFd = -1;
- return false;
+ if (::close(fd)) {
+ LOC_LOGe("cannot close socket:%s", strerror(errno));
}
+ unlink(name.c_str());
+
+ return stopRequested;
}
void LocIpc::stopListening() {
-
const char *socketName = nullptr;
- mStopRequested = true;
- if (mRunnable) {
+ if (mIpcFd >= 0) {
std::string abort = LOC_MSG_ABORT;
socketName = (reinterpret_cast<LocIpcRunnable *>(mRunnable))->mIpcName.c_str();
send(socketName, abort);
- mRunnable = nullptr;
- }
-
- if (mIpcFd >= 0) {
- if (::close(mIpcFd)) {
- LOC_LOGe("cannot close socket:%s", strerror(errno));
- }
mIpcFd = -1;
}
-
- //delete from the file system at the end
- if (socketName) {
- unlink(socketName);
+ if (mRunnable) {
+ mRunnable = nullptr;
}
}
diff --git a/utils/LocIpc.h b/utils/LocIpc.h
index 62309e7..2288a0a 100644
--- a/utils/LocIpc.h
+++ b/utils/LocIpc.h
@@ -44,7 +44,7 @@ class LocIpcSender;
class LocIpc {
friend LocIpcSender;
public:
- inline LocIpc() : mIpcFd(-1), mStopRequested(false), mRunnable(nullptr) {}
+ inline LocIpc() : mIpcFd(-1), mRunnable(nullptr) {}
inline virtual ~LocIpc() { stopListening(); }
// Listen for new messages in current thread. Calling this funciton will
@@ -93,7 +93,6 @@ private:
const uint8_t data[], uint32_t length);
int mIpcFd;
- bool mStopRequested;
LocThread mThread;
LocRunnable *mRunnable;
};