From 71a1bdf294b2ec84115f98d2f8a214d5ac8b396f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 12 Aug 2016 00:23:18 -0400 Subject: don't allow overwrite of object file --- Storage/LocalFiles.hs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'Storage') diff --git a/Storage/LocalFiles.hs b/Storage/LocalFiles.hs index fd77ba1..f34a8b5 100644 --- a/Storage/LocalFiles.hs +++ b/Storage/LocalFiles.hs @@ -36,14 +36,18 @@ store i s = onError (StoreFailure . show) $ do dir <- shardDir createDirectoryIfMissing True dir let dest = dir shardFile i - let tmp = dest ++ ".tmp" - fd <- openFd tmp WriteOnly (Just 0o666) - (defaultFileFlags { exclusive = True } ) - h <- fdToHandle fd - B.hPut h (toByteString s) - hClose h - renameFile tmp dest - return StoreSuccess + exists <- doesFileExist dest + if exists + then return $ StoreFailure "file already exists" + else do + let tmp = dest ++ ".tmp" + fd <- openFd tmp WriteOnly (Just 0o666) + (defaultFileFlags { exclusive = True } ) + h <- fdToHandle fd + B.hPut h (toByteString s) + hClose h + renameFile tmp dest + return StoreSuccess retrieve :: ShardNum -> StorableObjectIdent -> IO RetrieveResult retrieve n i = onError (RetrieveFailure . show) $ do -- cgit v1.2.3