OSDN Git Service

Fix SD Card size check to prevent int overflow.
authorXavier Ducrohet <xav@android.com>
Tue, 25 May 2010 00:27:55 +0000 (17:27 -0700)
committerXavier Ducrohet <xav@android.com>
Tue, 25 May 2010 00:33:17 +0000 (17:33 -0700)
Also added a check for sd card that are too big (>999GB) to prevent
long overflow.

Change-Id: Ie3ae57e679151dacf0e1fbbec23b29ccfdad3b6a

sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java

index c4914b2..35ce0b0 100644 (file)
@@ -607,18 +607,36 @@ public final class AvdManager {
                     Matcher m = SDCARD_SIZE_PATTERN.matcher(sdcard);
                     if (m.matches()) {
                         // get the sdcard values for checks
-                        int sdcardSize = Integer.parseInt(m.group(1)); // pattern check
-                                                                       // above makes
-                                                                       // this unlikely to fail
-                        String sdcardSizeModifier = m.group(2);
-                        if ("K".equals(sdcardSizeModifier)) {
-                            sdcardSize *= 1024;
-                        } else { // must be "M" per the pattern
-                            sdcardSize *= 1024 * 1024;
-                        }
-
-                        if (sdcardSize < 9 * 1024 * 1024) {
-                            log.error(null, "SD Card size must be at least 9MB");
+                        try {
+                            long sdcardSize = Long.parseLong(m.group(1));
+
+                            // prevent overflow: no more than 999GB
+                            // 10 digit for MiB, 13 for KiB
+                            int digitCount = m.group(1).length();
+
+                            String sdcardSizeModifier = m.group(2);
+                            if ("K".equals(sdcardSizeModifier)) {
+                                sdcardSize *= 1024L;
+                            } else { // must be "M" per the pattern
+                                sdcardSize *= 1024L * 1024L;
+                                digitCount += 3; // convert the number of digit into "KiB"
+                            }
+
+                            if (digitCount >= 13) {
+                                log.error(null, "SD Card size is too big!");
+                                needCleanup = true;
+                                return null;
+                            }
+
+                            if (sdcardSize < 9 * 1024 * 1024) {
+                                log.error(null, "SD Card size must be at least 9MB");
+                                needCleanup = true;
+                                return null;
+                            }
+                        } catch (NumberFormatException e) {
+                            // this should never happen since the string is validated
+                            // by the regexp
+                            log.error(null, "Unable to parse SD Card size");
                             needCleanup = true;
                             return null;
                         }