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

Fix: invalid datastoreReferenceCount state

openDataStore incremented datastoreReferenceCount before calling
datastoreOpenDB and ensuring it didn't fail, leading to an invalid reference
count.
Rod Hynes 5 лет назад
Родитель
Сommit
f327f02960
1 измененных файлов с 14 добавлено и 9 удалено
  1. 14 9
      psiphon/dataStore.go

+ 14 - 9
psiphon/dataStore.go

@@ -85,23 +85,28 @@ func openDataStore(config *Config, retryAndReset bool) error {
 		return errors.Tracef(
 			"invalid datastore reference count: %d", datastoreReferenceCount)
 	}
-	datastoreReferenceCount += 1
-	if datastoreReferenceCount > 1 {
-		var err error
+
+	if datastoreReferenceCount > 0 {
+
 		if activeDatastoreDB == nil {
-			err = errors.TraceNew("datastore unexpectedly closed")
+			datastoreMutex.Unlock()
+			return errors.TraceNew("datastore unexpectedly closed")
 		}
+
+		// Add a reference to the open datastore.
+
+		datastoreReferenceCount += 1
 		datastoreMutex.Unlock()
-		return err
+		return nil
 	}
 
-	existingDB := activeDatastoreDB
-
-	if existingDB != nil {
+	if activeDatastoreDB != nil {
 		datastoreMutex.Unlock()
 		return errors.TraceNew("datastore unexpectedly open")
 	}
 
+	// datastoreReferenceCount is 0, so open the datastore.
+
 	newDB, err := datastoreOpenDB(
 		config.GetDataStoreDirectory(), retryAndReset)
 	if err != nil {
@@ -109,8 +114,8 @@ func openDataStore(config *Config, retryAndReset bool) error {
 		return errors.Trace(err)
 	}
 
+	datastoreReferenceCount = 1
 	activeDatastoreDB = newDB
-
 	datastoreMutex.Unlock()
 
 	_ = resetAllPersistentStatsToUnreported()