From b0e039f4ca1dd59a13078bb9bb4c24daac93cd84 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 30 Nov 2015 10:53:22 -0800 Subject: [PATCH] adb: don't divide by zero If we stat a file and get a size of 0, and then successfully read bytes from that file, we would previously divide by zero when calculating the percentage completion of the file. This case happens either when we're racing against something else writing to the file, or when we're pulling magical files such as the ones in /dev/cpuctl/ that lie about their size. Bug: http://b/25925733 Change-Id: I980b9c14f44a1eb4a42bc8736c94fa6db06c08d1 --- adb/file_sync_client.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/adb/file_sync_client.cpp b/adb/file_sync_client.cpp index e109e3eef..c422b4f19 100644 --- a/adb/file_sync_client.cpp +++ b/adb/file_sync_client.cpp @@ -190,8 +190,15 @@ class SyncConnection { bytes_copied += ret; - int percentage = static_cast(bytes_copied * 100 / total_size); - Printf("%s: %d%%", rpath, percentage); + if (total_size == 0) { + // This case can happen if we're racing against something that wrote to the file + // between our stat and our read, or if we're reading a magic file that lies about + // its size. + Printf("%s: ?%%", rpath); + } else { + int percentage = static_cast(bytes_copied * 100 / total_size); + Printf("%s: %d%%", rpath, percentage); + } } adb_close(lfd); @@ -458,8 +465,14 @@ static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath) bytes_copied += msg.data.size; - int percentage = static_cast(bytes_copied * 100 / size); - sc.Printf("%s: %d%%", rpath, percentage); + if (size == 0) { + // This case can happen if we're racing against something that wrote to the file between + // our stat and our read, or if we're reading a magic file that lies about its size. + sc.Printf("%s: ?%%", rpath); + } else { + int percentage = static_cast(bytes_copied * 100 / size); + sc.Printf("%s: %d%%", rpath, percentage); + } } adb_close(lfd);