summaryrefslogtreecommitdiffstats
path: root/libsysutils
diff options
context:
space:
mode:
authorConnor O'Brien <connoro@google.com>2016-08-19 22:50:00 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-08-19 22:50:00 +0000
commit2f16eeede62be75301b1b0c786dce94f0bfac5ae (patch)
treeaf1ab7732a7249ee9a785059de77f35bdb6dbf07 /libsysutils
parent9008a5cb8091b0deb98192c5aa239eca72858423 (diff)
parent6b155c1cc4db114f5bc9a3c47cb2f21e492eaa01 (diff)
downloadsystem_core-2f16eeede62be75301b1b0c786dce94f0bfac5ae.tar.gz
system_core-2f16eeede62be75301b1b0c786dce94f0bfac5ae.tar.bz2
system_core-2f16eeede62be75301b1b0c786dce94f0bfac5ae.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 Change-Id: Ie6c2bcee1deacb94259a6153097757674fa19251
Diffstat (limited to 'libsysutils')
-rw-r--r--libsysutils/src/FrameworkListener.cpp17
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;
}