OVH Cloud OVH Cloud

Concatenation de chaine de caractere

54 réponses
Avatar
Pascal
Comment concatener plusieur chaine de caractere, un nombre assez
important? je connais strcat, mais c'est pas tres pratique des que l'on
doit concatener plus de deux chaines... En gros je cherche un equivalent
a ce que l'on trouve sur java ou c++, un truc simple du style
"char1"+"char2"+char3" -> "char1char2char3".
--
Pascal

10 réponses

1 2 3 4 5
Avatar
DINH Viêt Hoà

Ah ? Moi je n'en ai vu aucune qui soit flexible (utilisable avec un
nombre qeulconque de chaines) et qui n'impose pas de limite statique à
la taille du résultat.


La solution de Horst Kraemer résolvait le problème en l'adaptant un
petit peu.

Par contre, l'utilisation initiale ne demandait peut-être pas un nombre
quelconque de chaînes de caractères ou une taille illimitée. Qui sait ?

Le faire planter oui, le contraindre à exécuter du code arbitraire,
beaucoup plus difficilement, vu que le débordement ne se fait pas sur
la piule, on ne peut pas écraser l'addresse de retour de la fonction


Je pense que dans un cas comme dans l'autre, si le serveur d'un client
est planté (puisqu'on semble parler de mise en faille distante), le
problème est le même.

Enfin pour moi les problèmes sont tout aussi grave.
<valable sous Linux>
Quand à ce qui est de l'exécution sur pile, en mettant un buffer
statique (static), on résout le problème puisqu'on fait passer le bloc
sur le segment de données.
(Quelle saugrenue idée de rendre exécutable la pile !)
</valable sous Linux>

Et tu verras si tu les lis, ces standrads, que PATH_MAX est
_optionnel_, un système POSIX n'est PAS obligé de définir PATH_MAX. Ce
que dit POSIX c'est "si le système définit PATH_MAX, alors aucun
chemin ne peut dépasser PATH_MAX", mais certains systèmes POSIX (comme
GNU/Hurd) n'ont pas de limite.


Effectivement, mais on peut forcer la valeur à _XOPEN_PATH_MAX ou à une
valeur arbitraire comme 1024 si PATH_MAX n'existe pas.

Un 3ème point est qu'accumuler des allocations mémoires pour obtenir une
"meilleure" "sécurité" ne fait qu'aggraver les performances de ton
programmes. Et oui, la présence de malloc() tout le long de l'exécution
n'est pas signe de performance.


Mauvaise libc, changer libc ? ;)


l'implémentation GNU ne me paraissait pas si catastrophique pourtant ...

malloc est peu coûteux, plus coûteux que rien c'est sur, mais pas tant
que ça non plus, c'est très rarement le facteur limitant.


c'est déjà plus coûteux qu'une allocation statique.

Le problème du buffer overflow n'est pas que le buffer soit fixe, c'est
savoir comment utiliser judicieusement le buffer qu'on a prévu (par
exemple buffer de taille PATH_MAX fixe) en tenant compte des paramètres
du système (PATH_MAX par exemple).


C'est aussi qu'il est sur la pile, et donc beaucoup plus dangereux
(car si on déborde, on tape sur la sauvegarde de EIP ou
équivalent).


C'est quoi EIP ;) ?

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan


Avatar
Horst Kraemer
On Mon, 24 Nov 2003 00:35:49 +0100, Horst Kraemer
wrote:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>


char *concat(char *s,...)
{
char *p;
va_list ap;

va_start(ap,s);
while ((p=va_arg(ap,char*))!=0) strcat(s,p);
va_end(ap);
return s;
}

int main()
{
char *s = malloc(100);

*s=0;
concat(s,"|Hel","lo, ","world","!|",0);


Pardon, erreur de débutant de ma part ;-)

concat(s,"|Hel","lo, ","world","!|",(void*)0);

--
Horst

Avatar
kilobug

Ah ? Moi je n'en ai vu aucune qui soit flexible (utilisable avec un
nombre qeulconque de chaines) et qui n'impose pas de limite statique à
la taille du résultat.



La solution de Horst Kraemer résolvait le problème en l'adaptant un
petit peu.


Par contre, l'utilisation initiale ne demandait peut-être pas un nombre
quelconque de chaînes de caractères ou une taille illimitée. Qui sait ?


