OVH Cloud OVH Cloud

diff petit

11 réponses
Avatar
Vincent Bernat
Coucou !

Je cherche le source d'un diff petit en taille (pour un système
embarqué). Une fois compilé le GNU diff me prend 158 Ko ce qui est
trop gros pour moi. Le seul que j'aie trouvé est celui d'OpenBSD, mais
il ne compile pas tel quel pour Linux (strlcpy peut se remplacer par
strncpy, mais pour vasprintf...). Les autres BSD utilisent GNU Diff.

Une idée ?
--
BOFH excuse #203:
Write-only-memory subsystem too slow for this machine. Contact your local dealer.

10 réponses

1 2
Avatar
Bob qui Trolle
Vincent Bernat wrote:

Je cherche le source d'un diff petit en taille (pour un système
embarqué). Une fois compilé le GNU diff me prend 158 Ko ce qui est
trop gros pour moi.


le source de GNU-diff 2.7 est moitié moins gros que celui de GNU-diff
2.8 sur ftp.gnu.org

Sinon, le /usr/bin/diff (diffutils 2.6) livré avec slack 2.1 fait 65 K.

Avatar
Stephane Chazelas
2004-12-18, 10:49(+01), Vincent Bernat:
Je cherche le source d'un diff petit en taille (pour un système
embarqué). Une fois compilé le GNU diff me prend 158 Ko ce qui est
trop gros pour moi. Le seul que j'aie trouvé est celui d'OpenBSD, mais
il ne compile pas tel quel pour Linux (strlcpy peut se remplacer par
strncpy, mais pour vasprintf...). Les autres BSD utilisent GNU Diff.


D'en trouves un dans heirloom.sourceforge.net

--
Stephane

Avatar
Christian CAMIER
Vincent Bernat wrote:
Coucou !

Je cherche le source d'un diff petit en taille (pour un système
embarqué). Une fois compilé le GNU diff me prend 158 Ko ce qui est
trop gros pour moi. Le seul que j'aie trouvé est celui d'OpenBSD, mais
il ne compile pas tel quel pour Linux (strlcpy peut se remplacer par
strncpy, mais pour vasprintf...). Les autres BSD utilisent GNU Diff.

Une idée ?


STRLCPY est un STRNCPY qui garantie que la copie est terminée par un
caractère nul (''), ce qui évite de nombreux problèmes dus aux
longueurs différentes d chaînes.

Voici le code fourni dans le source de la libc d'OpenBSD :

======================== strlcpy.c =========================== /* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */

/*
* Copyright (c) 1998 Todd C. Miller
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#if defined(LIBC_SCCS) && !defined(lint)
static char *rcsid = "$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24
millert Exp
$";
#endif /* LIBC_SCCS and not lint */

#include <sys/types.h>
#include <string.h>

/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
size_t
strlcpy(char *dst, const char *src, size_t siz)
{
register char *d = dst;
register const char *s = src;
register size_t n = siz;

/* Copy as many bytes as will fit */
if (n != 0 && --n != 0) {
do {
if ((*d++ = *s++) == 0)
break;
} while (--n != 0);
}

/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0) {
if (siz != 0)
*d = ''; /* NUL-terminate dst */
while (*s++)
;
}

return(s - src - 1); /* count does not include NUL */
}

Avatar
Christian CAMIER
Oups ... partit trop vite

Vincent Bernat wrote:

Coucou !

Je cherche le source d'un diff petit en taille (pour un système
embarqué). Une fois compilé le GNU diff me prend 158 Ko ce qui est
trop gros pour moi. Le seul que j'aie trouvé est celui d'OpenBSD, mais
il ne compile pas tel quel pour Linux (strlcpy peut se remplacer par
strncpy, mais pour vasprintf...). Les autres BSD utilisent GNU Diff.

Une idée ?



(suite)

VASPRINTF, définie ainsi :
int vasprintf(char **ret, const char *format, va_list ap);

est un vsprintf qui écrit dans une chaine allouée dynamiquement.
Pour la mettre simplement en oeuvre, sans être obligé de tout casser, il
est possible d'utiliser un vsprintf dans un buffer static assez large
dans le cadre de l'application désirée et de retourner dans l'arg 'ret'
un strdup du resultat.


Avatar
Vincent Bernat
OoO Peu avant le début de l'après-midi du samedi 18 décembre 2004,
vers 13:34, Stephane Chazelas disait:

Je cherche le source d'un diff petit en taille (pour un système
embarqué). Une fois compilé le GNU diff me prend 158 Ko ce qui est
trop gros pour moi. Le seul que j'aie trouvé est celui d'OpenBSD, mais
il ne compile pas tel quel pour Linux (strlcpy peut se remplacer par
strncpy, mais pour vasprintf...). Les autres BSD utilisent GNU Diff.


