logd: Allow apps to clear their UID-specific data
Bug: 13501501 Change-Id: Ia72e25fc19430ce63fb359cd9b3f0523d41f5aa8
This commit is contained in:
parent
7fa1cd1963
commit
1a240b4790
3 changed files with 43 additions and 9 deletions
|
@ -74,9 +74,9 @@ static void setname() {
|
|||
int CommandListener::ClearCmd::runCommand(SocketClient *cli,
|
||||
int argc, char **argv) {
|
||||
setname();
|
||||
if (!clientHasLogCredentials(cli)) {
|
||||
cli->sendMsg("Permission Denied");
|
||||
return 0;
|
||||
uid_t uid = cli->getUid();
|
||||
if (clientHasLogCredentials(cli)) {
|
||||
uid = AID_ROOT;
|
||||
}
|
||||
|
||||
if (argc < 2) {
|
||||
|
@ -90,7 +90,7 @@ int CommandListener::ClearCmd::runCommand(SocketClient *cli,
|
|||
return 0;
|
||||
}
|
||||
|
||||
mBuf.clear((log_id_t) id);
|
||||
mBuf.clear((log_id_t) id, uid);
|
||||
cli->sendMsg("success");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -232,7 +232,7 @@ void LogBuffer::maybePrune(log_id_t id) {
|
|||
// prune "pruneRows" of type "id" from the buffer.
|
||||
//
|
||||
// mLogElementsLock must be held when this function is called.
|
||||
void LogBuffer::prune(log_id_t id, unsigned long pruneRows) {
|
||||
void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
|
||||
LogTimeEntry *oldest = NULL;
|
||||
|
||||
LogTimeEntry::lock();
|
||||
|
@ -250,6 +250,38 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows) {
|
|||
|
||||
LogBufferElementCollection::iterator it;
|
||||
|
||||
if (caller_uid != AID_ROOT) {
|
||||
for(it = mLogElements.begin(); it != mLogElements.end();) {
|
||||
LogBufferElement *e = *it;
|
||||
|
||||
if (oldest && (oldest->mStart <= e->getMonotonicTime())) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (e->getLogId() != id) {
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
uid_t uid = e->getUid();
|
||||
|
||||
if (uid == caller_uid) {
|
||||
it = mLogElements.erase(it);
|
||||
unsigned short len = e->getMsgLen();
|
||||
stats.subtract(len, id, uid, e->getPid());
|
||||
delete e;
|
||||
pruneRows--;
|
||||
if (pruneRows == 0) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
LogTimeEntry::unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
// prune by worst offender by uid
|
||||
while (pruneRows > 0) {
|
||||
// recalculate the worst offender on every batched pass
|
||||
|
@ -375,9 +407,9 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows) {
|
|||
}
|
||||
|
||||
// clear all rows of type "id" from the buffer.
|
||||
void LogBuffer::clear(log_id_t id) {
|
||||
void LogBuffer::clear(log_id_t id, uid_t uid) {
|
||||
pthread_mutex_lock(&mLogElementsLock);
|
||||
prune(id, ULONG_MAX);
|
||||
prune(id, ULONG_MAX, uid);
|
||||
pthread_mutex_unlock(&mLogElementsLock);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
#include <sysutils/SocketClient.h>
|
||||
#include <utils/List.h>
|
||||
|
||||
#include <private/android_filesystem_config.h>
|
||||
|
||||
#include "LogBufferElement.h"
|
||||
#include "LogTimes.h"
|
||||
#include "LogStatistics.h"
|
||||
|
@ -55,7 +57,7 @@ public:
|
|||
bool (*filter)(const LogBufferElement *element, void *arg) = NULL,
|
||||
void *arg = NULL);
|
||||
|
||||
void clear(log_id_t id);
|
||||
void clear(log_id_t id, uid_t uid = AID_ROOT);
|
||||
unsigned long getSize(log_id_t id);
|
||||
int setSize(log_id_t id, unsigned long size);
|
||||
unsigned long getSizeUsed(log_id_t id);
|
||||
|
@ -77,7 +79,7 @@ public:
|
|||
|
||||
private:
|
||||
void maybePrune(log_id_t id);
|
||||
void prune(log_id_t id, unsigned long pruneRows);
|
||||
void prune(log_id_t id, unsigned long pruneRows, uid_t uid = AID_ROOT);
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue