Исправлено переполнение буфера при соединении срезов
27.04.2026В функции соединения срезов исправлено переполнение буфера. Ошибка проявлялась, когда один из срезов приходил из реализации, нарушающей правила заимствования.
Где именно ошибка
Функция запрашивает у первого среза, сколько байт тот считает нужным, выделяет буфер этого размера и копирует в него содержимое обоих срезов. Размер запрашивается один раз, а копирование идёт через повторный запрос.
Если между двумя запросами один и тот же объект сообщает разные числа — приходит разрез, а не срез, — второй запрос возвращает больше, чем выделено. Дальше запись выходит за границу.
Почему это ошибка в стандартной библиотеке, а не в коде
Требование обязательное: любая реализация заимствования должна возвращать срез, а не произвольный диапазон байт. Нарушив его, код получает объект с некорректным поведением — и по контракту он не должен пострадать.
Стандартная библиотека на это не рассчитывала: считалось, что расхождение невозможно. Ошибка в чужом коде привела к повреждению памяти там, где виноватым оказывался бы тот, кто нарушил правило.
Что это значит для практики
Ошибка затрагивала код, где функция вызывается на данных из преобразования типов, написанного небезопасно. Это редкое сочетание — но именно в нём стандартная библиотека обязана защищать вызывающего, потому что проверки на корректность там нет.
Оригинал
fix heap overflow in slice::join caused by misbehaving Borrow
Упоминаний: 1 · Просмотров: 6