Frameworks/base: Fix more aapt issues

Change-Id: I6da7dc674e9f9e3b0886a3cfd1e3194d6b5ac948
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index d8e2de6..c262b00 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -192,7 +192,7 @@
 
 void AaptLocaleValue::setLanguage(const char* languageChars) {
      size_t i = 0;
-     while ((*languageChars) != '\0') {
+     while ((*languageChars) != '\0' && i < sizeof(language)/sizeof(language[0])) {
           language[i++] = tolower(*languageChars);
           languageChars++;
      }
@@ -200,7 +200,7 @@
 
 void AaptLocaleValue::setRegion(const char* regionChars) {
     size_t i = 0;
-    while ((*regionChars) != '\0') {
+    while ((*regionChars) != '\0' && i < sizeof(region)/sizeof(region[0])) {
          region[i++] = toupper(*regionChars);
          regionChars++;
     }
@@ -208,7 +208,7 @@
 
 void AaptLocaleValue::setScript(const char* scriptChars) {
     size_t i = 0;
-    while ((*scriptChars) != '\0') {
+    while ((*scriptChars) != '\0' && i < sizeof(script)/sizeof(script[0])) {
          if (i == 0) {
              script[i++] = toupper(*scriptChars);
          } else {
@@ -220,7 +220,7 @@
 
 void AaptLocaleValue::setVariant(const char* variantChars) {
      size_t i = 0;
-     while ((*variantChars) != '\0') {
+     while ((*variantChars) != '\0' && i < sizeof(variant)/sizeof(variant[0])) {
           variant[i++] = *variantChars;
           variantChars++;
      }
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index f863311..7e7d346 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -196,11 +196,16 @@
             goto bail;
         }
 
-        const ResTable& res = assets.getResources(false);
-#ifndef HAVE_ANDROID_OS
-        printf("\nResource table:\n");
-        res.print(false);
+#ifdef HAVE_ANDROID_OS
+        static const bool kHaveAndroidOs = true;
+#else
+        static const bool kHaveAndroidOs = false;
 #endif
+        const ResTable& res = assets.getResources(false);
+        if (!kHaveAndroidOs) {
+            printf("\nResource table:\n");
+            res.print(false);
+        }
 
         Asset* manifestAsset = assets.openNonAsset("AndroidManifest.xml",
                                                    Asset::ACCESS_BUFFER);
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 5368418..efa88e7 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -1095,6 +1095,41 @@
     }
 }
 
+static bool read_png_protected(png_structp read_ptr, String8& printableName, png_infop read_info,
+                               const sp<AaptFile>& file, FILE* fp, image_info* imageInfo) {
+    if (setjmp(png_jmpbuf(read_ptr))) {
+        return false;
+    }
+
+    png_init_io(read_ptr, fp);
+
+    read_png(printableName.string(), read_ptr, read_info, imageInfo);
+
+    const size_t nameLen = file->getPath().length();
+    if (nameLen > 6) {
+        const char* name = file->getPath().string();
+        if (name[nameLen-5] == '9' && name[nameLen-6] == '.') {
+            if (do_9patch(printableName.string(), imageInfo) != NO_ERROR) {
+                return false;
+            }
+        }
+    }
+
+    return true;
+}
+
+static bool write_png_protected(png_structp write_ptr, String8& printableName, png_infop write_info,
+                                image_info* imageInfo, const Bundle* bundle) {
+    if (setjmp(png_jmpbuf(write_ptr))) {
+        return false;
+    }
+
+    write_png(printableName.string(), write_ptr, write_info, *imageInfo,
+              bundle->getGrayscaleTolerance());
+
+    return true;
+}
+
 status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& /* assets */,
                          const sp<AaptFile>& file, String8* /* outNewLeafName */)
 {
@@ -1126,8 +1161,6 @@
 
     status_t error = UNKNOWN_ERROR;
 
-    const size_t nameLen = file->getPath().length();
-
     fp = fopen(file->getSourceFile().string(), "rb");
     if (fp == NULL) {
         fprintf(stderr, "%s: ERROR: Unable to open PNG file\n", printableName.string());
@@ -1145,23 +1178,10 @@
         goto bail;
     }
 
-    if (setjmp(png_jmpbuf(read_ptr))) {
+    if (!read_png_protected(read_ptr, printableName, read_info, file, fp, &imageInfo)) {
         goto bail;
     }
 
-    png_init_io(read_ptr, fp);
-
-    read_png(printableName.string(), read_ptr, read_info, &imageInfo);
-
-    if (nameLen > 6) {
-        const char* name = file->getPath().string();
-        if (name[nameLen-5] == '9' && name[nameLen-6] == '.') {
-            if (do_9patch(printableName.string(), &imageInfo) != NO_ERROR) {
-                goto bail;
-            }
-        }
-    }
-
     write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, (png_error_ptr)NULL,
                                         (png_error_ptr)NULL);
     if (!write_ptr)
@@ -1178,14 +1198,10 @@
     png_set_write_fn(write_ptr, (void*)file.get(),
                      png_write_aapt_file, png_flush_aapt_file);
 
-    if (setjmp(png_jmpbuf(write_ptr)))
-    {
+    if (!write_png_protected(write_ptr, printableName, write_info, &imageInfo, bundle)) {
         goto bail;
     }
 
-    write_png(printableName.string(), write_ptr, write_info, imageInfo,
-              bundle->getGrayscaleTolerance());
-
     error = NO_ERROR;
 
     if (bundle->getVerbose()) {
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
index fd3f573..cda24eb 100644
--- a/tools/aapt/XMLNode.cpp
+++ b/tools/aapt/XMLNode.cpp
@@ -989,7 +989,7 @@
         for (size_t i=0; i<N; i++) {
             const attribute_entry& e = mAttributes.itemAt(i);
             if (e.ns.size() <= 0) continue;
-            bool nsIsPublic;
+            bool nsIsPublic = true;
             String16 pkg(getNamespaceResourcePackage(String16(assets->getPackage()), e.ns, &nsIsPublic));
             if (kIsDebug) {
                 printf("Elem %s %s=\"%s\": namespace(%s) %s ===> %s\n",