Loading logd/LogBufferElement.cpp +36 −12 Original line number Original line Diff line number Diff line Loading @@ -41,22 +41,20 @@ LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime, mTid(tid), mTid(tid), mRealTime(realtime), mRealTime(realtime), mMsgLen(len), mMsgLen(len), mLogId(log_id) { mLogId(log_id), mDropped(false) { mMsg = new char[len]; mMsg = new char[len]; memcpy(mMsg, msg, len); memcpy(mMsg, msg, len); mTag = (isBinary() && (mMsgLen >= sizeof(uint32_t))) ? le32toh(reinterpret_cast<android_event_header_t*>(mMsg)->tag) : 0; } } LogBufferElement::LogBufferElement(const LogBufferElement& elem) LogBufferElement::LogBufferElement(const LogBufferElement& elem) : mTag(elem.mTag), : mUid(elem.mUid), mUid(elem.mUid), mPid(elem.mPid), mPid(elem.mPid), mTid(elem.mTid), mTid(elem.mTid), mRealTime(elem.mRealTime), mRealTime(elem.mRealTime), mMsgLen(elem.mMsgLen), mMsgLen(elem.mMsgLen), mLogId(elem.mLogId) { mLogId(elem.mLogId), mDropped(elem.mDropped) { mMsg = new char[mMsgLen]; mMsg = new char[mMsgLen]; memcpy(mMsg, elem.mMsg, mMsgLen); memcpy(mMsg, elem.mMsg, mMsgLen); } } Loading @@ -65,6 +63,32 @@ LogBufferElement::~LogBufferElement() { delete[] mMsg; delete[] mMsg; } } uint32_t LogBufferElement::getTag() const { return (isBinary() && ((mDropped && mMsg != nullptr) || (!mDropped && mMsgLen >= sizeof(android_event_header_t)))) ? reinterpret_cast<const android_event_header_t*>(mMsg)->tag : 0; } unsigned short LogBufferElement::setDropped(unsigned short value) { // The tag information is saved in mMsg data, if the tag is non-zero // save only the information needed to get the tag. if (getTag() != 0) { if (mMsgLen > sizeof(android_event_header_t)) { char* truncated_msg = new char[sizeof(android_event_header_t)]; memcpy(truncated_msg, mMsg, sizeof(android_event_header_t)); delete[] mMsg; mMsg = truncated_msg; } // mMsgLen == sizeof(android_event_header_t), already at minimum. } else { delete[] mMsg; mMsg = nullptr; } mDropped = true; return mDroppedCount = value; } // caller must own and free character string // caller must own and free character string char* android::tidToName(pid_t tid) { char* android::tidToName(pid_t tid) { char* retval = NULL; char* retval = NULL; Loading Loading @@ -164,8 +188,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent // identical to below to calculate the buffer size required // identical to below to calculate the buffer size required const char* type = lastSame ? "identical" : "expire"; const char* type = lastSame ? "identical" : "expire"; size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "", size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "", commName ? commName : "", type, mDropped, commName ? commName : "", type, getDropped(), (mDropped > 1) ? "s" : ""); (getDropped() > 1) ? "s" : ""); size_t hdrLen; size_t hdrLen; if (isBinary()) { if (isBinary()) { Loading Loading @@ -196,8 +220,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent } } snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "", snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "", commName ? commName : "", type, mDropped, commName ? commName : "", type, getDropped(), (mDropped > 1) ? "s" : ""); (getDropped() > 1) ? "s" : ""); free(const_cast<char*>(name)); free(const_cast<char*>(name)); free(const_cast<char*>(commName)); free(const_cast<char*>(commName)); Loading Loading @@ -225,7 +249,7 @@ log_time LogBufferElement::flushTo(SocketClient* reader, LogBuffer* parent, char* buffer = NULL; char* buffer = NULL; if (!mMsg) { if (mDropped) { entry.len = populateDroppedMessage(buffer, parent, lastSame); entry.len = populateDroppedMessage(buffer, parent, lastSame); if (!entry.len) return mRealTime; if (!entry.len) return mRealTime; iovec[1].iov_base = buffer; iovec[1].iov_base = buffer; Loading logd/LogBufferElement.h +11 −19 Original line number Original line Diff line number Diff line Loading @@ -32,25 +32,25 @@ class LogBuffer; // chatty for the temporal expire messages // chatty for the temporal expire messages #define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration #define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration class LogBufferElement { class __attribute__((packed)) LogBufferElement { friend LogBuffer; friend LogBuffer; // sized to match reality of incoming log packets // sized to match reality of incoming log packets uint32_t mTag; // only valid for isBinary() const uint32_t mUid; const uint32_t mUid; const uint32_t mPid; const uint32_t mPid; const uint32_t mTid; const uint32_t mTid; log_time mRealTime; log_time mRealTime; char* mMsg; char* mMsg; union { union { const uint16_t mMsgLen; // mMSg != NULL const uint16_t mMsgLen; // mDropped == false uint16_t mDropped; // mMsg == NULL uint16_t mDroppedCount; // mDropped == true }; }; const uint8_t mLogId; const uint8_t mLogId; bool mDropped; static atomic_int_fast64_t sequence; static atomic_int_fast64_t sequence; // assumption: mMsg == NULL // assumption: mDropped == true size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, bool lastSame); bool lastSame); Loading @@ -58,7 +58,7 @@ class LogBufferElement { LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, pid_t tid, const char* msg, unsigned short len); pid_t tid, const char* msg, unsigned short len); LogBufferElement(const LogBufferElement& elem); LogBufferElement(const LogBufferElement& elem); virtual ~LogBufferElement(); ~LogBufferElement(); bool isBinary(void) const { bool isBinary(void) const { return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); Loading @@ -76,24 +76,16 @@ class LogBufferElement { pid_t getTid(void) const { pid_t getTid(void) const { return mTid; return mTid; } } uint32_t getTag() const { uint32_t getTag() const; return mTag; } unsigned short getDropped(void) const { unsigned short getDropped(void) const { return mMsg ? 0 : mDropped; return mDropped ? mDroppedCount : 0; } unsigned short setDropped(unsigned short value) { if (mMsg) { delete[] mMsg; mMsg = NULL; } return mDropped = value; } } unsigned short setDropped(unsigned short value); unsigned short getMsgLen() const { unsigned short getMsgLen() const { return mMsg ? mMsgLen : 0; return mDropped ? 0 : mMsgLen; } } const char* getMsg() const { const char* getMsg() const { return mMsg; return mDropped ? nullptr : mMsg; } } log_time getRealTime(void) const { log_time getRealTime(void) const { return mRealTime; return mRealTime; Loading Loading
logd/LogBufferElement.cpp +36 −12 Original line number Original line Diff line number Diff line Loading @@ -41,22 +41,20 @@ LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime, mTid(tid), mTid(tid), mRealTime(realtime), mRealTime(realtime), mMsgLen(len), mMsgLen(len), mLogId(log_id) { mLogId(log_id), mDropped(false) { mMsg = new char[len]; mMsg = new char[len]; memcpy(mMsg, msg, len); memcpy(mMsg, msg, len); mTag = (isBinary() && (mMsgLen >= sizeof(uint32_t))) ? le32toh(reinterpret_cast<android_event_header_t*>(mMsg)->tag) : 0; } } LogBufferElement::LogBufferElement(const LogBufferElement& elem) LogBufferElement::LogBufferElement(const LogBufferElement& elem) : mTag(elem.mTag), : mUid(elem.mUid), mUid(elem.mUid), mPid(elem.mPid), mPid(elem.mPid), mTid(elem.mTid), mTid(elem.mTid), mRealTime(elem.mRealTime), mRealTime(elem.mRealTime), mMsgLen(elem.mMsgLen), mMsgLen(elem.mMsgLen), mLogId(elem.mLogId) { mLogId(elem.mLogId), mDropped(elem.mDropped) { mMsg = new char[mMsgLen]; mMsg = new char[mMsgLen]; memcpy(mMsg, elem.mMsg, mMsgLen); memcpy(mMsg, elem.mMsg, mMsgLen); } } Loading @@ -65,6 +63,32 @@ LogBufferElement::~LogBufferElement() { delete[] mMsg; delete[] mMsg; } } uint32_t LogBufferElement::getTag() const { return (isBinary() && ((mDropped && mMsg != nullptr) || (!mDropped && mMsgLen >= sizeof(android_event_header_t)))) ? reinterpret_cast<const android_event_header_t*>(mMsg)->tag : 0; } unsigned short LogBufferElement::setDropped(unsigned short value) { // The tag information is saved in mMsg data, if the tag is non-zero // save only the information needed to get the tag. if (getTag() != 0) { if (mMsgLen > sizeof(android_event_header_t)) { char* truncated_msg = new char[sizeof(android_event_header_t)]; memcpy(truncated_msg, mMsg, sizeof(android_event_header_t)); delete[] mMsg; mMsg = truncated_msg; } // mMsgLen == sizeof(android_event_header_t), already at minimum. } else { delete[] mMsg; mMsg = nullptr; } mDropped = true; return mDroppedCount = value; } // caller must own and free character string // caller must own and free character string char* android::tidToName(pid_t tid) { char* android::tidToName(pid_t tid) { char* retval = NULL; char* retval = NULL; Loading Loading @@ -164,8 +188,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent // identical to below to calculate the buffer size required // identical to below to calculate the buffer size required const char* type = lastSame ? "identical" : "expire"; const char* type = lastSame ? "identical" : "expire"; size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "", size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "", commName ? commName : "", type, mDropped, commName ? commName : "", type, getDropped(), (mDropped > 1) ? "s" : ""); (getDropped() > 1) ? "s" : ""); size_t hdrLen; size_t hdrLen; if (isBinary()) { if (isBinary()) { Loading Loading @@ -196,8 +220,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent } } snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "", snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "", commName ? commName : "", type, mDropped, commName ? commName : "", type, getDropped(), (mDropped > 1) ? "s" : ""); (getDropped() > 1) ? "s" : ""); free(const_cast<char*>(name)); free(const_cast<char*>(name)); free(const_cast<char*>(commName)); free(const_cast<char*>(commName)); Loading Loading @@ -225,7 +249,7 @@ log_time LogBufferElement::flushTo(SocketClient* reader, LogBuffer* parent, char* buffer = NULL; char* buffer = NULL; if (!mMsg) { if (mDropped) { entry.len = populateDroppedMessage(buffer, parent, lastSame); entry.len = populateDroppedMessage(buffer, parent, lastSame); if (!entry.len) return mRealTime; if (!entry.len) return mRealTime; iovec[1].iov_base = buffer; iovec[1].iov_base = buffer; Loading
logd/LogBufferElement.h +11 −19 Original line number Original line Diff line number Diff line Loading @@ -32,25 +32,25 @@ class LogBuffer; // chatty for the temporal expire messages // chatty for the temporal expire messages #define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration #define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration class LogBufferElement { class __attribute__((packed)) LogBufferElement { friend LogBuffer; friend LogBuffer; // sized to match reality of incoming log packets // sized to match reality of incoming log packets uint32_t mTag; // only valid for isBinary() const uint32_t mUid; const uint32_t mUid; const uint32_t mPid; const uint32_t mPid; const uint32_t mTid; const uint32_t mTid; log_time mRealTime; log_time mRealTime; char* mMsg; char* mMsg; union { union { const uint16_t mMsgLen; // mMSg != NULL const uint16_t mMsgLen; // mDropped == false uint16_t mDropped; // mMsg == NULL uint16_t mDroppedCount; // mDropped == true }; }; const uint8_t mLogId; const uint8_t mLogId; bool mDropped; static atomic_int_fast64_t sequence; static atomic_int_fast64_t sequence; // assumption: mMsg == NULL // assumption: mDropped == true size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, bool lastSame); bool lastSame); Loading @@ -58,7 +58,7 @@ class LogBufferElement { LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, pid_t tid, const char* msg, unsigned short len); pid_t tid, const char* msg, unsigned short len); LogBufferElement(const LogBufferElement& elem); LogBufferElement(const LogBufferElement& elem); virtual ~LogBufferElement(); ~LogBufferElement(); bool isBinary(void) const { bool isBinary(void) const { return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); Loading @@ -76,24 +76,16 @@ class LogBufferElement { pid_t getTid(void) const { pid_t getTid(void) const { return mTid; return mTid; } } uint32_t getTag() const { uint32_t getTag() const; return mTag; } unsigned short getDropped(void) const { unsigned short getDropped(void) const { return mMsg ? 0 : mDropped; return mDropped ? mDroppedCount : 0; } unsigned short setDropped(unsigned short value) { if (mMsg) { delete[] mMsg; mMsg = NULL; } return mDropped = value; } } unsigned short setDropped(unsigned short value); unsigned short getMsgLen() const { unsigned short getMsgLen() const { return mMsg ? mMsgLen : 0; return mDropped ? 0 : mMsgLen; } } const char* getMsg() const { const char* getMsg() const { return mMsg; return mDropped ? nullptr : mMsg; } } log_time getRealTime(void) const { log_time getRealTime(void) const { return mRealTime; return mRealTime; Loading