@@ -138,10 +138,10 @@ tarPackageChecks lax now tarGzFile contents = do
138138 expectedDir = display pkgid
139139
140140 selectEntry entry = case Tar. entryContent entry of
141- Tar. NormalFile bs _ -> Just (normalise (Tar. entryPath entry), NormalFile bs)
142- Tar. Directory -> Just (normalise (Tar. entryPath entry), Directory )
143- Tar. SymbolicLink linkTarget -> Just (normalise (Tar. entryPath entry), Link ( Tar. fromLinkTarget linkTarget) )
144- Tar. HardLink linkTarget -> Just (normalise (Tar. entryPath entry), Link ( Tar. fromLinkTarget linkTarget) )
141+ Tar. NormalFile bs _ -> Just (normalise (Tar. entryTarPath entry), NormalFile bs)
142+ Tar. Directory -> Just (normalise (Tar. entryTarPath entry), Directory )
143+ Tar. SymbolicLink linkTarget -> Just (normalise (Tar. entryTarPath entry), Link linkTarget)
144+ Tar. HardLink linkTarget -> Just (normalise (Tar. entryTarPath entry), Link linkTarget)
145145 _ -> Nothing
146146 files <- selectEntries explainTarError selectEntry entries
147147 return (pkgid, files)
@@ -331,14 +331,14 @@ warn msg = tell [msg]
331331runUploadMonad :: UploadMonad a -> Either String (a , [String ])
332332runUploadMonad (UploadMonad m) = runIdentity . runExceptT . runWriterT $ m
333333
334- selectEntries :: forall err a .
334+ selectEntries :: forall tarPath linkTarget err a .
335335 (err -> String )
336- -> (Tar. Entry -> Maybe a )
337- -> Tar. Entries err
336+ -> (Tar. GenEntry tarPath linkTarget -> Maybe a )
337+ -> Tar. GenEntries tarPath linkTarget err
338338 -> UploadMonad [a ]
339339selectEntries formatErr select = extract []
340340 where
341- extract :: [a ] -> Tar. Entries err -> UploadMonad [a ]
341+ extract :: [a ] -> Tar. GenEntries tarPath linkTarget err -> UploadMonad [a ]
342342 extract _ (Tar. Fail err) = throwError (formatErr err)
343343 extract selected Tar. Done = return selected
344344 extract selected (Tar. Next entry entries) =
@@ -352,18 +352,20 @@ data CombinedTarErrs =
352352 | TarBombError FilePath FilePath
353353 | FutureTimeError FilePath UTCTime UTCTime
354354 | PermissionsError FilePath Tar. Permissions
355+ | LongNamesError Tar. DecodeLongNamesError
355356
356357tarballChecks :: Bool -> UTCTime -> FilePath
357358 -> Tar. Entries Tar. FormatError
358- -> Tar. Entries CombinedTarErrs
359+ -> Tar. GenEntries FilePath FilePath CombinedTarErrs
359360tarballChecks lax now expectedDir =
360361 (if not lax then checkFutureTimes now else id )
361362 . checkTarbomb expectedDir
362363 . (if not lax then checkUselessPermissions else id )
363364 . (if lax then ignoreShortTrailer
364365 else fmapTarError (either id PortabilityError )
365- . Tar. checkPortability)
366- . fmapTarError FormatError
366+ . Tar. mapEntries (\ entry -> maybe (Right entry) Left (Tar. checkEntryPortability entry)))
367+ . fmapTarError (either FormatError LongNamesError )
368+ . Tar. decodeLongNames
367369 where
368370 ignoreShortTrailer =
369371 Tar. foldEntries Tar. Next Tar. Done
@@ -373,32 +375,39 @@ tarballChecks lax now expectedDir =
373375 fmapTarError f = Tar. foldEntries Tar. Next Tar. Done (Tar. Fail . f)
374376
375377checkFutureTimes :: UTCTime
376- -> Tar. Entries CombinedTarErrs
377- -> Tar. Entries CombinedTarErrs
378+ -> Tar. GenEntries FilePath linkTarget CombinedTarErrs
379+ -> Tar. GenEntries FilePath linkTarget CombinedTarErrs
378380checkFutureTimes now =
379381 checkEntries checkEntry
380382 where
381383 -- Allow 30s for client clock skew
382384 now' = addUTCTime 30 now
385+
386+ checkEntry :: Tar. GenEntry FilePath linkTarget -> Maybe CombinedTarErrs
383387 checkEntry entry
384388 | entryUTCTime > now'
385389 = Just (FutureTimeError posixPath entryUTCTime now')
386390 where
387391 entryUTCTime = posixSecondsToUTCTime (realToFrac (Tar. entryTime entry))
388- posixPath = Tar. fromTarPathToPosixPath ( Tar. entryTarPath entry)
392+ posixPath = Tar. entryTarPath entry
389393
390394 checkEntry _ = Nothing
391395
392- checkTarbomb :: FilePath -> Tar. Entries CombinedTarErrs -> Tar. Entries CombinedTarErrs
396+ checkTarbomb
397+ :: FilePath
398+ -> Tar. GenEntries FilePath linkTarget CombinedTarErrs
399+ -> Tar. GenEntries FilePath linkTarget CombinedTarErrs
393400checkTarbomb expectedTopDir =
394401 checkEntries checkEntry
395402 where
396403 checkEntry entry =
397- case splitDirectories (Tar. entryPath entry) of
404+ case splitDirectories (Tar. entryTarPath entry) of
398405 (topDir: _) | topDir == expectedTopDir -> Nothing
399- _ -> Just $ TarBombError (Tar. entryPath entry) expectedTopDir
406+ _ -> Just $ TarBombError (Tar. entryTarPath entry) expectedTopDir
400407
401- checkUselessPermissions :: Tar. Entries CombinedTarErrs -> Tar. Entries CombinedTarErrs
408+ checkUselessPermissions
409+ :: Tar. GenEntries FilePath linkTarget CombinedTarErrs
410+ -> Tar. GenEntries FilePath linkTarget CombinedTarErrs
402411checkUselessPermissions =
403412 checkEntries checkEntry
404413 where
@@ -410,11 +419,14 @@ checkUselessPermissions =
410419 where
411420 checkPermissions expected actual =
412421 if expected .&. actual /= expected
413- then Just $ PermissionsError (Tar. entryPath entry) actual
422+ then Just $ PermissionsError (Tar. entryTarPath entry) actual
414423 else Nothing
415424
416425
417- checkEntries :: (Tar. Entry -> Maybe e ) -> Tar. Entries e -> Tar. Entries e
426+ checkEntries
427+ :: (Tar. GenEntry tarPath linkTarget -> Maybe e )
428+ -> Tar. GenEntries tarPath linkTarget e
429+ -> Tar. GenEntries tarPath linkTarget e
418430checkEntries checkEntry =
419431 Tar. foldEntries (\ entry rest -> maybe (Tar. Next entry rest) Tar. Fail
420432 (checkEntry entry))
@@ -468,6 +480,10 @@ explainTarError (PermissionsError entryname mode) =
468480 where
469481 showMode :: Tar. Permissions -> String
470482 showMode m = printf " %.3o" (fromIntegral m :: Int )
483+ explainTarError (LongNamesError err) =
484+ " There is an error in the format of entries with long names in the tar file: " ++ show err
485+ ++ " . Check that it is a valid tar file (e.g. 'tar -xtf thefile.tar'). "
486+ ++ " You may need to re-create the package tarball and try again."
471487
472488quote :: String -> String
473489quote s = " '" ++ s ++ " '"
0 commit comments