]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Avoid out of bounds memory access
authorRene Gassmoeller <rene.gassmoeller@mailbox.org>
Thu, 19 Jul 2018 00:42:35 +0000 (17:42 -0700)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Fri, 5 Oct 2018 23:42:11 +0000 (01:42 +0200)
source/base/data_out_base.cc
source/base/mpi.cc

index ea47ebd7933a46c5701ad21fc9c6d4f2842a5778..b05c8be77075b669c32f00e5c998e7cfd4bc7ba8 100644 (file)
@@ -405,22 +405,22 @@ namespace DataOutBase
     write_gmv_reorder_data_vectors (const std::vector<Patch<dim,spacedim> > &patches,
                                     Table<2,Number>                         &data_vectors)
     {
-      // unlike in the main function, we
-      // don't have here the data_names
-      // field, so we initialize it with
-      // the number of data sets in the
-      // first patch. the equivalence of
-      // these two definitions is checked
-      // in the main function.
-
-      // we have to take care, however, whether the
-      // points are appended to the end of the
-      // patch->data table
-      const unsigned int n_data_sets
-        =patches[0].points_are_available ? (patches[0].data.n_rows() - spacedim) : patches[0].data.n_rows();
-
-      Assert (data_vectors.size()[0] == n_data_sets,
-              ExcInternalError());
+      // If there is nothing to write, just return
+      if (patches.size() == 0)
+        return;
+
+      // unlike in the main function, we don't have here the data_names field,
+      // so we initialize it with the number of data sets in the first patch.
+      // the equivalence of these two definitions is checked in the main
+      // function.
+
+      // we have to take care, however, whether the points are appended to the
+      // end of the patch->data table
+      const unsigned int n_data_sets = patches[0].points_are_available ?
+                                       (patches[0].data.n_rows() - spacedim) :
+                                       patches[0].data.n_rows();
+
+      Assert(data_vectors.size()[0] == n_data_sets, ExcInternalError());
 
       // loop over all patches
       unsigned int next_value = 0;
@@ -6845,20 +6845,16 @@ void DataOutBase::write_filtered_data (const std::vector<Patch<dim,spacedim> > &
   Threads::Task<> reorder_task;
 
 #ifndef DEAL_II_WITH_MPI
-  // verify that there are indeed
-  // patches to be written out. most
-  // of the times, people just forget
-  // to call build_patches when there
-  // are no patches, so a warning is
-  // in order. that said, the
-  // assertion is disabled if we
-  // support MPI since then it can
-  // happen that on the coarsest
-  // mesh, a processor simply has no
-  // cells it actually owns, and in
-  // that case it is legit if there
-  // are no patches
-  Assert (patches.size() > 0, ExcNoPatches());
+  // verify that there are indeed patches to be written out. most of the times,
+  // people just forget to call build_patches when there are no patches, so a
+  // warning is in order. that said, the assertion is disabled if we support MPI
+  // since then it can happen that on the coarsest mesh, a processor simply has
+  // no cells it actually owns, and in that case it is legit if there are no
+  // patches
+  Assert(patches.size() > 0, ExcNoPatches());
+#else
+  if (patches.size() == 0)
+    return;
 #endif
 
   compute_sizes<dim,spacedim>(patches, n_node, n_cell);
index 38e8122f10ed26fb5166362beba978bc590a2419..3391d81cc75b794b4e37789e9cfc5464c82543d4 100644 (file)
@@ -23,7 +23,7 @@
 #include <deal.II/lac/la_parallel_block_vector.h>
 #include <deal.II/base/multithread_info.h>
 
-#include <numeric> 
+#include <numeric>
 #include <iostream>
 
 #ifdef DEAL_II_WITH_TRILINOS

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.