summaryrefslogtreecommitdiffstats
path: root/packages/DefaultContainerService/src/com
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2012-05-10 10:21:06 -0700
committerKenny Root <kroot@google.com>2012-05-10 11:48:21 -0700
commit103d53005e7a3c2735f4ac76fa9b795a7e7e39d7 (patch)
treeda5b4a423467f932654ca2db1494bd9e34210f58 /packages/DefaultContainerService/src/com
parenta25079e6bafcfd77135a852f0e838738d80606ef (diff)
downloadframeworks_base-103d53005e7a3c2735f4ac76fa9b795a7e7e39d7.zip
frameworks_base-103d53005e7a3c2735f4ac76fa9b795a7e7e39d7.tar.gz
frameworks_base-103d53005e7a3c2735f4ac76fa9b795a7e7e39d7.tar.bz2
Use long instead of int for file offsets
Use long instead of int so we don't run into a 2GB file limit. Fix possible overflows in offset and length. Change-Id: Idb3a34f5600f9c2372b9c89256f21757049fa43b
Diffstat (limited to 'packages/DefaultContainerService/src/com')
-rw-r--r--packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java25
1 files changed, 18 insertions, 7 deletions
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index 17e5f4e..3b87b96 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -473,6 +473,8 @@ public class DefaultContainerService extends IntentService {
}
private static class ApkContainer {
+ private static final int MAX_AUTHENTICATED_DATA_SIZE = 16384;
+
private final InputStream mInStream;
private MacAuthenticatedInputStream mAuthenticatedStream;
@@ -540,26 +542,35 @@ public class DefaultContainerService extends IntentService {
throw new IOException(e);
}
- final int encStart = encryptionParams.getEncryptedDataStart();
- final int end = encryptionParams.getDataEnd();
+ final long encStart = encryptionParams.getEncryptedDataStart();
+ final long end = encryptionParams.getDataEnd();
if (end < encStart) {
throw new IOException("end <= encStart");
}
final Mac mac = getMacInstance(encryptionParams);
if (mac != null) {
- final int macStart = encryptionParams.getAuthenticatedDataStart();
+ final long macStart = encryptionParams.getAuthenticatedDataStart();
+ if (macStart >= Integer.MAX_VALUE) {
+ throw new IOException("macStart >= Integer.MAX_VALUE");
+ }
- final int furtherOffset;
+ final long furtherOffset;
if (macStart >= 0 && encStart >= 0 && macStart < encStart) {
/*
* If there is authenticated data at the beginning, read
* that into our MAC first.
*/
- final int authenticatedLength = encStart - macStart;
- final byte[] authenticatedData = new byte[authenticatedLength];
+ final long authenticatedLengthLong = encStart - macStart;
+ if (authenticatedLengthLong > MAX_AUTHENTICATED_DATA_SIZE) {
+ throw new IOException("authenticated data is too long");
+ }
+ final int authenticatedLength = (int) authenticatedLengthLong;
+
+ final byte[] authenticatedData = new byte[(int) authenticatedLength];
- Streams.readFully(inStream, authenticatedData, macStart, authenticatedLength);
+ Streams.readFully(inStream, authenticatedData, (int) macStart,
+ authenticatedLength);
mac.update(authenticatedData, 0, authenticatedLength);
furtherOffset = 0;