diff options
author | Connor O'Brien <connoro@google.com> | 2016-08-19 22:53:32 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-08-19 22:53:32 +0000 |
commit | 233c9902cf5a7074b0498ad65447ea06f8735bc5 (patch) | |
tree | befade80439b980d71661b44417735c2a02fbdf8 /libsysutils | |
parent | de9e6fb4b006a17179805fd4647beed1cc4c7dc2 (diff) | |
parent | 2f16eeede62be75301b1b0c786dce94f0bfac5ae (diff) | |
download | core-233c9902cf5a7074b0498ad65447ea06f8735bc5.tar.gz core-233c9902cf5a7074b0498ad65447ea06f8735bc5.tar.bz2 core-233c9902cf5a7074b0498ad65447ea06f8735bc5.zip |
Fix vold vulnerability in FrameworkListener am: 470484d2a2 am: e9e046df6c am: 109024f74a am: b906ad88b9 am: 2fadbb93a4 am: e04054d9bb am: 9745b11db1 am: 2f78b2c3d6 am: 2b5e6d8ffc am: 2427a462c0 am: 6b155c1cc4
am: 2f16eeede6
Change-Id: I3d2fdfc10f91080ca32aa6557b13391355427edc
Diffstat (limited to 'libsysutils')
-rw-r--r-- | libsysutils/src/FrameworkListener.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libsysutils/src/FrameworkListener.cpp b/libsysutils/src/FrameworkListener.cpp index e7b3dd69a..579ead991 100644 --- a/libsysutils/src/FrameworkListener.cpp +++ b/libsysutils/src/FrameworkListener.cpp @@ -49,6 +49,7 @@ void FrameworkListener::init(const char *socketName UNUSED, bool withSeq) { errorRate = 0; mCommandCount = 0; mWithSeq = withSeq; + mSkipToNextNullByte = false; } bool FrameworkListener::onDataAvailable(SocketClient *c) { @@ -59,10 +60,15 @@ bool FrameworkListener::onDataAvailable(SocketClient *c) { if (len < 0) { SLOGE("read() failed (%s)", strerror(errno)); return false; - } else if (!len) + } else if (!len) { return false; - if(buffer[len-1] != '\0') + } else if (buffer[len-1] != '\0') { SLOGW("String is not zero-terminated"); + android_errorWriteLog(0x534e4554, "29831647"); + c->sendMsg(500, "Command too large for buffer", false); + mSkipToNextNullByte = true; + return false; + } int offset = 0; int i; @@ -70,11 +76,16 @@ bool FrameworkListener::onDataAvailable(SocketClient *c) { for (i = 0; i < len; i++) { if (buffer[i] == '\0') { /* IMPORTANT: dispatchCommand() expects a zero-terminated string */ - dispatchCommand(c, buffer + offset); + if (mSkipToNextNullByte) { + mSkipToNextNullByte = false; + } else { + dispatchCommand(c, buffer + offset); + } offset = i + 1; } } + mSkipToNextNullByte = false; return true; } |