metrics: avoid overflow from bad sysfs value

A zram bug can create very large values for orig_data_size,
which causes an overflow.  Rather than fixing various kernel
versions, we work around the problem here.

BUG=chromium:686928
TEST=none

Change-Id: If3657091cff5727adf0dd2a15ccfa3f94095cc83
Reviewed-on: https://chromium-review.googlesource.com/439005
Commit-Ready: Luigi Semenzato <semenzato@chromium.org>
Tested-by: Luigi Semenzato <semenzato@chromium.org>
Reviewed-by: Kirtika Ruchandani <kirtika@chromium.org>
(cherry picked from commit f56f45d1b6ec53ed52dc88061d3d6b03ccc4bc15)
Reviewed-on: https://chromium-review.googlesource.com/468529
Reviewed-by: Luigi Semenzato <semenzato@chromium.org>
Commit-Queue: Luigi Semenzato <semenzato@chromium.org>
diff --git a/metrics/metrics_daemon.cc b/metrics/metrics_daemon.cc
index dcf5aff..a1efc75 100644
--- a/metrics/metrics_daemon.cc
+++ b/metrics/metrics_daemon.cc
@@ -872,7 +872,12 @@
   // The compression ratio is multiplied by 100 for better resolution.  The
   // ratios of interest are between 1 and 6 (100% and 600% as reported).  We
   // don't want samples when very little memory is being compressed.
-  if (compr_data_size_mb >= 1) {
+  //
+  // A race in older versions of zram can make orig_data_size underflow and
+  // be reported as a large positive number, so we also need to ensure that
+  // orig_data_size multiplied by 100 isn't going to overflow.
+  if (compr_data_size_mb >= 1 &&
+      orig_data_size < (1ull << (sizeof(orig_data_size) * 8 - 1)) / 100) {
     SendSample("Platform.ZramCompressionRatioPercent",
                orig_data_size * 100 / compr_data_size, 100, 600, 50);
   }