Forum Programmation.c sort injecte des données binaires apparemment

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
9
nov.
2017

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:

Fichier binaire (entrée standard) correspondant
Merci de votre attention

  • # trailing zero

    Posté par  . Évalué à 3.

    Quand tu fais ceci :

        write(tube[1], content, size);
    

    Le '\0' final n'est peut-être pas copié (selon ce que tu lui passes dans size).

    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  . É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  (site web personnel, Mastodon) . Évalué à 2.

    char tmpchar[2];
    tmpchar[0] = c;

    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.