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

Fix: unmarshal psinet into a new, empty struct and explicitly
overwrite all previous values. Unmarshal into an initialized
struct would leave stale data in place when the new JSON omitted
previously populated fields or map entries.

Rod Hynes 9 лет назад
Родитель
Сommit
fd43c0ea26
1 измененных файлов с 10 добавлено и 4 удалено
  1. 10 4
      psiphon/server/psinet/psinet.go

+ 10 - 4
psiphon/server/psinet/psinet.go

@@ -128,13 +128,19 @@ func NewDatabase(filename string) (*Database, error) {
 	database.ReloadableFile = common.NewReloadableFile(
 		filename,
 		func(fileContent []byte) error {
-			err := json.Unmarshal(fileContent, &database)
+			var newDatabase Database
+			err := json.Unmarshal(fileContent, &newDatabase)
 			if err != nil {
-				// On error, state remains the same
-				// (Unmarshal first validates the provided
-				//  JOSN and then populates the interface)
 				return common.ContextError(err)
 			}
+			// Note: an unmarshal directly into &database would fail
+			// to reset to zero value fields not present in the JSON.
+			database.Hosts = newDatabase.Hosts
+			database.Servers = newDatabase.Servers
+			database.Sponsors = newDatabase.Sponsors
+			database.Versions = newDatabase.Versions
+			database.DefaultSponsorID = newDatabase.DefaultSponsorID
+
 			return nil
 		})