Browse Source

[github21] Segfault condition fixed

 If the keyspace is not present, session_ will be null and
 it would segfault in CQLConnection destructor.
Tomek Mrugalski 9 years ago
parent
commit
1809470191
1 changed files with 21 additions and 11 deletions
  1. 21 11
      src/lib/dhcpsrv/cql_connection.cc

+ 21 - 11
src/lib/dhcpsrv/cql_connection.cc

@@ -30,23 +30,33 @@ CqlConnection::CqlConnection(const ParameterMap& parameters) :
 CqlConnection::~CqlConnection() {
     // Free up the prepared statements, ignoring errors.
     // Session and connection resources are deallocated.
-    CassError rc;
+    CassError rc = CASS_OK;
+    std::string error;
+
     for (int i = 0; i < statements_.size(); i++) {
         if (statements_[i]) {
             cass_prepared_free(statements_[i]);
         }
         statements_[i] = NULL;
     }
-    CassFuture* close_future = cass_session_close(session_);
-    cass_future_wait(close_future);
-    std::string error;
-    checkStatementError(error, close_future, "could not close connection to DB");
-    rc = cass_future_error_code(close_future);
-    cass_future_free(close_future);
-    cass_session_free(session_);
-    session_ = NULL;
-    cass_cluster_free(cluster_);
-    cluster_ = NULL;
+
+    if (session_) {
+        CassFuture* close_future = cass_session_close(session_);
+        cass_future_wait(close_future);
+        checkStatementError(error, close_future, "could not close connection to DB");
+        rc = cass_future_error_code(close_future);
+        cass_future_free(close_future);
+        cass_session_free(session_);
+        session_ = NULL;
+    }
+
+    if (cluster_) {
+        cass_cluster_free(cluster_);
+        cluster_ = NULL;
+    }
+
+    // We're closing the connection anyway. Let's not throw at this
+    // stage
     if (rc != CASS_OK) {
         isc_throw(DbOpenError, error);
     }