Merge pull request #1355 from matthiasbeyer/libimagstore/create-semantic-fix

Fix: Store::create() should fail if the entry exists
This commit is contained in:
Matthias Beyer 2018-03-22 22:04:29 +01:00 committed by GitHub
commit c39a1f82e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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());