Browse Source

[4252] CID 1327386. CSVFile::getColumnIndex must not return negative value.

Marcin Siodelski 8 years ago
parent
commit
4e592c59f0
3 changed files with 18 additions and 15 deletions
  1. 6 5
      src/lib/util/csv_file.cc
  2. 4 4
      src/lib/util/csv_file.h
  3. 8 6
      src/lib/util/versioned_csv_file.cc

+ 6 - 5
src/lib/util/csv_file.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -8,6 +8,7 @@
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/constants.hpp>
 #include <boost/algorithm/string/split.hpp>
+#include <algorithm>
 #include <fstream>
 #include <sstream>
 
@@ -122,7 +123,7 @@ CSVFile::addColumn(const std::string& col_name) {
 
 void
 CSVFile::addColumnInternal(const std::string& col_name) {
-    if (getColumnIndex(col_name) >= 0) {
+    if (std::find(cols_.begin(), cols_.end(), col_name) != cols_.end()) {
         isc_throw(CSVFileError, "attempt to add duplicate column '"
                   << col_name << "'");
     }
@@ -199,14 +200,14 @@ CSVFile::size() const {
     return (pos);
 }
 
-int
+size_t
 CSVFile::getColumnIndex(const std::string& col_name) const {
     for (size_t i = 0; i < cols_.size(); ++i) {
         if (cols_[i] == col_name) {
-            return (static_cast<int>(i));
+            return (i);
         }
     }
-    return (-1);
+    isc_throw(isc::OutOfRange, "column '" << col_name << "' doesn't exist");
 }
 
 std::string

+ 4 - 4
src/lib/util/csv_file.h

@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -354,9 +354,9 @@ public:
     /// This function is exception safe.
     ///
     /// @param col_name Name of the column.
-    /// @return Index of the column or negative value if the column doesn't
-    /// exist.
-    int getColumnIndex(const std::string& col_name) const;
+    /// @return Index of the column.
+    /// @throw OutOfRange if column with such name doesn't exist.
+    size_t getColumnIndex(const std::string& col_name) const;
 
     /// @brief Returns the name of the column.
     ///

+ 8 - 6
src/lib/util/versioned_csv_file.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -29,13 +29,15 @@ VersionedCSVFile::addColumn(const std::string& name,
 
 void
 VersionedCSVFile::setMinimumValidColumns(const std::string& column_name) {
-    int index = getColumnIndex(column_name);
-    if (index <  0) {
+    try {
+        int index = getColumnIndex(column_name);
+        minimum_valid_columns_ = index + 1;
+
+    } catch (...) {
         isc_throw(VersionedCSVFileError,
-                  "setMinimumValidColumns: " << column_name << " is defined");
+                  "setMinimumValidColumns: " << column_name << " is not "
+                  "defined");
     }
-
-    minimum_valid_columns_ = index + 1;
 }
 
 size_t