1. Си / Говнокод #7522

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    /* gcc -static -Os -W -nostartfiles -fno-stack-protector -U_FORTIFY_SOURCE glibc_preinstall.c */
    
    #include <unistd.h>
    #include <signal.h>
    #include <sys/utsname.h>
    
    #ifndef MIN_KERNEL_VERSION
    # error "MIN_KERNEL_VERSION not defined"
    #endif
    #define PRINT_MSG(msg) write(2, (msg), sizeof(msg) - 1)
    #define FATAL(msg) do {PRINT_MSG(msg); kill_parent(); _exit(1);} while(0)
    
    static void kill_parent(void)
    {
    	pid_t pid = getppid();
    	if (pid < 100)
    		return;
    
    	PRINT_MSG("Sending SIGSTOP signal to parent process.\n");
    	(void) kill(pid, SIGSTOP);
    }
    
    static int is_digit(char c)
    {
    	return c >= '0' && c <= '9';
    }
    
    static int
    parse_release(const char *p)
    {
    	unsigned int i, osversion = 0;
    
    	for (i = 0; i < 3 && *p; i++, ++p)
    	{
    		unsigned int d = 0;
    
    		for (; is_digit(*p); ++p)
    			d = d * 10 + (*p - '0');
    
    		if (d == 0 || d >= 255 || (i < 2 && *p && *p != '.'))
    		{
    			osversion = 0;
    			break;
    		}
    		osversion |= d << (16 - 8 * i);
    	}
    	return osversion;
    }
    
    static void
    check_kernel_version(void)
    {
    	struct utsname name;
    
    	if (uname(&name) < 0)
    		FATAL("kernel version check failed: uname syscall failed.\n");
    
    	if (parse_release(name.release) < parse_release(MIN_KERNEL_VERSION))
    		FATAL("kernel version check failed: KERNEL TOO OLD, "
    		      "minimal version supported by glibc is " MIN_KERNEL_VERSION
    		      ".\n");
    }
    
    void
    _start(void)
    {
    	check_kernel_version();
    	_exit(0);
    }

    Скрипт на языке Си, проверяющий, что загружено ядро версии не меньшей чем MIN_KERNEL_VERSION (2.6.18 на момент написания). Очень красиво взрывается на ядре 3.0.

    Запостил: raorn, 11 Августа 2011

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

    • много шуму из ничего...
      Ответить
      • Ну как сказать "ничего"... Этот код запускается перед установкой rpm пакета с glibc, в том числе и при разворачивании чрута.
        Ответить
        • всмысле - слишком много кода для относительно тривиальной проверки
          Ответить
          • Наоборот - мало! Нет чрутизации, понижения привилегий и использования capabilities.
            Ответить
            • а, у вас тег "сарказм" отклеился.
              Ответить
              • Давно пора всем дать флажки с надписью "сарказм", а то столько недопонимания вокруг!
                _________
                |сарказм|
                --------------
                |
                |
                |
                Ответить
              • [+1]
                _________
                |сарказм|
                --------------
                |
                |
                |
                Ответить
    • >то загружено ядро версии не меньшей чем MIN_KERNEL_VERSION (2.6.18
      (2+6+18) < загружено_ядро ?
      Ответить
    • а всего-то надо числа через точку разбить на массивы, выровнять длину более короткого добавлением нулей и сравнивать попарно.
      2.6.18 < 3(.0.0.0)
      Ответить
    • ядрочистыйизумруд 2.6.18
      Ответить
    • >Скрипт на языке Си
      Вы пользуетесь интерпретаторами языка Си?
      Ответить
      • Вы каждый трёхстрочник гордо именуете Программой?
        Ответить
        • *гордо* Да!
          Ответить
        • Программусичка...
          Ответить
          • Программуничка
            Ответить
            • Как ты попал в этот тред?
              Ответить
              • Наткнулся на https://govnokod.ru/27766#comment707393 и поискал слово "программусичка" вот таким образом: https://gcode.space/#!/search?q=программусичка
                Ответить
                • Но ведь там нету слова "программусичка".
                  Ответить
                  • Ну и что? Там зато есть "Программочка", а это довольно близко. Я поискал похожее слово. Кстати, я вот еще что нашел: https://govnokod.ru/27703#comment677966
                    Ответить
        • Из них первая строчка — шебанг, а вторая — указание кодировки для vim-а.
          Ответить
        • #!/bin/c
          Ответить
          • На самом деле уже не смешно:
            http://www.softintegration.com/products/chstandard/
            Ответить
            • Был ещё CINT от церна. Интерпретатор плюсов родом из конца восьмидесятых.
              Ответить
              • Спасибо. На страничке CINT'а написано, что они рекомендуют использовать более новый интерпретатор — Cling:
                https://root.cern.ch/cling

                Да и сам CINT пока ещё можно скачать.
                Ответить
                • Cling, afair, это обвязка к клангу. Ничего принципиально нового.

                  А вот CINT (и ROOT, для которого он оригинально был сделан) - это выдающийся образец контента для говнокодика. История такова: в конце восьмидесятых весь церн заебался писать на фортране77 и было решено переписать все нужные либы на новый модный молодой язык - плюсы. Сразу после этого вышел фортран90, потом ещё пара ревизий фортрана, более удобных для церновского применения, но ROOT уже пустил корни и до сих пор является основной софтиной для обработки данных.

                  Пользоваться этим ужасом довольно стрёмно. Я где-то в районе второго курса попробовал чего-то уровня лабы на нём написать и могу сравнить этот ад с помесью винапи и матлаба. Собственно, физики из церна тоже уже почти сдались и без обёртки на питоне в рут нынче почти никто не лазает.
                  Ответить
    • из строки 40 выкинуть d == 0 и делов то блеать

      unsigned int count;
      ...
      for (count = 0; is_digit(*p); ++p, ++count)
      			d = d * 10 + (*p - '0');
      
      		if (!count || d >= 255 || (i < 2 && *p && *p != '.'))
      		{
      			osversion = 0;
      			break;
      		}
      Ответить
    • >> kill_parent

      Статья 105 УК РФ
      Ответить
      • А ведь в типичном коде ещё хуже: send message to child and wait until it kills itself.Доведение ребенка до самоубийства. Или вообще kill(child). Куда смотрит роскомнадзор ;)
        Ответить
        • Зачем слать месадж, если можно сразу послать сигнал?
          Ответить
          • Послал тебе сигнал на соседнюю машину, проверь.
            Ответить
            • Какой еще чайлд на соседней машине?
              Ответить
              • Всё, пора спать...
                Ответить
              • Может там кластер с мигрирующими процессами, как например в https://en.wikipedia.org/wiki/Single_system_image с "process migration"
                Ответить

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