The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Удалённо эксплуатируемая уязвимость в драйвере NVMe-oF/TCP из состава ядра Linux

16.10.2023 11:19

В Linux-подсистеме nvmet-tcp (NVMe-oF/TCP), позволяющей обращаться к NVMe-накопителям по сети (NVM Express over Fabrics), используя протокол TCP, выявлена уязвимость (CVE-2023-5178), потенциально позволяющая удалённо выполнить свой код на уровне ядра или, при наличии локального доступа, поднять свои привилегии в системе. Исправление пока доступно в виде патча. Проблема проявляется с самой первой версии драйвера NVMe-oF/TCP (в отчёте об уязвимости упоминается ядро Linux 5.15, но поддержка NVMe-oF/TCP была добавлена в ядро 5.0). Уязвимости подвержены системы с включённым сервером NVMe-oF/TCP (NVME_TARGET_TCP), который по умолчанию принимает соединения на сетевом порту 4420.

Уязвимость вызвана логической ошибкой, из-за которой функция nvmet_tcp_free_crypto вызывалась два раза и два раза освобождала некоторые указатели, а также разыменовывала освобождённые адреса. Подобное поведение приводит к обращению к уже освобождённой области памяти (use-after-free) и двойному освобождению памяти (double-free) при обработке сервером NVMe-oF/TCP специально оформленного сообщения от клиента, который может находиться как в локальной, так и в глобальной сети.

  1. Главная ссылка к новости (https://www.openwall.com/lists...)
  2. OpenNews: Уязвимости в модуле ksmbd ядра Linux, позволяющие удалённо выполнить свой код
  3. OpenNews: 0-day уязвимость в IPv6-стеке Linux, позволяющая удалённо вызвать крах ядра
  4. OpenNews: Уязвимости в ядре Linux, удалённо эксплуатируемые через Bluetooth
  5. OpenNews: Уязвимости в беспроводном стеке ядра Linux, допускающие удалённое выполнение кода
  6. OpenNews: Удалённая уязвимость в ядре Linux, проявляющаяся при использовании протокола TIPC
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/59940-linux
Ключевые слова: linux, kernel, nvme
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (143) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 11:31, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    освободил память? - присвой указателю нулл
     
     
  • 2.2, morphe (?), 11:33, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +10 +/
    Используешь C? - перестань
     
     
  • 3.3, EULA (?), 11:37, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Переходи на С++?
     
     
  • 4.10, Анонин (?), 11:55, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Хотя бы. Уже станет лучше.
    Но только если на современные плюсы, а не на сишку с классами.
     
     
  • 5.12, morphe (?), 12:05, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +6 +/
    В плюсах при низкоуровневой разработке способов прострелить себе колено пожалуй даже больше чем в C
     
     
  • 6.15, Аноним (15), 12:14, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    т.е мы приходим к теореме г-на Эскобара?
    Что С плохо (как видим из новости), что С++ не лучше.

    Вот бы придумали способ находить, а лучше предотвращать такие ошибки заранее, может какой-то новый язык написали)
    Хотя тут ИМХО даже стат анализатор помог бы, но кто его запускать будет, это же долго.

     
     
  • 7.97, all_glory_to_the_hypnotoad (ok), 17:15, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Такие ошибки предотвращать относительно просто, это указатели с экслюзивным владением и счётчики ссылок. Автор модуля банально не осилил сделать корректное управление указателем, здесь нет никакой сложной низкоуровщены. В этой же дичи всё ещё goto используют. Если в этот долбанутый Си добавили хотя бы RAII, и научили несчастных им пользоваться, то значительной части уязвимостей просто бы не было.
     
     
  • 8.105, Аноним (15), 18:06, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Так каждый раз когда приходит кто-то с предложениями улучшить процессы я уже мо... текст свёрнут, показать
     
     
  • 9.132, Аноним (132), 23:22, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ядро с сопредельным софтом сначала придётся переписать полностью Для смены язык... текст свёрнут, показать
     
     
  • 10.143, Аноним (15), 10:52, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Для смены языка - да Это очень сложный путь А обязательные стат анализаторы ... текст свёрнут, показать
     
  • 10.164, bOOster (ok), 07:38, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Очередной раз придурки не знают что такое Компоновщик Линковщик ... текст свёрнут, показать
     
  • 8.133, fidoman (ok), 23:51, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    уж вы-то лучше всех бы накодировали, без единой ошибки... текст свёрнут, показать
     
  • 7.122, анон (?), 20:07, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    На ночь через крон ставить не?
     
  • 6.47, EULA (?), 13:09, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > В плюсах при низкоуровневой разработке способов прострелить себе колено пожалуй даже больше
    > чем в C

    Чтобы не прострелить себе ногу достаточно не направлять на нее ружье, не?

    =====================
    Учитель, почему, когда я делаю так
    int *a;
    a = new int;
    char *b;
    *a=1000;
    b=a;
    *b='0';
    cout<< 1000/a <<"\n";
    Получается фигня?

    - Не делай так!

     
     
  • 7.148, name (??), 15:02, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    а это точно соберётся? там присвоение немного неодинаковых типов может вывести компилятор из себя
     
     
  • 8.158, EULA (?), 05:40, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Код в таком виде большинство компиляторов откажется собирать Но мысль, как и мо... текст свёрнут, показать
     
  • 6.66, Советский инженер (ok), 14:58, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    ето потому что к malloc/free добавили еще new/delete или что?
     
  • 6.82, Аноним (82), 16:08, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > В плюсах при низкоуровневой разработке способов прострелить себе колено пожалуй даже больше чем в C

    Хоть один пример приведете?

     
  • 5.83, Аноним (82), 16:15, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Но только если на современные плюсы, а не на сишку с классами.

    Да даже если и на сишку с классам: наличие RAII уже само по себе избавило бы от этого убогого цирка с ручным управлением ресурсами и соответствующих CVE.

     
     
  • 6.156, morphe (?), 22:20, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    RAII уже включили в ядро... В Rust.
     
  • 6.171, Аноним (171), 14:55, 20/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Да даже если и на сишку с классам: наличие RAII уже само по себе избавило бы от этого убогого цирка с ручным управлением ресурсами и соответствующих CVE.

    Не избавило бы. Сишникам только дай волю, они сразу полезут делать malloc'и и хранить строки в char*. У них квадратно-гнездовое мышление, переучить очень сложно. Типа "я 30 лет так делал и менять свои привычки не собираюсь, компилятор подвинься". Ну а потом естественно всё это феерично взрывается.

    Комитету C++ нужно отправить весь этот сишный треш в утиль.

     
  • 5.137, penetrator (?), 08:13, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    если не с классами то с чем?
     
  • 3.4, svsd_val (ok), 11:38, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Используешь не С - перестань, с чего это такие глупые призывы. ХОТЯ ДА, нынче если Ваше ПО не жрёт фигову тучу ресурсов - это не гууд... нужно по 2-3гб и по 100% нагрузке на проц на всякую бессмыслицу что бы быть в тренде ... так получается ?
     
     
  • 4.9, Аноним (9), 11:51, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +7 +/
    > нужно по 2-3гб и по 100% нагрузке на проц на всякую бессмыслицу

    Нет чувак. Это даже не проблема языка программирования, а лично разраба.

     
     
  • 5.85, svsd_val (ok), 16:21, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Согласен, но ... только при одних и тех же обстоятельствах производительность и потребление ресурсов у разных языков разное. И как бы ты не старался для оптимизации работы некоторые вещи лучше писать на асме.... увы знаю о чём говорю... и Си и С++ в этом плане шибко проигрывают чистой асме.

    Не говоря о том что многие разрабы в место того что бы реализовать маленькую фигню самим тащат монструозные зависимости которые ничего не делают, жрут ресурсы и весят балластом ) Так что да у многих прогеров нынче с этим беда...

     
     
  • 6.124, Анонин (?), 20:19, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Си и С++ в этом плане шибко проигрывают чистой асме

    Вот только сколько такого "горячего" кода в приложении? 20%? 10%? Еще меньше?
    Предварительная оптимизация - это зло.
    А пару маленьких кусков можно и на асме переписать потом, когда уже будут результаты работы профайлера.

     
     
  • 7.150, svsd_val (ok), 18:37, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Да, всё зависит от конкретных задач и конкретного приложения, тупейший пример р... большой текст свёрнут, показать
     
     
  • 8.162, Анонин (?), 21:49, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    прикольно ты в противовес супер-оптимизированному асму ставишь сразу говнокод ... текст свёрнут, показать
     
     
  • 9.166, svsd_val (ok), 16:40, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Эм, похоже у кого-то с логикой не всё хорошо и делает выводы из своих же фактов ... большой текст свёрнут, показать
     
  • 3.8, An (??), 11:51, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Того, что сказано выше - достаточно.
     
     
  • 4.17, Анонин (?), 12:18, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Осталось всего-лишь как-то заставить всех выполнять выполнять это элементарное действие.
    Всего-лишь...
     
     
  • 5.28, An (??), 12:42, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А еще - программы надо проектировать. Тогда и на си можно будет норм. писать(и даже без зануления указателей).
    Везде так, сначала проектируют, потом реализовывают и только в программировании "самодокументируемый код".
     
     
  • 6.63, Аноним (15), 14:17, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А как вообще можно проэктирвоать архитектуру опенсорса?
    Без шуток, я понимаю как оно делается в проприетарных проектах, но в распределнном проекте на тысячи человек.
    Ну т.е даже если есть архитектор который придумал как оно должно быть и как нужно реализовывать.
    А потом приходит кто-то с уже готовым кодом, который... ну не влазит в архитектуру.
    И есть выбор: попросить переделать или ждать пока кто-то другой реализует, но это может быть долго. (а может и никогда)

    Может кто-то сталкивался как решают такие диллемы?

     
     
  • 7.65, Аноним (1), 14:55, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    тысячи человек, приходит с кодом.. ну ты и фантазёр (тут я не шучу, ты явно никогда в ОС движении не был) - почему-то вспоминаются постановочные скриншоты слака:

    - Кто может взять этот баг?
    - Конечно я!

     
     
  • 8.69, Аноним (15), 15:13, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно не был, поэтому и спрашиваю Просто пример ехФАТ дров - был драйвер самс... текст свёрнут, показать
     
     
  • 9.72, Аноним (1), 15:24, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    эти люди делают это за деньги - они сразу знают как, в эти люди включены и мен... текст свёрнут, показать
     
  • 8.73, Анонин (?), 15:26, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну почему сразу постановочные У меня такое было и не раз Смотришь в борду - а ... текст свёрнут, показать
     
  • 6.127, Аноним (82), 22:05, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > А еще - программы надо проектировать. Тогда и на си можно будет норм. писать(и даже без зануления указателей).

    Не смешите... Сишные кудесники, бедненькие, в одной функции запутались: то память дважды освободят, то за пределы буфера вылезут - а вы им проектирование хотите поручить? Бракоделам, которые без goto и сотни строк не в состоянии написать?

     
  • 2.24, Аноним (24), 12:39, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну и будет локальный указатель внутри функции указывать на NULL, ок. А тысячи других указателей, которые не в курсе, что ты один локальный указатель обнулил, что делать будут? Или ты предлагаешь всё переписать на двойной указатель или вообще не безопасТный язык?
     
     
  • 3.67, Аноним (1), 15:01, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    уязвимость в новости - дабл фри
     
  • 3.96, Аноним (96), 17:09, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > тысячи других указателей

    Если ты присвоил один и тот же указатель тысяче разных мест, а затем без всякой координации освобождаешь в каком-то одном месте, а затем получаешь double-free, то это в первую очередь характеризует тебя. Как человека, которого к сям подпускать нельзя. (ЧСХ, именно такие на сях и пишут.)

     
  • 2.50, Аноним (96), 13:14, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Среди сишников бытует мнение, что "ptr = NULL" — это очень долгая операция, и нужно экономить такты.
     
     
  • 3.78, Аноним (24), 15:58, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ничего тут не медленно, просто бесполезно, потому что это никак не влияет на другие указатели.
     
     
  • 4.92, Аноним (96), 17:05, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    чувак, если у тебя один и тот же кусок памяти используется многими структурами, следует наконец ввести ref/unref или прочие техники управления памятью. Указатели у него, видите ли, "не влияются". Твоя претензия смехотворна, ибо double-free возникает при НЕиспользовании техник типа подсчета ссылок -- то есть как раз там, где такие техники и не нужны, ибо памятью владеет кто-то один. Кто-то один, кто забыл обнулить единственный указатель на память.
     
     
  • 5.100, Аноним (100), 17:41, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Не нужон нам ваш ref/unref.
     
  • 2.71, Tron is Whistling (?), 15:21, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Какому именно указателю? Их может быть несколько в совершенно разных структурах.
     
     
  • 3.74, Аноним (96), 15:39, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А, ну да, тогда никак. Придется дважды освобождать память. А иногда и десятижды.

    ^ ты же к этому выводу всех склоняешь?

     
     
  • 4.125, Tron is Whistling (?), 20:51, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Склоняю к тому, что use-after-free и double free возникают по другим причинам.
    Можно занулить _свой_ указатель - но надо ещё убедиться, что другие структуры уничтожены либо сделаны то же самое.
    То есть просто зануление не спасёт.
     

     ....большая нить свёрнута, показать (47)

  • 1.5, Анонин (?), 11:44, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Haha, classic.
    "Прошло 5 дней с последней сишной дырени"
     
  • 1.6, ryoken (ok), 11:46, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Подскажите, с целью повышения уровня образованности. А какой "use case" у этой технологии? Уже есть сети, быстрее оперативы? Честно, не троллю, хотелось бы получше разобраться.
     
     
  • 2.7, Анонин (?), 11:51, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Уже есть сети, быстрее оперативы

    Нет. Просто в оперативу всё не влазит(( Даже в стойку нужное кол-во nмme не влазит.
    Приходится ставить рядом еще одну, читать оттуда и терпеть просадки по перформансу.
    Вот такая вот печалька. Но что поделать.

     
     
  • 3.103, all_glory_to_the_hypnotoad (ok), 17:44, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Тогда нужен RDMA, а не поделие из топика
     
     
  • 4.167, edo (ok), 22:07, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    RDMA сам по себе не решает проблему доступа к удалённому блочному устройству.
    А оффлоады nvmeo* уже есть в сетевых картах, кстати
     
  • 2.11, wWolf (?), 11:58, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Да.
    https://ru.wikipedia.org/wiki/DDR_SDRAM#%D0%A1%D0%BF%

    https://en.wikipedia.org/wiki/Fibre_Channel#History

     
     
  • 3.13, voiceofreason (?), 12:06, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    SSD уже догнали ддр4?
     
  • 3.14, Анонимусс (?), 12:11, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ты в пример привел какое-то старье. Даже у уже устаревшей DDR4-2400 - bandwidth 19200 MB/s.
    А у DDR5 - 38400 для стандартной 4800 и 57600 для 7200.
    А у фибры - максимум 25600 MB/s, и то - только на самой распоследней.
     
     
  • 4.152, Аноним (152), 21:24, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Оптика уже 600 гигабит умеет. Ну нафиг ненужно распределенную базу данных при распределенных вычислениях гонять через цпу который офигеет.
    Не просто же так начали жпу натаскивать на чтение из накопителя напрямую. Это даже при локальном использовании желательно.
     
     
  • 5.175, space (?), 14:55, 22/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Подскажите лучше, как контролировать все что работает на gpu, а то проц молчит, а gpu дает доступ ко всему что на компе без вашего согласия :)
     
  • 2.16, Аноним (16), 12:16, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Как более современная замена iSCSI.
     
  • 2.21, OpenEcho (?), 12:29, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Подскажите, с целью повышения уровня образованности. А какой "use case" у этой технологии?

    Это тоже самое что и iSCSCI, только позволяющее гигантские очереди и пути, и как результат увеличение пропускной способности и уменьшение задержек и при всем этом не надо какого-то специфического железа

     
  • 2.34, Хохлоним (?), 12:47, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    https://gist.github.com/jigi-33/5cca0dac52da6a39a63d9546fb696320

    На транспортном уровне расположились TCP -- протокол, обеспечивающий передачу данных с гарантией доставки, и UDP -- протокол для быстрой передачи данных, но уже без гарантии.

    https://proglib.io/p/computer-networking

    Протокол управления передачей (англ. TCP - Transmission Control Protocol) обеспечивает надежную доставку данных. Сервис TCP так и называется: reliable byte stream (надежная передача потока байт). Этот протокол отвечает за доставку данных и сохранение порядка передаваемых сообщений.
    ...
    Разбираемся с HTTP
    ...
    Он использует протокол TCP и порт сервера 80 (для клиента порт генерируется операционной системой).

     
     
  • 3.40, Хохлоним (?), 12:58, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    И вот в итоге https hwp ru articles chto_takoe_nvme_of_i_kak_rabotaet_samyy_b... большой текст свёрнут, показать
     
     
  • 4.168, edo (ok), 22:18, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Очереди и в sata есть, гораздо более жиденькие, конечно, но для большинства задач достаточные
     
  • 3.46, Хохлоним (?), 13:06, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    https nvme smb-solution ru nvme-tcp Редакция спецификации NVMe-oF 1 1, включа... большой текст свёрнут, показать
     
  • 3.56, Хохлоним (?), 13:52, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    https www kingston com ru ssd what-is-nvme-ssd-technology По поводу железа Те... большой текст свёрнут, показать
     
  • 2.104, all_glory_to_the_hypnotoad (ok), 17:52, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Если даже и есть быстрее, то работать с ними всё равно будешь на скорости памяти, в лучшем случае на скорости какого-нибдуь кеша L3. Любой слой увеличивает задержки доступа к памяти и хоп вроде сети точно не делает жизнь лучше.
     
     
  • 3.145, Хохлоним (?), 12:50, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, скорости кеша и оперативной памяти явно больше, а вот чипсет влияет на пер... большой текст свёрнут, показать
     
     
  • 4.146, Хохлоним (?), 13:00, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Хотя, впрочем у меня были определённые претензии к разработчикам серверного API. Мне туда доступ не дали, может и на SATA все получилось. Не удалось договориться об изменении API, другим путём пошли.
     
  • 4.157, Аноним (152), 02:59, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Тут может сработал эффект локов ядра. Поищи про китайцев с их протоколом в пространстве пользователя.
    А звук на звуковой карте со своей памятью, да еще и аппаратный мог бы быть нормой.
    Так что если контроллер сетевой на мипсе скажем быстрее делает именно маршрутизацию и передачу данных, то рулить потоками в памяти не очень то и нужно.
     
  • 2.160, Аноним (160), 15:58, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще это хороший вопрос, если он без троллинга, потому что лично я, например, ... большой текст свёрнут, показать
     
     
  • 3.169, edo (ok), 22:23, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > 1. NVMe контроллер не может быть собран в "аппаратный RAID"

    Все современные raid от lsi и adaptec (или как они там сейчас называются) умеют nvme-накопители.
    Или вы про то, что массивы уже не будет nvme-устройством?

     

  • 1.19, Аноним (15), 12:22, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Фикс просто шедеврален
    - goto free_crypto;
    + return ret; /* queue removal will cleanup */

    -free_crypto:
    - if (queue->hdr_digest || queue->data_digest)
    - nvmet_tcp_free_crypto(queue);
    - return ret;

    За использование goto просто так, без реальной причины надо бить по рукам.

     
     
  • 2.20, Аноним (20), 12:26, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ты бредишь. goto не для обезьян-кодеришек. А для системных программистов.
     
     
  • 3.22, Аноним (15), 12:30, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Угу, заметно какой качественный код, навыпрограммировали эти самые "ылитные системные пограммисты"™.

    Каждую неделю можно наблюдать картину 'это не плохой иструмент' это разработчик неправильный.
    Уже 30 лет, а дыры одни и те же.

     
  • 2.23, OpenEcho (?), 12:38, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > За использование goto просто так, без реальной причины надо бить по рукам.

    Причина надо сказать была и довольно веская, выскочить на метку обработки ошибок без оверхэда, в одну команду (в отличии от вызова другой функции, выделением памяти, потом сворачиванием) это самое эффективное и простое решение где в кернеле применяется очень активно

     
     
  • 3.25, Аноним (15), 12:40, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Угу, ценой получения уязвимости, зато как сэкономили!
    А потом это гото удалили и ничего ужасного не произошло!
    Может оно там было ненужно?
     
     
  • 4.31, OpenEcho (?), 12:45, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Угу, ценой получения уязвимости, зато как сэкономили!

    А причем здесь логическая ошибка и goto?

     
     
  • 5.33, Аноним (15), 12:47, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    При том, что лапшекод с goto как раз приводит к логическим ошибкам.
     
  • 3.29, Анонин (?), 12:43, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > самое эффективное и простое решение

    ... отстрелить себе ногу
    И у них таки получилось! Впрочем, не впервой.
    Вот если бы в языке был какой механизм для таких вещей... типа Defer, то такой проблемы бы не было.

     
     
  • 4.37, OpenEcho (?), 12:54, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Чувак, это кернел ! какой нахер defer когда там все должно летать, ты реализацию defer смотрел? правда все в одну команду ЦПУ укладывается?

    > Вот если бы в языке был какой механизм для таких вещей...

    Вон оно что, пусть за меня сделают "защиты и секьюрности" а можно понтоваться потом на тренде.

    Я тебе секрет открою, что умники с "безопасными" языками, как ни странно забывают очень часто ставить то самый defer... со всеми вытекающими

    полной защиты от "дураков" - не существует

     
     
  • 5.43, Анонин (?), 13:03, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чувак, это кернел! Он должен быть надежен как бетонная стена, а не ср*ное сито из овна и костылей.
    Вот в фиксе убрали goto и что? Тормоза начались?
     
     
  • 6.49, OpenEcho (?), 13:11, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Вот в фиксе убрали goto и что?

    ну так сделай s/goto//g по всему кернелу, очисть от нечести, вот ведь оказывется где собака зарыта

    Мне жаль тебя... если ты и правда не догнал суть проблемы и едиственное что увидел goto.

     
     
  • 7.117, Аноним (82), 18:42, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Мне жаль тебя... если ты и правда не догнал суть проблемы и едиственное что увидел goto.

    Лол, сишники рассказывают про "не догнал суть проблемы". Порода кодерв, которая стабильно из десятилетия в десятилетие наступает на одни и те же грабли, плодит те же CVE, тот же лапшекод - и при этом не делает при этом никаких выводов. И даже наоборот: с упорством барана защищает эту всю дичь.

    Даже Торвальдс - и тот что то понял и принял в ядро Раст. А на Опеннете от местных экспертов вопли "ты что, это же кэээрнэээл111".

     
  • 5.80, Аноним (82), 16:02, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > ты реализацию defer смотрел? правда все в одну команду ЦПУ укладывается?

    Ты не поверишь, но да. Даже банальный деструктор в C++ (RAII) инлайниться компилятором прямо в место вызова.

    Ты бы хоть когда-нибудь вылазил из своего сишного танка...

     
     
  • 6.84, Аноним (15), 16:18, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Спарведливости ради речь идет не о продвинутых С++, а о древнем и унылом С.
    Более того можно вспомнить, что на с11 в ядре преешли аж в 2022 году, а до него был копролитический С89.
     
     
  • 7.86, Советский инженер (ok), 16:33, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >Спарведливости ради речь идет не о продвинутых С++, а о древнем и унылом С.

    Спарведливости ради ядро разрабатывают на gcc с кучей gnu extensions. уж и дефер какой никакой могли бы прилепить.

     
     
  • 8.88, Аноним (15), 16:42, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ты хотел сказать написать свой велосипед как в истории со split для строк О ... текст свёрнут, показать
     
     
  • 9.121, Советский инженер (ok), 19:51, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    да, в виде макросов это отстой надо именно на уровне компилятора ... текст свёрнут, показать
     
  • 3.79, Аноним (82), 15:59, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >  довольно веская, выскочить на метку обработки ошибок без оверхэда,

    Да, да, "без оверхеда"... А потом тыкаешь этих горе-оптимизаторов носом в выхлоп ассемблера и профайлера, дабы они наконец-то воочию увидели, что компилятор в состоянии заинлайнить и оптимизировать вызов функции, и что и единственное, чего они добились своим goto - это покрыть все лапшой.

     
  • 3.172, Аноним (171), 15:00, 20/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > без оверхэда, в одну команду

    Опять эти сказки от сишников, про псевдо-оптимизации исключительно в их фантазиях, когда кошмарные хаки якобы "сэкономили одну команду". При том что реальный код, который крутится на процессоре не похож на их сишный код даже близко, и что они там "сэкономили" процессору неведомо. Потому что уже не 1970-й год.

     
  • 2.27, Аноним (24), 12:41, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > За использование goto просто так, без реальной причины надо бить по рукам.

    Ты походу не то что ни одного модуля для ядра не написал, ты походу вообще с эмбедовкой никогда не работал.

     
     
  • 3.36, Аноним (15), 12:54, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Что тебе не ясно во фразе "просто так, без реальной причины"?
    Из кода гото удалили, и... мир не рухнул, код не перестал работать, а наоборот стал лучше.
    Значит ли это, что в данном случае гото не было жизненно необходимо? Думаю да
     
     
  • 4.41, OpenEcho (?), 13:01, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Значит ли это, что в данном случае гото не было жизненно необходимо? Думаю да

    Ты или просто троль или правда не втыкаешь, скорее всего как "умный" профессор научил реагировать на goto как красную тряпку, даже не разобравшись. Возьми дизассемблер и посмотри как много jmp в реальности

     
     
  • 5.48, Аноним (15), 13:09, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Все возможно.
    Наверное те гореписаки, т.е, простите, уважаемые пограммисты системщики этих самых унтеверситетов не заканчивали, и им профессора не рассказывали о том что "после выделения памяти, ее нужно очищать, желательно всего один раз".
    Вот так и живем.
     
     
  • 6.52, Аноним (15), 13:18, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Чувак, посмотр на мисру (тот самый С котрый ипользуется для надежности)
    а именно на правило
    15.1 которое объясняется "Unconstrained use of goto can lead to programs that are unstructured and extremely difficult to understand"

     
     
  • 7.68, Аноним (68), 15:11, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Замени goto на что-то другое, умник goto label - это просто прыжок в конкретн... большой текст свёрнут, показать
     
     
  • 8.81, Аноним (82), 16:05, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А функции использовать сишечная религия запрещает Ах, ну да - это же очень медл... текст свёрнут, показать
     
     
  • 9.118, Серб (ok), 18:46, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Почитай хотя бы Прешерн Язык С Мастерство программирования Принципы, практики... текст свёрнут, показать
     
     
  • 10.130, Аноним (15), 22:45, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да, и он приводит вполне адекватные решения, например Поместите инициализацию и... текст свёрнут, показать
     
     
  • 11.155, Аноним (155), 21:55, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Очевидно, что ты высокого мнения о себе В том варианте, что ты привел есть суще... текст свёрнут, показать
     
  • 7.139, Хейтер С (?), 09:34, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Rule 15.2 The goto statement shall jump to a label declared later in the same
    function

    И? MISRA разрешает goto вперед.

     
     
  • 8.140, Аноним (15), 09:48, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это для тех кто не осилил пункт 15 1 Там есть еще 15 3 и 15 4, но и в них есть ... текст свёрнут, показать
     
     
  • 9.141, Хейтер С (?), 09:59, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    CVE не из-за goto В данном конкретном случае неиспользование goto ничего бы не ... текст свёрнут, показать
     
     
  • 10.144, Аноним (15), 10:58, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    CVE из-за наплевательского отношения к работе с памятью и спагетти-кода В хаосе ... текст свёрнут, показать
     
     
  • 11.149, Хейтер С (?), 16:27, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Суть в том, что код на С без goto для обработки ошибок хуже, RAII-то нет и прихо... текст свёрнут, показать
     
  • 6.53, Аноним (15), 13:22, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Rule.15.1 "The goto statement should not be used"
     
  • 5.91, Аноним (91), 17:01, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    goto, jmp - ну ты, блд, сопоставил. Это разный уровень абстракций. Компилятор с языков высокого уровня однозначно нагенерит кучу jmp даже там, где goto и а помине нет. Ну не может машинный код в фигурные скобочки или begin/end.
     
  • 5.173, Аноним (171), 15:07, 20/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Возьми дизассемблер и посмотри как много jmp в реальности

    Это не для глючных гомо сапиенсов jmp, а для машин. Мозг гомо сапиенса по определению постоянно ошибается, ему нужны строгие модели и много-много постоянных проверок, чтобы хотя бы снизить количество ляпов на строку. goto для человека - как граната для обезьяны, рано или поздно обязательно подорвётся.

     
  • 4.131, Аноним (131), 23:15, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А ты не заметил, что после goto там еще куски кода были?
     
  • 2.32, Аноним (68), 12:46, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    goto тут при чём? Это вполне себе адекватный defer, чтобы не прописывать как придурок if else с кучей копипаста. Задолбали эти свидетели обучения сишке тех, кто сишку знает лучше.

    Баг в том, что внутри функции освобождается память, функция возвращается и хендлер очереди освобождает память второй раз, что может привести к RCE.

    Чёртовы любители прочитать две строчки без остального контекста и выдать мнение о том, как кто что должен писать.

     
     
  • 3.35, Анонин (?), 12:48, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Спасибо, мы вот прям сейчас видим как прекрасно они знают сишку)))
     
     
  • 4.75, Аноним (20), 15:40, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да получше тебя, мы это вот прям сейчас видим. Ты рельно уверовал, что узвимость в наличи goto? Рукалицо...
     
  • 3.90, Аноним (-), 16:54, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Не тебе судить салага. Вердикт о goto вынес Э. Дейкстра, ещё в те времена, когда ты ещё не родился на свет со своим "оверхедом". Дейкстра в своё время нажрался кода FORTRAN, в котором изобиловали GOTO. Это было бичём тех времён.
     
  • 3.98, Аноним (82), 17:20, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > чтобы не прописывать как придурок if else с кучей копипаста

    У вас какая-то особая сишка, где нет функций?

     
     
  • 4.99, Анонин (?), 17:40, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Ты что! Функция же жрет стек и процессорное время!
    А компилятора, который умеет инлайнить еще не изобрели!
     
  • 4.101, Аноним (15), 17:42, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Сейчас, тебе навалят кучу объяснений:
    "Код должен быть быстрым, про инлайн мы ничего не знаем,
    про nested func в гнутых раширениях С, тоже ничего не знаем,
    пусть в ядре будут дырочки удалённо эксплуатируемые, зато как быстро!
    Мы тебе уже говорили, что код должен быть быстрым?"
     
     
  • 5.126, Аноним (20), 21:41, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ну да, код должен быть быстрым. Слоупоки не тянут только как и суть спора. Понимаешь же? Или я зря стараюсь?
     
     
  • 6.128, Аноним (15), 22:38, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Если твоими стараниями по коду CVEшки расползаются, то лучше не надо)
     
  • 6.129, Аноним (15), 22:42, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Стараешься? И это ты называешь "старанием"?
    А ну начинай стараться в два раза сильнее!
     
  • 6.142, Аноним (142), 10:12, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > код должен быть быстрым

    В общем случае — нет, это не главное требование к коду. Обычно ему достаточно не быть тормозным, но квалифицированный прогер такого и не допустит.

     
  • 2.138, Хейтер С (?), 08:40, 17/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, goto для ошибок в С хорошо, проще за ресурсами следить, меньше вложенность, меньше кода под ифами. Тут ничего бы не помогло, не дефер, ни если бы



    ret = kernel_sendmsg(queue->sock, &msg, &iov, 1, iov.iov_len);
    if (ret < 0) {
        if (queue->hdr_digest || queue->data_digest)
            nvmet_tcp_free_crypto(queue);
        return ret;
    }



    так без goto бы было. По сути, тут не было владения ресурсом, поэтому и освобождать его не надо было.
     
     
  • 3.165, PnD (??), 16:11, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    В сях через goto реализуется аналог "try…finally" (или "defer") из ЯВУ.
    Тут большинство народа постоянно путает C с ЯВУ и требует чего-то странного ("переписать на …").

    * Я вот, когда для задачи таки нужен C, прямо так и пишу (там где нужен финализатор с зачисткой):
    goto finally;

    finally:

     

     ....большая нить свёрнута, показать (50)

  • 1.61, Sw00p aka Jerom (?), 14:11, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    NVMe TCP какой ща век ?
     
     
  • 2.70, Аноним (70), 15:20, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А что не так: TCP не актуален или даже NVMe?
     
     
  • 3.123, Sw00p aka Jerom (?), 20:12, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >А что не так

    эт файлзилла на уровне ядра?

     

  • 1.64, Аноним (64), 14:25, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Интересно, когда pull request'ы в ядро проходят review, есть ли принудительное использование статических анализаторов?
     
     
  • 2.76, Аноним (96), 15:41, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Сишка не поддается статическому анализу. Корректность кода нельзя математически доказать.
     
     
  • 3.87, Аноним (15), 16:39, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не совсем правда Вот есть seL4, не просто статистически проверено, но даже форм... большой текст свёрнут, показать
     
     
  • 4.102, Аноним (102), 17:43, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Формальная верификация - это из области бреда учёных-грантоедов. Отличная теория, которая далека от реалий нашей вселенной.
     
     
  • 5.119, Аноним (82), 19:26, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Формальная верификация - это из области бреда учёных-грантоедов. Отличная теория, которая далека от реалий нашей вселенной.

    - Поздраляем, вы приняты в команду разработчиков ядра!

     
     
  • 6.120, Аноним (91), 19:50, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ядра Minix.
     
     
  • 7.161, Аноним (-), 18:21, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Да так. Эндрю Танненбаум брал грант на усовершенствование Миникса3.
     
  • 2.170, edo (ok), 22:42, 19/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Интересно, когда pull request'ы в ядро проходят review,

    Да. Все патчи публикуются в списках рассылки, где могут высказать свои замечания все желающие. В первую очередь, конечно, высказываются мейнтейнеры этого участка ядра.
    Потом, если мейнтейнера патч устраивает, он его принимает.
    Потом мейнтейнеры крупных блоков сбрасывают уже консолидированные патчи Линусу, и он принимает их в основную ветку.

    Теоретически на каждом шаге после начального принятия кода может происходить отказ/требование доработки, но это уже аварийный механизм, на тот случай, если первый мейнтейнер что-то просмотрел

    > есть ли принудительное использование статических анализаторов?

    В описанном выше пути принятия кода статические анализаторы не участвуют. Как и регрессионные тесты. Но есть сторонние команды, которые этим занимаются. За счёт того, что перед каждым релизом ядра код на некоторое время замораживается (принимаются только исправления), у таких проблем есть большие шансы быть замечененными и не попасть в релиз

     

  • 1.77, Аноним (77), 15:46, 16/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >В Linux-подсистеме nvmet-tcp (NVMe-oF/TCP), позволяющей обращаться к NVMe-накопителям по сети (NVM Express over Fabrics), используя протокол TCP

    А просто к оперативной памяти так обращаться можно? Как такое настроить? Хочу поиграться с протоколом и написать свою реализацию клиента.

     
     
  • 2.93, Менеджер Антона Алексеевича (?), 17:06, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Можно, но не «просто». Гугли RoCE v2.
     
  • 2.94, Аноним (91), 17:06, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    "Для использования NVMe over RoCE в фабрике, технологию Converged Ethernet должны поддерживать сетевая карта, коммутатор и флэш-массив. Кроме того, сетевая карта и флэш-массив должны поддерживать RoCE (такие сетевые карты сокращенно называются R-NIC)."
    Наверное, если только написать эмуляцию всего этого.
     
  • 2.95, Аноним (95), 17:07, 16/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >  Хочу поиграться с протоколом и написать свою реализацию клиента.

    что мешает эмулировать nvme на имимдже в памяти

    https://qemu-project.gitlab.io/qemu/system/devices/nvme.html

     

  • 1.136, X86 (ok), 07:50, 17/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > обращаться к NVMe-накопителям по сети

    Это какая-то небезопасная штука, которая не должна быть в ядре у всех. Кому надо пускай отдельно устанавливают.

     
     
  • 2.159, Аноним (159), 09:00, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А оно по умолчанию не у всех, нужны дополнительные телодвижения, чтобы экспортировать nvme по сети. Кстати, накопитель может быть любой, хоть usb, nvme это просто протокол, просто у некоторых накопителей он реализован "в железе".
     

  • 1.151, Вы забыли заполнить поле Name (?), 19:43, 17/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ну уязвимость и уязвимость. Что бухтеть-то? Пофиксили - это главное. Пофикшеная уязвимость лучше чем не существующий код на безопасном языке. Древние люди с дубинами не могли быть сбитыми автомобилем, а значит жили более безопасно.
     
     
  • 2.163, Анонин (?), 21:52, 18/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Угу, жили безопасно до глубокой старости, ну... лет до 25-30 в лучше случае))
    Зато их мог сожрать саблезубый тигр, или медведь, или просто помереть с голоду... Зато все натуральное было!
     
     
  • 3.174, Вы забыли заполнить поле Name (?), 15:25, 21/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > Угу, жили безопасно до глубокой старости, ну... лет до 25-30 в лучше
    > случае))
    > Зато их мог сожрать саблезубый тигр, или медведь, или просто помереть с
    > голоду... Зато все натуральное было!

    Именно. Эволюционно человек расчитан максимум лет на 40 бесперебойной работы. Теперь же умирают не от медведей или тигров (хотя и такое бывает), а от сердечно-сосудистых заболеваний (на первом месте), онкологий и прочего. Об Альцгеймере древние люди и не думали.

     

  • 1.176, Анонин (?), 07:22, 25/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Очередное доказательство того, что микроядра лучше
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру