OSDN Git Service

Don't WTF when reading empty data from the eventlog
authorChris Wren <cwren@android.com>
Fri, 16 Dec 2016 19:08:34 +0000 (14:08 -0500)
committerChris Wren <cwren@android.com>
Mon, 19 Dec 2016 17:51:34 +0000 (12:51 -0500)
Bug: 33446064
Fixes: 33446064
Test: run cts -m CtsUtilTestCases -t android.util.cts.EventLogTest
Change-Id: I4951202cd7d6ca441700b7122cfa3aae2167c7b0

core/java/android/util/EventLog.java

index 6196a97..99f6c2a 100644 (file)
@@ -56,6 +56,7 @@ public class EventLog {
     /** A previously logged event read from the logs. Instances are thread safe. */
     public static final class Event {
         private final ByteBuffer mBuffer;
+        private Exception mLastWtf;
 
         // Layout of event log entry received from Android logger.
         //  see system/core/include/log/logger.h
@@ -116,13 +117,19 @@ public class EventLog {
                     offset = V1_PAYLOAD_START;
                 }
                 mBuffer.limit(offset + mBuffer.getShort(LENGTH_OFFSET));
+                if ((offset + DATA_OFFSET) >= mBuffer.limit()) {
+                    // no payload
+                    return null;
+                }
                 mBuffer.position(offset + DATA_OFFSET); // Just after the tag.
                 return decodeObject();
             } catch (IllegalArgumentException e) {
                 Log.wtf(TAG, "Illegal entry payload: tag=" + getTag(), e);
+                mLastWtf = e;
                 return null;
             } catch (BufferUnderflowException e) {
                 Log.wtf(TAG, "Truncated entry payload: tag=" + getTag(), e);
+                mLastWtf = e;
                 return null;
             }
         }
@@ -148,6 +155,7 @@ public class EventLog {
                     return new String(mBuffer.array(), start, length, "UTF-8");
                 } catch (UnsupportedEncodingException e) {
                     Log.wtf(TAG, "UTF-8 is not supported", e);
+                    mLastWtf = e;
                     return null;
                 }
 
@@ -173,6 +181,24 @@ public class EventLog {
             byte[] bytes = mBuffer.array();
             return Arrays.copyOf(bytes, bytes.length);
         }
+
+        /**
+         * Retreive the last WTF error generated by this object.
+         * @hide
+         */
+        //VisibleForTesting
+        public Exception getLastError() {
+            return mLastWtf;
+        }
+
+        /**
+         * Clear the error state for this object.
+         * @hide
+         */
+        //VisibleForTesting
+        public void clearError() {
+            mLastWtf = null;
+        }
     }
 
     // We assume that the native methods deal with any concurrency issues.