D'en trouves un dans heirloom.sourceforge.net


Merci pour toutes les réponses.

GNU diff 2.6 me donne un exécutable plus gros que GNU diff 2.8. Sans
doute parce qu'il fait moins appel à la libc (j'ai vu passer des
réimplantations de realloc). GNU diff 2.7 ne sait pas se
crosscompiler, sans doute des bricoles à corriger dans le configure,
mais je ne sais pas comment ça fonctionne.

Le diff proposé sur heirloom avait l'air sympa, malheureusement le
support des wide char n'est pas optionnel et cela semble rentrer en
conflit avec une uclibc compilée sans ce support. Sans doute pas grand
chose à changer (éviter l'utilisation du fichier d'entête wchar.h de
uclibc), mais les .o strippés prenaient déjà une taille assez
importante sans que la compilation soit aboutie, j'ai donc laissé
tomber.

Je me suis de nouveau rabattu sur le diff d'Open. J'ai copié/collé le
code de strlcpy et strlcat (ainsi que warn, err et compagnie qui sont
dans la GNU/Libc mais qui n'ont pas l'air d'être dans la uclibc). J'ai
trouvé sur Google un fgetln qui ne faisait aucune hypothèse sur la
façon dont FILE* était implanté. Après quelques modifs triviales, je
suis parvenu à un binaire de 30 Ko pour mipsel et il fonctionne. J'ai
perdu le support du récursif en cours de route car il ne m'intéressait
pas du tout et pour une raison obscure, je n'avais pas la fonction
getdirentries.
--
I AM NOT THE LAST DON
I AM NOT THE LAST DON
I AM NOT THE LAST DON
-+- Bart Simpson on chalkboard in episode AABF21


Avatar
Vincent Bernat
OoO Vers la fin de l'après-midi du samedi 18 décembre 2004, vers
16:26, Christian CAMIER disait:

VASPRINTF, définie ainsi :
int vasprintf(char **ret, const char *format, va_list ap);

est un vsprintf qui écrit dans une chaine allouée dynamiquement.
Pour la mettre simplement en oeuvre, sans être obligé de tout casser, il
est possible d'utiliser un vsprintf dans un buffer static assez large
dans le cadre de l'application désirée et de retourner dans l'arg 'ret'
un strdup du resultat.


En fait, il est dispo dans la GNU LibC ainsi que dans uclibc. Il faut
juste faire un #define _GNU_SOURCE.
--
BOFH excuse #141:
disks spinning backwards - toggle the hemisphere jumper.

Avatar
Stephane Chazelas
2004-12-20, 08:50(+01), Etienne de Tocqueville:
[...]
size_t
strlcpy(char *dst, const char *src, size_t siz)
{
int l = strlen(src);
strncpy(dst, src, siz);
if (siz && l >= siz) dst[siz-1] = 0;
}

C'est un peu moins performant (la chaîne est parcourue deux fois) mais
ça prend beaucoup moins de place en mémoire



size_t
strlcpy(char *dst, const char *src, size_t siz)
{
strncpy(dst, src, siz);
if (siz > 0) dst[siz-1] = '';
}

devrait suffire.

--
Stephane

Avatar
Nicolas George
Stephane Chazelas wrote in message
:
size_t
strlcpy(char *dst, const char *src, size_t siz)
{
strncpy(dst, src, siz);
if (siz > 0) dst[siz-1] = '';
}


warning: control reaches end of non-void function

Il faut ruser un peu plus.

Avatar
Erwann ABALEA
On Mon, 20 Dec 2004, Nicolas George wrote:

Stephane Chazelas wrote in message
:
size_t
strlcpy(char *dst, const char *src, size_t siz)
{
strncpy(dst, src, siz);
if (siz > 0) dst[siz-1] = '';
}


warning: control reaches end of non-void function

Il faut ruser un peu plus.


Pareil pour la première version alors, elle ne renvoit rien du tout.

Et d'ailleurs, dst[siz-1] est mauvais, on écrase le dernier caractère de
la chaîne recopiée. 'dst[siz] = 0' est bon.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
J'ai appris il y a deux heures par un journaliste que cybercable.faq n'était pas
un newsgroup public. je commence à comprendre pourquoi personne n'est au
courant de l'escroquerie que nous vivons actuellement.
-+- DM in : GNU - Le quatrième pouvoir au secours du neuneu -+-


Avatar
Nicolas George
Erwann ABALEA wrote in message
:
Et d'ailleurs, dst[siz-1] est mauvais, on écrase le dernier caractère de
la chaîne recopiée.


Non, ça ne fait ça que si la source est trop longue, et ça fait partie de la
spécification de strlcpy de le faire.

'dst[siz] = 0' est bon.


Bonjour le buffer overflow.

1 2