Il ne parlait pas de limite, comparait avec le string du c++, donc a
priori tout poussait à croire que c'est ce qu'il désirait.

Le faire planter oui, le contraindre à exécuter du code arbitraire,
beaucoup plus difficilement, vu que le débordement ne se fait pas sur
la piule, on ne peut pas écraser l'addresse de retour de la fonction



Je pense que dans un cas comme dans l'autre, si le serveur d'un
client est planté (puisqu'on semble parler de mise en faille
distante), le problème est le même.


Oh non, il y a une grosse différence entre un simple DoS, et la
possibilité de corrompre des données, ou de lire des données non
autorisées.

Enfin pour moi les problèmes sont tout aussi grave.


Non, dans un cas il fait réinstaller le système (si l'attaquant a pu
avoir le root) ou au moins restaurer une sauvegarde de toutes les
données faite à une date où l'on sait que les données étaient saines,
et dans beaucoup de cas pouvoir lire des données peut être aussi très
génant (avoir accès à la liste des clients d'un concurrent, voir pire,
à des numéros de carte bancaire, ...); dans l'autre le service est
juste interrompu jusqu'à ce que le démon soit redémarrer (et pour un
programme qui fork à cahque connection, comme apache 1.x, seul
l'apache répondant à la requête segv, donc pas d'interruption de
service)

<valable sous Linux>
Quand à ce qui est de l'exécution sur pile, en mettant un buffer
statique (static), on résout le problème puisqu'on fait passer le bloc
sur le segment de données.
(Quelle saugrenue idée de rendre exécutable la pile !)
</valable sous Linux>


<valable sur ia32>
Si la pile est exécutable, c'est parce que ia32 ne permet pas d'avoir
du lisible non exécutable (ia32 reconnait lecture et écriture
uniquement), les patchs qui mettent la pile non-exécutable sont
obliger de faire une série de bidouilles pour émuler la proection au
niveau logiciel, ce qui 1/ complique la gestion de la mémoire au
niveau du noyau et donc augmente le risque d'avoir un trou de sécurité
dans le noyeu lui-même 2/ coûte très cher en performances (bcp plus
que d'utiliser du malloc)
</valable sur ia32>

Et tu verras si tu les lis, ces standrads, que PATH_MAX est
_optionnel_, un système POSIX n'est PAS obligé de définir PATH_MAX. Ce
que dit POSIX c'est "si le système définit PATH_MAX, alors aucun
chemin ne peut dépasser PATH_MAX", mais certains systèmes POSIX (comme
GNU/Hurd) n'ont pas de limite.



Effectivement, mais on peut forcer la valeur à _XOPEN_PATH_MAX ou à une
valeur arbitraire comme 1024 si PATH_MAX n'existe pas.


Non, on ne peut pas. Il faut utiliser fpathconf, et même fpathconf
n'es't pas obligé dindiquer une limite. Si fpathconf renvoie -1 (pas
de limite) alors un programme POSIX _doit_ savoir gérer un nom de
fichier potentiellement illimité

Un 3ème point est qu'accumuler des allocations mémoires pour obtenir une
"meilleure" "sécurité" ne fait qu'aggraver les performances de ton
programmes. Et oui, la présence de malloc() tout le long de l'exécution
n'est pas signe de performance.


Mauvaise libc, changer libc ? ;)



l'implémentation GNU ne me paraissait pas si catastrophique pourtant ...


Le malloc GNU est rapide, et le coût cumulé des malloc dans un
programme est (presque tout le temps) négligeable comparé au
reste. Bien sûr il y a des cas très spéciaux ou ce n'est pas le cas,
mais en général si. (d'ailleurs ça se constate avec un ooprofile)

malloc est peu coûteux, plus coûteux que rien c'est sur, mais pas tant
que ça non plus, c'est très rarement le facteur limitant.



c'est déjà plus coûteux qu'une allocation statique.


Certes, mais n'oublions pas la loi du 90/10 qui la règle en
optimisation: 10% du code prend 90% du temps d'exécution, et perdre un
peu sur le 90% restant du code est complétement négligeable en terme
de vitesse globale du programme.

Le problème du buffer overflow n'est pas que le buffer soit fixe, c'est
savoir comment utiliser judicieusement le buffer qu'on a prévu (par
exemple buffer de taille PATH_MAX fixe) en tenant compte des paramètres
du système (PATH_MAX par exemple).


