git » android-tools.git » commit 14afe89

FS#63370: fix a crash with flashing sparse images

author Anatol Pomozov
2019-09-18 17:36:39 UTC
committer Anatol Pomozov
2019-09-18 17:36:39 UTC
parent a8ce286fa562e5e69f8acfb49774436eb76d4db1

FS#63370: fix a crash with flashing sparse images

PKGBUILD +4 -1
fix_sparse_img.patch +38 -0

diff --git a/PKGBUILD b/PKGBUILD
index 05eab1c..c1ede0a 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,7 +4,7 @@
 
 pkgname=android-tools
 pkgver=29.0.3
-pkgrel=1
+pkgrel=2
 tag=platform-tools-$pkgver
 pkgdesc='Android platform tools'
 arch=(x86_64)
@@ -26,6 +26,7 @@ source=(git+https://android.googlesource.com/platform/system/core#tag=$tag
         git+https://boringssl.googlesource.com/boringssl#commit=$_boringssl_commit
         generate_build.rb
         fix_build_core.patch
+        fix_sparse_img.patch
         bash_completion.fastboot)
         # Bash completion file was taken from https://github.com/mbrubeck/android-completion
 sha1sums=('SKIP'
@@ -38,6 +39,7 @@ sha1sums=('SKIP'
           'SKIP'
           'afca7974ad8658e52fd028ead12ad0a959d63273'
           'e7f02cd6529dad54b4bdfd35e34b2cb9cb70cdd4'
+          '2b57a4cf8012473c1a4fc6adae16573756272b02'
           '7004dbd0c193668827174880de6f8434de8ceaee')
 
 prepare() {
@@ -45,6 +47,7 @@ prepare() {
 
   cd "$srcdir"/core
   patch -p1 < ../fix_build_core.patch
+  patch -p1 < ../fix_sparse_img.patch # FS#63370
 
   cd "$srcdir"/avb
   sed -i 's|/usr/bin/env python$|/usr/bin/env python2|g' avbtool
diff --git a/fix_sparse_img.patch b/fix_sparse_img.patch
new file mode 100644
index 0000000..4eb9909
--- /dev/null
+++ b/fix_sparse_img.patch
@@ -0,0 +1,38 @@
+commit fbb9535aaea5ae4011f3c3edf4c00b27452f57ec
+Author: Tom Cherry <tomcherry@google.com>
+Date:   Tue Sep 17 13:34:04 2019 -0700
+
+    fastboot: don't use sparse_file_import_auto() in load_buf_fd()
+    
+    load_buf_fd() attempts to find the size of the file that it is about
+    to load by first calling sparse_file_import_auto() then using
+    sparse_file_len() upon success or falling back to the file size on the
+    filesystem on failure.
+    
+    This is problematic however as sparse_file_import_auto() creates a
+    sparse_file out of the normal file, but does not resparse it, so an
+    assertion fails during the sparse_file_len() call.
+    
+    This is fixed by using sparse_file_import() instead.  This will fail
+    in the case that the file is not sparse and the call to
+    sparse_file_len() will be properly skipped.
+    
+    Bug: 140538105
+    Test: flash blueline factory image with assertions enabled in
+          libsparse/sparse.cpp
+    
+    Change-Id: I0283be33563a3301ce5b09bde41105a20f91086c
+
+diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp
+index 4737ae4d66..a7fc628c43 100644
+--- a/fastboot/fastboot.cpp
++++ b/fastboot/fastboot.cpp
+@@ -874,7 +874,7 @@ static bool load_buf_fd(int fd, struct fastboot_buffer* buf) {
+         return false;
+     }
+ 
+-    if (sparse_file* s = sparse_file_import_auto(fd, false, false)) {
++    if (sparse_file* s = sparse_file_import(fd, false, false)) {
+         buf->image_size = sparse_file_len(s, false, false);
+         sparse_file_destroy(s);
+     } else {