Няшная / Говнокод #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 и прочих юзать платформенные плашки, где этот вопрос уже давно решен. Это позволит избежать ебли с потусторонними либами, где дела, как правило, обстоят ещё хуже.

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

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

Где здесь C++, guest?!

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


    8