C'est aussi qu'il est sur la pile, et donc beaucoup plus dangereux
(car si on déborde, on tape sur la sauvegarde de EIP ou
équivalent).



C'est quoi EIP ;) ?


Le nom du register ia32 qui contient l'addresse de l'instruction
suivante à exécuter, lorsque tu appelles une fonction, EIP est
sauvegardé sur la pile, pour qu'au "return" il puisse rrprendre
l'exécution là où il faut. Si tu débordes d'un buffer statique, tu
peux écraser cette sauvegarde de EIP, et forcer le programme à
exécuter le code que tu veux (puisque que tu peux lui dire où
continuer l'exécution). Le nom "EIP" est ia32-only, mais le principe
est le même un peu partout.

--
Gael Le Mignot "Kilobug" - - http://kilobug.free.fr
GSM : 06.71.47.18.22 (in France) ICQ UIN : 7299959
Fingerprint : 1F2C 9804 7505 79DF 95E6 7323 B66B F67B 7103 C5DA

Member of HurdFr: http://hurdfr.org - The GNU Hurd: http://hurd.gnu.org



Avatar
Jean-Marc Bourguet
DINH Viêt Hoà writes:

(Quelle saugrenue idée de rendre exécutable la pile !)


Qu'est-ce que ca apporte a par une fausse idee de securite qu'elle ne
le soit pas?

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
espie
In article ,
Gaël Le Mignot wrote:


Enfin, il y a la solution utilise asprintf (libc GNU) ou
g_strdup_printf (GLib) qui fonctionne comme snprintf mais alloue
automatiquement la taille nécessaire.


Ce serait pas mal d'essayer d'éviter de donner de mauvaises habitudes en
conseillant l'utilisation de fonctions (vraiment) non-standards. Je sais
bien que ces fonctions sont pratiques mais vu qu'elles n'existent
souvent que sur une plateforme unique (Linux et GNU), ce n'est pas
l'idéal.


Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.


Juste un doigt de proselytisme. Il existe une licence libre (BSD) qui
se fonde sur des ideaux philosophiques differents de ceux de la GPL.
Ca peut etre un choix alternatif interessant, d'autant qu'il existe
plethore de bon code disponible sous cette licence.

De plus, la nature virale de la licence GPL pose aussi probleme: si
on commence a developper en integrant des bouts de code GPL, on place
d'office le developpement sous licence GPL... et on se coupe de certaines
personnes, qui auront un a priori tres negatif vis-a-vis de la GPL, et
de certaines possibilites de faire evoluer son code, vers certaines
pratiques commerciales par exemple.

D'accord, on peut isoler les bouts de code dans des fichiers a part,
mais il faut penser a le faire. Et egalement preter attention a ce qu'on
met dans les fichiers de licence/copyright. Et bien realiser que le
developpement dans son ensemble sera infecte par la licence GPL tant
que des fichiers sous cette licence traineront dans celle-ci.

Certaines personnes penseront que c'est un choix raisonnable.

Moi, je prefere que ca soit un choix assume, que la personne qui utilise
du code GPL sache bien dans quel engrenage elle met son doigt.
Il n'y a, helas ou heureusement, pas que le critere technique de la
qualite du code concerne a considerer.

Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).


Tiens, ca sent tres fort le Hurd, ca, comme habitude. Oui, avoir
des chemins de taille quelconque, c'est parfois utile. Meme si ca
sert en pratique parfois. A cote de cela, on attend toujours
l'integration de certaines fonctions sures comme strlcpy ou strlcat dans
la glibc, si je ne m'abuse...


Accessoirement, je ne conseillerais a personne de reutiliser du code
de la glibc, cote genie logiciel. Ce code est beaucoup trop dependant
d'un compilateur (gcc), d'une famille d'entetes systeme, et de lui-meme.
Les bouts de la glibc implementees entierement sous forme de macros dans
des entetes, tres peu pour moi. Dans pas mal de cas, il va etre delicat
de sortir ce qu'on veut du code de la glibc sans recuperer tout un echeveau
de #ifdef et de dependances plus ou moins adaptees avec.



Avatar
espie
In article ,
DINH Viêt Hoà wrote:
<valable sous Linux>
Quand à ce qui est de l'exécution sur pile, en mettant un buffer
statique (static), on résout le problème puisqu'on fait passer le bloc
sur le segment de données.
(Quelle saugrenue idée de rendre exécutable la pile !)
</valable sous Linux>


