Просмотр исходного кода

Avoid overflow when summing up file sizes

We need to pass 0llu instead of 0 as the init value, otherwise
std::accumulate will calculate with ints.

Reported-by: Raphaël Hertzog
Julian Andres Klode лет назад: 10
Родитель
Сommit
5a97834817
2 измененных файлов с 4 добавлено и 4 удалено
  1. 3 3
      apt-pkg/acquire.cc
  2. 1 1
      apt-pkg/deb/dpkgpm.cc

+ 3 - 3
apt-pkg/acquire.cc

@@ -730,7 +730,7 @@ bool pkgAcquire::Clean(string Dir)
 /* This is the total number of bytes needed */
 APT_PURE unsigned long long pkgAcquire::TotalNeeded()
 {
-   return std::accumulate(ItemsBegin(), ItemsEnd(), 0,
+   return std::accumulate(ItemsBegin(), ItemsEnd(), 0ull,
       [](unsigned long long const T, Item const * const I) {
 	 return T + I->FileSize;
    });
@@ -741,7 +741,7 @@ APT_PURE unsigned long long pkgAcquire::TotalNeeded()
 /* This is the number of bytes that is not local */
 APT_PURE unsigned long long pkgAcquire::FetchNeeded()
 {
-   return std::accumulate(ItemsBegin(), ItemsEnd(), 0,
+   return std::accumulate(ItemsBegin(), ItemsEnd(), 0llu,
       [](unsigned long long const T, Item const * const I) {
 	 if (I->Local == false)
 	    return T + I->FileSize;
@@ -755,7 +755,7 @@ APT_PURE unsigned long long pkgAcquire::FetchNeeded()
 /* This is the number of bytes that is not local */
 APT_PURE unsigned long long pkgAcquire::PartialPresent()
 {
-   return std::accumulate(ItemsBegin(), ItemsEnd(), 0,
+   return std::accumulate(ItemsBegin(), ItemsEnd(), 0llu,
       [](unsigned long long const T, Item const * const I) {
 	 if (I->Local == false)
 	    return T + I->PartialSize;

+ 1 - 1
apt-pkg/deb/dpkgpm.cc

@@ -1194,7 +1194,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
    std::vector<const char *> Args(sArgs.size(), NULL);
    std::transform(sArgs.begin(), sArgs.end(), Args.begin(),
 	 [](std::string const &s) { return s.c_str(); });
-   unsigned long long const StartSize = std::accumulate(sArgs.begin(), sArgs.end(), 0,
+   unsigned long long const StartSize = std::accumulate(sArgs.begin(), sArgs.end(), 0llu,
 	 [](unsigned long long const i, std::string const &s) { return i + s.length(); });
    size_t const BaseArgs = Args.size();