From 41f7bab1c568d9affc6152c385068fe12d4c1237 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Thu, 22 Mar 2018 14:12:21 +0100 Subject: [PATCH] Fix: Store::create() should fail if the entry exists --- lib/core/libimagstore/src/store.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/core/libimagstore/src/store.rs b/lib/core/libimagstore/src/store.rs index bab9a6fd..a9c3aad8 100644 --- a/lib/core/libimagstore/src/store.rs +++ b/lib/core/libimagstore/src/store.rs @@ -317,6 +317,7 @@ impl Store { /// /// On error: /// - Errors StoreId::into_storeid() might return + /// - EntryAlreadyExists(id) if the entry exists /// - CreateCallError(LockPoisoned()) if the internal lock is poisened. /// - CreateCallError(EntryAlreadyExists()) if the entry exists already. /// @@ -325,6 +326,17 @@ impl Store { debug!("Creating id: '{}'", id); + let exists = id.exists()? || self.entries + .read() + .map(|map| map.contains_key(&id)) + .map_err(|_| SE::from_kind(SEK::LockPoisoned)) + .chain_err(|| SEK::CreateCallError)?; + + if exists { + debug!("Entry exists: {:?}", id); + return Err(SEK::EntryAlreadyExists(id).into()); + } + { let mut hsmap = self .entries @@ -1420,7 +1432,7 @@ mod store_tests { for n in 1..100 { let s = format!("test-{}", n % 50); store.create(PathBuf::from(s.clone())) - .map_err(|e| assert!(is_match!(e.kind(), &SEK::CreateCallError) && n >= 50)) + .map_err(|e| assert!(is_match!(e.kind(), &SEK::EntryAlreadyExists(_)) && n >= 50)) .ok() .map(|entry| { assert!(entry.verify().is_ok());