Cherche dans les papiers Usenix. Tu y verras un document sur
l'implementation des trampolines, qui date d'environ dix ans.

Les trampolines sont une facon elegante et efficace de faire des
fermetures lexicales, chose qui n'est normalement pas utile pour
faire du C, mais qui devient indispensable des que tu as affaire
a des langages de haut niveau. Par exemple, GCC s'en sert dans
son implementation d'Ada, ainsi que dans une extension de C `a la
Pascal' (possibilite de definir des fonctions locales).
Et je l'ai deja rencontree dans une implementation de scheme.

Et cette technique d'implementation necessite d'avoir, au moins,
des bouts de pile executable, car elle repose sur la generation de
`stubs' de code de maniere dynamique a l'execution.

On peut faire sans, mais on perd les 3/4 de l'efficacite de la
methode...

Sous OpenBSD, on a, il y a quelque temps, rendu la pile non-executable,
et on utilise mmap pour re-mettre les bouts necessaires en executable.
Il a fallu faire un peu de chirurgie dans gcc, et dans l'implementation
de scheme en question, pour que les deux daignent a nouveau fonctionner.

Avatar
DINH Viêt Hoà

Et cette technique d'implementation necessite d'avoir, au moins,
des bouts de pile executable, car elle repose sur la generation de
`stubs' de code de maniere dynamique a l'execution.


et bien voilà ! du coup, j'aurai appris qu'il existe au moins un
programme sur terre qui s'en sert.

--
DINH V. Hoa,

"je mourrai moins con"

Avatar
kilobug
Ce serait pas mal d'essayer d'éviter de donner de mauvaises habitudes en
conseillant l'utilisation de fonctions (vraiment) non-standards. Je sais
bien que ces fonctions sont pratiques mais vu qu'elles n'existent
souvent que sur une plateforme unique (Linux et GNU), ce n'est pas
l'idéal.




Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.



Juste un doigt de proselytisme. Il existe une licence libre (BSD) qui
se fonde sur des ideaux philosophiques differents de ceux de la GPL.


Oui, des idéaux de jemenfoutisme, de "oh bah qu'ils reprennent mon
code pour accroitre leur puissance commerciale afin de mieux
vérouiller l'informatique dans les brevets et du TCPA", très peu pour
moi, merci. Je ne comprends pas comment des auteurs de logiciel libre
peuvent trouver normal de laisser leur code se faire piller par des
gens qui déclarent officilement que le logiciel libre est un ennemi à
abattre.

De plus, la nature virale de la licence GPL pose aussi probleme: si
on commence a developper en integrant des bouts de code GPL, on place
d'office le developpement sous licence GPL... et on se coupe de certaines
personnes, qui auront un a priori tres negatif vis-a-vis de la GPL, et
de certaines possibilites de faire evoluer son code, vers certaines
pratiques commerciales par exemple.


Non, tu dois diffuser le reste du code sous une licence libre. Et les
libs du projet GNU sont en LGPL, donc tu peux les utiliser dans un
projet même non-libre, par contre les modifications que tu fais à la
lib elle-même doivent rester libre (rien de viral là-dedans, juste une
question de respect).

Moi, je prefere que ca soit un choix assume, que la personne qui utilise
du code GPL sache bien dans quel engrenage elle met son doigt.
Il n'y a, helas ou heureusement, pas que le critere technique de la
qualite du code concerne a considerer.


Non, en effet, il faut aussi un peu se préoccuper de problèmes
éthiques et défendre la liberté de son code.

Et une autre mauvaise habitude consiste à travailler avec des buffers
de taille fixe (pire, des char buf[SIZE] et bonjour l'exploit au
moindre bug) qui sont la plupart du temps du gachis de mémoire (buffer
trop grand) et le reste du temps des limitations (buffer trop petit).
Prendre l'habitude d'utiliser des fonctions propres (comme celle de
libc GNU), quitte à les inclure ensuite dans le programme c'est
beaucoup plus positif. (et je rappelle à tout le monde que, par
exemple, un nom de fichier ou une URL n'ont _pas_ de taille limite,
pas 512, pas 4096, pas PATHMAX, pas même fpathconf).



Tiens, ca sent tres fort le Hurd, ca, comme habitude.


