Няшная / Говнокод #28582 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main ()
{
   char address[128], fname[128], command[128];
   FILE *tempfile;

   strcpy(fname , tmpnam(NULL));
   tempfile = fopen (fname, "w");     /* create temporary file */
   if (tempfile == NULL)              /* error - didn't create file */
   {
      printf("Internal failure #1 please report %d\n", errno);
      exit (1);
   }
   fprintf(tempfile, "Thank you very much for caring about our cause\n");
   fprintf(tempfile, "this letter is just to tell you how much we\n");
   fprintf(tempfile, "really think you are wonderful for caring.\n\n");
   fprintf(tempfile, "Sincerely,\n\n");
   fprintf(tempfile, "Jane Doe, Executive Thanker\n");
fclose (tempfile);
   gets(address);                            /* read in email address */

   sprintf(command, "mail -s \"thanks for caring\" %s < %s\n",
           address, fname);                /* create the command */
   system (command);                       /* execute command */
   remove (fname);                         /* clean up */
   exit (0);
}

Игра: найди вулна.

Запостил: JloJle4Ka JloJle4Ka, (Updated )

Комментарии (19) RSS

  • Первая проблема:
    L_tmpnam вполне может быть больше 128 и тогда строка 9 может распидорасить стек.

    Вторая проблема:
    Строка 10 — TOCTOU, используй tmpfile, блджад.
    Ответить
    • Серьёзно, временный файл для ЭТОГО?

      gets может распидорасить стек на длинных адресах.

      sprintf тоже распидорасит стек скорее всего.

      system(command)
      дальше не читал. system с пользовательским вводом. Тут даже mysql_real_escape_strings не вызвали, так запихали.
      Ответить
  • временные файлы не могут быть длинее 128 байт, это же очевидно

    а почему это говно не на баше?
    Ответить
  • я мог бы предложить вместо сишных приблуд вроде strcpy, fopen и прочих юзать платформенные плашки, где этот вопрос уже давно решен. Это позволит избежать ебли с потусторонними либами, где дела, как правило, обстоят ещё хуже.

    Самая главшая лажа - пытаться сделать код кросскомпилируемым. Не стоит растягивать свой анус, пытаясь сделать код кросскомпилируемым. Стоит юзать апи конкретно той операционки, под которую конкретно пишешь данный софт.
    Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8