⚡️Буква-убийца
Продолжаем:
🖐🏼Стоп. Присваиваем int строке и всё ок?
Да, компилятор использует сигнатуру string& operator= (char c); молча приводя int к char, т.е. делает нам строку из одного символа.
Ну хорошо, а как же тогда эта строка указывает на корневую директорию?
Наверняка присвоение строке номера файлового дескриптора запишет в неё какой-то мусорный байт и всё.
Совершенно верно.
Первый открытый в программе файл обычно получает дескриптор 3 (дескрипторы 1 и 2 - это stdout и stderr соответственно).
Мы пишем (int)3 в строку, получаем там мусор и как-то с ним работаем, наверное, с ошибками, но не критично.
Но наш тест работает долго и многократно создаёт/удаляет временные директории. Каждый раз mkstemp открывает НОВЫЙ файл и возвращает НОВЫЙ дескриптор, т.к. старые файлы мы не закрываем (мы же не знали про них).
На определённой итерации mkstemp возвращает дескриптор 47, что соответствует символу '/'. Так мы получаем путь к корневой директории, используем её как временную папку, и потом рекурсивно удаляем.
Всё.
Система мертва.
Активные консоли работают, запущенные программы тоже худо-бедно работают, но никакие команды не срабатывают и подключиться к серверу больше тоже нельзя.
Зовите ремонтную бригаду... И плакальщиц🥲👩🏼
📌
Итак, какие же ошибки привели к данной трагедии?
1. замена вызова одной функции на другую без проверки сигнатуры (надежда на компилятор)
2. автоматическое приведение типа (int к char) при присвоении значения строке (компилятор хотел как лучше)
3. отсутствие проверок корректности имени временного каталога ("да чё там проверять, функция элементарная!")
4. работа от имени root ("не, ну так правда удобнее, у нас все так делают...")
📌
Чему нас это учит?
▪️Быть внимательнее и отнестись к данной ситуации как к уроку.
▪️Сделать всё, чтобы данная ситуация не повторилась.
▪️Никогда не повторилась.
▪️Вообще никогда.
Ну, вы уже поняли, да? 😏
#мфисофттолькополюбви
#MFISOFTTeam
#mfisoft