Oui, GNU/Hurd n'a pas de limites, par conception même, toute forme de
limites en est banni. Rendre la liberté aux utilisateurs, c'est aussi
éviter que l'utilisateur ne subisse des limites codées en dur dans les
applications, ni des limites techniques, comme l'impossibilité de
"monter" une image ISO sans être root, ou le fait de devoir se
reloguer pour être rajouer à un groupe.

Oui, avoir des chemins de taille quelconque, c'est parfois utile.


Et bien oui, donc on ne doit pas limiter les programmes.

Meme si ca sert en pratique parfois. A cote de cela, on attend
toujours l'integration de certaines fonctions sures comme strlcpy
ou strlcat dans la glibc, si je ne m'abuse...


strlcpy et strlcat sûres ? mwarf, elles n'apportent quasiment rien de
plus que des strncpy et strncat, désolé, chez GNU on préfère éviter
les buffers statiques plutôt que de rajouter des fonctions pour les
gérer de manière un peu moins non-sûre.

On a strndup, asprintf, ... plutôt.

Enfin, comme toujours, chez BSD on préfère rajouter des ristounes
plutôt que de revoir la conception. On préfère faire des jails et
coder des "privilege separation" au niveau des applis, plutôt que
d'avoir une infrastructure qui permet de gagner et perdre
dynamiquement des jetons de sécurité, de faire tourner réellement
plusieurs piles TCP/IP n'ayant pas de privilèges... Moi je préfère
concevoir les choses proprement plutôt que de faire des bidouilles.

--
Gael Le Mignot "Kilobug" - - http://kilobug.free.fr
GSM : 06.71.47.18.22 (in France) ICQ UIN : 7299959
Fingerprint : 1F2C 9804 7505 79DF 95E6 7323 B66B F67B 7103 C5DA

Member of HurdFr: http://hurdfr.org - The GNU Hurd: http://hurd.gnu.org



Avatar
DINH Viêt Hoà

Juste un doigt de proselytisme. Il existe une licence libre (BSD) qui
se fonde sur des ideaux philosophiques differents de ceux de la GPL.


Oui, des idéaux de jemenfoutisme, de "oh bah qu'ils reprennent mon
code pour accroitre leur puissance commerciale afin de mieux
vérouiller l'informatique dans les brevets et du TCPA", très peu pour
moi, merci. Je ne comprends pas comment des auteurs de logiciel libre
peuvent trouver normal de laisser leur code se faire piller par des
gens qui déclarent officilement que le logiciel libre est un ennemi à
abattre.


Je pense qui si qu'un auteur de projet BSD sera content de se piller
lui-même plutôt que de ne pas pouvoir vendre son logiciel à cause de la
licence BSD.

sendmail.com a l'air de très bien y arriver.

De plus, la nature virale de la licence GPL pose aussi probleme: si
on commence a developper en integrant des bouts de code GPL, on place
d'office le developpement sous licence GPL... et on se coupe de certaines
personnes, qui auront un a priori tres negatif vis-a-vis de la GPL, et
de certaines possibilites de faire evoluer son code, vers certaines
pratiques commerciales par exemple.



ça me rappelle l'histoire d'un projet qui voulait passer de GPL en BSD
je crois ou quelque chose du genre (pour pouvoir le vendre) et tous les
co-auteurs devant donner leur accord, je crois qu'il y en a certains qui
ont bloqué. L'auteur initial devait être super content.

Sinon, à propos de la LGPL, n'est-elle pas boycottée
cette licence LGPL ? (par les GNUs)

Moi, je prefere que ca soit un choix assume, que la personne qui utilise
du code GPL sache bien dans quel engrenage elle met son doigt.
Il n'y a, helas ou heureusement, pas que le critere technique de la
qualite du code concerne a considerer.



Ce qui me paraît louche dans la GPL, c'est le :

<<
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.




bref, le "later version".

Tiens, ca sent tres fort le Hurd, ca, comme habitude.


Oui, GNU/Hurd n'a pas de limites, par conception même, toute forme de
limites en est banni. Rendre la liberté aux utilisateurs, c'est aussi
éviter que l'utilisateur ne subisse des limites codées en dur dans les
applications, ni des limites techniques, comme l'impossibilité de
"monter" une image ISO sans être root, ou



le fait de devoir se
reloguer pour être rajouer à un groupe.


Depuis quand est-ce que ce problème est lié au fait que le noyau soit
micro-noyau ou pas.
Ce problème existe-t-il ailleurs que sous linux ?


Note :
Attention, ça va virer au débat politique.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan


Avatar
espie
Je vais arreter la, d'abord parce que ca devient hors sujet, et ensuite
quand on a affaire a un zelote d'un tel calibre, c'est plus efficace de
parler a un mur...

In article ,
Gaël Le Mignot wrote:

Ce serait pas mal d'essayer d'éviter de donner de mauvaises habitudes en
conseillant l'utilisation de fonctions (vraiment) non-standards. Je sais
bien que ces fonctions sont pratiques mais vu qu'elles n'existent
souvent que sur une plateforme unique (Linux et GNU), ce n'est pas
l'idéal.


Lorsque les fonctions sont ddans une bibliothèque diffusé sous une
license libre, et que tu comptes diffuser le programme sous une
license compatibel, tu peux reprendre le code déjà fait, testé, validé
et optimisé de la libc GNU ou de la GLib, plutôt que de réinventer la
roue à chaque fois.


Juste un doigt de proselytisme. Il existe une licence libre (BSD) qui
se fonde sur des ideaux philosophiques differents de ceux de la GPL.


Oui, des idéaux de jemenfoutisme, de "oh bah qu'ils reprennent mon
code pour accroitre leur puissance commerciale afin de mieux
vérouiller l'informatique dans les brevets et du TCPA", très peu pour
moi, merci. Je ne comprends pas comment des auteurs de logiciel libre
peuvent trouver normal de laisser leur code se faire piller par des
gens qui déclarent officilement que le logiciel libre est un ennemi à
abattre.


C'est pas parce que tu ne comprends rien a la motivation qui poussent
les gens a developper du logiciel BSD que tu es oblige de raconter
n'importe quoi jusqu'a la caricature.

[...]
Non, en effet, il faut aussi un peu se préoccuper de problèmes
éthiques et défendre la liberté de son code.


Et, a ton avis, tu penses que c'est une demarche que nous n'avons pas ?
Nous sommes juste parvenus a d'autre conclusions que toi sur la marche
a suivre.

Commence par reconnaitre que tu n'as pas forcement raison, voire qu'il
n'y a pas necessairement une seule verite dans ce domaine, ca sera
un premier grand pas.

strlcpy et strlcat sûres ? mwarf, elles n'apportent quasiment rien de
plus que des strncpy et strncat, désolé, chez GNU on préfère éviter
les buffers statiques plutôt que de rajouter des fonctions pour les
gérer de manière un peu moins non-sûre.


Ca indique clairement que tu ne sais pas t'en servir, ou que tu as
trop suivi la propagande Ulrich Drepper...

On a strndup, asprintf, ... plutôt.

Enfin, comme toujours, chez BSD on préfère rajouter des ristounes
plutôt que de revoir la conception. On préfère faire des jails et
coder des "privilege separation" au niveau des applis, plutôt que
d'avoir une infrastructure qui permet de gagner et perdre
dynamiquement des jetons de sécurité, de faire tourner réellement
plusieurs piles TCP/IP n'ayant pas de privilèges... Moi je préfère
concevoir les choses proprement plutôt que de faire des bidouilles.


C'est une possibilite. Au fait, une version de Hurd qui serve a quelque
chose, c'est pour quand ?

En attendant, les rustines a la strlcpy/strlcat/snprintf ont evite plus
de trous que tout le code de Hurd reuni.

Accessoirement, le concept de privilege separation n'est absolument pas
une rustine, mais une technique raisonnable de conception. C'est un
peu complexe (voire tres dur) a retroffitter sur du logiciel existant,
mais ca marche tres bien en pratique.


Il est juste possible, la-encore, qu'on ait fait d'autres choix de
conception. Peut-etre que tout reecrire de fond en comble serait une
meilleure idee (encore que je me souviens d'un trou dans la gestion
des capabilities sous linux qui avait bien jaser dans les chaumieres),
mais il n'empeche pas qu'on a des petites avancees constantes qui finissent
par faire de grandes choses.

Si tu regardes du cote de gcc, par exemple, tu y verras pas mal de code
de verifications supplementaires qui ont ete ecrites par des gens de BSD.

Mais bon, continue a faire du Hurd, hein...




1 2 3 4 5