mardi 6 mai 2014

Recompilation de l'utilitaire "file" pour Synology

TLDR; Solution pour corriger le segfault de "file": remplacer le fichier /opt/lib/libmagic.so.1.0.0 par celui-ci:
https://drive.google.com/file/d/0B9w1DBAb0xtWSDBhdWFadjZyQTg/edit?usp=sharing

Le problème 

Depuis la dernière mise à jour ipkg, l'utilitaire "file" ne marche que partiellement sur mon Synology DS 207+. Symptômes:
file /path/to/something
renvoie la bonne information de fichier mais est suivie d'un segfault:
/path/to/something: RAR archive data, v1d, os: Win32
Segmentation fault (core dumped)

En soi, l'utilitaire reste utilisable en ligne de commande, mais il ne peut plus être appelé dans un script, car dès qu'on essaie de sauver le stdout, le segfault prend le pas et rien n'est sauvé. file /path/to/something | grep . ne renvoie rien, myvar=$(file -b /path/to/something) est vide.

La solution

Il faut recompiler file, en version 5.12. Pour cela, installer le toolchain, comme expliqué dans l'article sur rsyncrypto. Puis, télécharger le code de file-5.12, ici: ftp://ftp.astron.com/pub/file/file-5.12.tar.gz . L'extraire, et modifier le fichier src/apprentice.c ainsi:
--- apprentice.c.old    2014-05-06 09:57:34.154444863 +0200
+++ apprentice.c    2014-05-06 09:59:03.834446304 +0200
@@ -348,11 +348,9 @@
 protected void
 file_ms_free(struct magic_set *ms)
 {
-    size_t i;
     if (ms == NULL)
         return;
-    for (i = 0; i < MAGIC_SETS; i++)
-        mlist_free(ms->mlist[i]);
+    mlist_free(ms->mlist[0]);
     free(ms->o.pbuf);
     free(ms->o.buf);
     free(ms->c.li);


Recompiler (comme pour rsyncrypto) avec:
./configure --host=arm-marvell-linux-gnu --target=arm-marvell-linux-gnu --build=i686-pc-linux --prefix=/opt/
CC=arm-marvell-linux-gnu-gcc ARCH=arm make
(en cas de problème de compilation, il vous faudra peut être installer file5.12 sur votre machine compilante et/ou transférer votre fichier synology /opt/share/misc/magic.mgc vers votre répertoire source de compilation)

Puis transférer le fichier résultat: src/.libs/libmagic.so.1.0.0 (qui sera ainsi non-strippé par ailleurs, de même que le binaire file situé au même endroit mais qu'il n'est pas nécessaire de transférer, lui) vers le Synology, dans /opt/lib/
Lien vers le fichier libmagic.so.1.0.0 recompilé pour DS-207+:
https://drive.google.com/file/d/0B9w1DBAb0xtWSDBhdWFadjZyQTg/edit?usp=sharing

Pour info, mais non-nécessaire, le lien vers le binaire file recompilé, non-strippé:
https://drive.google.com/file/d/0B9w1DBAb0xtWdVFyT0d2TmNFVHM/edit?usp=sharing


(NB: le core dump se fait dans /volume1/@file.core , pour tout autre système, vous pouvez savoir où se trouve votre coredump en faisant:
cat /proc/sys/kernel/]core_pattern

Pour plus d'info: Read /usr/src/linux/Documentation/sysctl/kernel.txt.
[/proc/sys/kernel/]core_pattern is used to specify a core dumpfile pattern name.

If the first character of the pattern is a '|', the kernel will treat the rest of the pattern as a command to run. The core dump will be written to the standard input of that program instead of to a file.
Pour debugger cela, vous auriez eu besoin de gdb sur le syno, puis de faire du gdb à coup de :
file /path/to/something
gdb file /volume1/@file.core 
avec des versions de file et libmagic.so.1.0.0 recompilées pour ne pas être strippées.
Puis les commandes gdb classiques: "bt", ...
)


Aucun commentaire:

Enregistrer un commentaire