fix overwrite race with small file that got large
When adding a small file, it does not get locked down, so can be modified after git-annex checks that it's small. The use of queued git add made the race window nice and wide too. Fixed by checking if the file has changed, and by not using git add. Instead, have to recapitulate git add's handling of things like symlinks and executable files. Sponsored-by: Jochen Bartl on Patreon
This commit is contained in:
		
					parent
					
						
							
								56e095aaf4
							
						
					
				
			
			
				commit
				
					
						f259be7f39
					
				
			
		
					 5 changed files with 93 additions and 65 deletions
				
			
		| 
						 | 
				
			
			@ -453,6 +453,7 @@ addWorkTree :: CanAddFile -> AddUnlockedMatcher -> UUID -> URLString -> RawFileP
 | 
			
		|||
addWorkTree _ addunlockedmatcher u url file key mtmp = case mtmp of
 | 
			
		||||
	Nothing -> go
 | 
			
		||||
	Just tmp -> do
 | 
			
		||||
		s <- liftIO $ R.getSymbolicLinkStatus tmp
 | 
			
		||||
		-- Move to final location for large file check.
 | 
			
		||||
		pruneTmpWorkDirBefore tmp $ \_ -> do
 | 
			
		||||
			createWorkTreeDirectory (P.takeDirectory file)
 | 
			
		||||
| 
						 | 
				
			
			@ -470,7 +471,7 @@ addWorkTree _ addunlockedmatcher u url file key mtmp = case mtmp of
 | 
			
		|||
					(fromRawFilePath file)
 | 
			
		||||
					(fromRawFilePath tmp)
 | 
			
		||||
				go
 | 
			
		||||
			else void $ Command.Add.addSmall noci file
 | 
			
		||||
			else void $ Command.Add.addSmall file s
 | 
			
		||||
  where
 | 
			
		||||
	go = do
 | 
			
		||||
		maybeShowJSON $ JSONChunk [("key", serializeKey key)]
 | 
			
		||||
| 
						 | 
				
			
			@ -483,10 +484,6 @@ addWorkTree _ addunlockedmatcher u url file key mtmp = case mtmp of
 | 
			
		|||
			, maybe noop (\tmp -> pruneTmpWorkDirBefore tmp (liftIO . removeWhenExistsWith R.removeLink)) mtmp
 | 
			
		||||
			)
 | 
			
		||||
 | 
			
		||||
	-- git does not need to check ignores, because that has already
 | 
			
		||||
	-- been done, as witnessed by the CannAddFile.
 | 
			
		||||
	noci = CheckGitIgnore False
 | 
			
		||||
 | 
			
		||||
nodownloadWeb :: AddUnlockedMatcher -> DownloadOptions -> URLString -> Url.UrlInfo -> RawFilePath -> Annex (Maybe Key)
 | 
			
		||||
nodownloadWeb addunlockedmatcher o url urlinfo file
 | 
			
		||||
	| Url.urlExists urlinfo = if rawOption o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue