Je suis en train de m'intéresser aux pipes chaînés en c.
En voulant traiter un simple fichier texte, je me suis aperçu que des données binaires étaient injectées dans les données de retour de l'appel système "system" à l'appel de la fonction sort.
voici le code de ma fonction de chaînage:
int process_pipe_chained(char **commands, int nbr_commands, char *file, size_t content_size)
{
int tube[2];
char *content = strdup(file), c;
int size = content_size;
for(int i = 0; i < nbr_commands; i++)
{
if(process_pipe(commands[i], tube) != 0) {
perror("invoque_processus");
exit(EXIT_FAILURE);
}
printf("-- Avant l'appel du module --\n%s--\n", content);
write(tube[1], content, size);
close(tube[1]);
size = 0;
free(content);
content = malloc(128);
while(read(tube[0], &c, 1) == 1)
{
char tmpchar[2];
tmpchar[0] = c;
if(size > strlen(content) - 10)
{
content = realloc(content, strlen(content) + 128);
size = strlen(content) + 128;
}
if(!size)
strcpy(content, tmpchar);
else
strncat(content, tmpchar, 1);
size++;
}
close(tube[0]);
printf("-- Après l'appel du module --\n%s\n", content);
}
return 0;
}
et voici le code de ma fonction d'"entubage":
int process_pipe (const char * commande, int fd[2])
{
int tube_1[2];
int tube_2[2];
if ((pipe(tube_1) != 0) || (pipe(tube_2) != 0))
return -1;
switch (fork()) {
case -1 :
close(tube_1[0]); close(tube_1[1]);
close(tube_2[0]); close(tube_2[1]);
return -1;
case 0 :
close(tube_1[1]);
close(tube_2[0]);
dup2(tube_1[0], STDIN_FILENO);
dup2(tube_2[1], STDOUT_FILENO);
system(commande);
exit(EXIT_SUCCESS);
default :
close(tube_1[0]);
close(tube_2[1]);
fd[1] = tube_1[1];
fd[0] = tube_2[0];
}
return 0;
}
Lorsque j'essaie par exemple d'extraire des lignes de texte grâce à "grep" puis de les trier avec "sort", ce dernier module ( mais pas grep ) introduit des données binaires dans son retour.
J'ai donc au final une séquence d'extraits de texte triées mais comportant des données binaires rangés au début.
On peut le vérifier en inversant l'appel des modules "grep" et "sort" car dans ce cas le programme me renvoie:
Merci de votre attention
Fichier binaire (entrée standard) correspondant
# trailing zero
Posté par goeb . Évalué à 3.
Quand tu fais ceci :
Le
'\0'
final n'est peut-être pas copié (selon ce que tu lui passes danssize
).Est-ce que l'absence de ce
'\0'
final ne pourrait pas être la cause de l'apparition des "données binaires" suspectes ?# faut que j'apprenne comment faire du café
Posté par gunsailor . Évalué à 1.
merci je m'en étais aperçu.
En plus de cela je m'étais mélangé les pinceaux avec la variable "size" pour effectuer l'agrandissement de ma variable "content". sujet résolu.
# fin de chaine !
Posté par Tonton Th (Mastodon) . Évalué à 2.
Là, il manque
tmpchar[1] = '\0';
, donc paf, buffer overflow ?Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.