🔧 fix(TiffPreviewParser): écarter un candidat sans magic FFD8 + outil d'audit#28
Merged
Merged
Conversation
… de lever Un Canon PowerShot G12 levait CorruptedFileException alors que son CR2 contient une preview parfaitement valide. Son IFD2 ment : il déclare Compression = 6 sur des données brutes (3a025c02… au lieu de ffd8). Comme c'est le plus gros bloc (935 Ko contre 455), le tri par taille le présentait en premier — et le parseur levait, sans jamais essayer l'IFD0 qui portait le vrai JPEG. Incohérence de traitement : le parseur écartait déjà gracieusement un candidat en JPEG lossless, mais levait sur un candidat sans magic. Les deux cas sont pourtant identiques — un candidat inexploitable dans un fichier sain. Un tag qui ment sur son contenu est courant dans les RAW. CorruptedFileException reste réservée à ce qui est structurellement invalide : offset hors bornes, IFD tronqué, valeur plus grande que le fichier. Découvert par bin/audit-cameras.php sur 21 modèles Canon. Closes #27
…ls.us Valider à la main ne passe pas l'échelle : 406 modèles pour les seules marques du périmètre. Cet outil parcourt le catalogue, télécharge, extrait, valide par imagecreatefromstring(), supprime, et rapporte. php bin/audit-cameras.php Canon 20 # 20 modèles Canon php bin/audit-cameras.php all 500 # tout le catalogue Rien n'est conservé : seuls les échecs comptent, chacun désignant une structure que le parseur ne sait pas encore lire. Deux choix qui comptent : - l'échantillon est réparti sur toute la gamme, pas pris en tête de liste : les N premiers modèles alphabétiques sont souvent la même génération, or c'est la dérive entre générations qui casse les parseurs ; - les fichiers sont téléchargés entiers. Une première version n'en prenait que 8 Mo : le parseur refusait alors des offsets tronqués — à juste titre — et l'audit comptait ces refus comme des bugs. Un auditeur qui ment sur ses échecs coûte plus cher en enquête qu'il n'économise de bande passante. L'outil vit dans bin/, exclu de l'archive publiée par .gitattributes. Il a trouvé son premier vrai bug dès le premier passage (#27, PowerShot G12).
Le tableau des 9 appareils validés à la main ne dit pas tout : l'auditeur teste le catalogue raw.pixls.us — 400+ modèles. Le README donne la commande et le résultat du dernier passage Canon. Lister les 25 modèles serait illisible et masquerait l'essentiel : tous les boîtiers EOS passent, du 30D de 2006 au R5. Les échecs restants sont des compacts dont les fichiers ne contiennent réellement aucune preview JPEG — des DNG générés par CHDK avec une vignette 128x96 non compressée, ou des .CRW d'avant le CR2, hors périmètre. PreviewNotFoundException y est la bonne réponse.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #27
Le bug
Un Canon PowerShot G12 levait
CorruptedFileExceptionalors que son CR2 contient une preview parfaitement valide.ffd8ffdb— vrai JPEG3a025c02…— données brutesL'IFD2 ment sur son contenu. Comme il est le plus gros, le tri par taille le présentait en premier — et le parseur levait, sans jamais essayer l'IFD0.
Incohérence : le parseur écartait déjà gracieusement un candidat en JPEG lossless, mais levait sur un candidat sans magic. Les deux cas sont identiques — un candidat inexploitable dans un fichier sain. Un tag qui ment est courant dans les RAW ;
CorruptedFileExceptionreste réservée à l'offset hors bornes, l'IFD tronqué, la valeur plus grande que le fichier.L'outil qui l'a trouvé
bin/audit-cameras.phpteste le package contre le catalogue raw.pixls.us — 400+ modèles. Il télécharge, extrait, valide parimagecreatefromstring(), supprime, rapporte.Deux choix de conception :
Résultat
Audit Canon, 21 modèles : 66,7 % → 76,2 %, les deux
CorruptedFileExceptiondisparues.Tous les boîtiers EOS passent — du 30D (2006) au R5. Les 5 échecs restants sont des compacts dont les fichiers ne contiennent aucun JPEG (vérifié : zéro
FFD8FF) : DNG générés par CHDK avec une vignette 128×96 non compressée, ou.CRWd'avant le CR2, hors périmètre.PreviewNotFoundExceptiony est la bonne réponse.