Skip to content

check-selftest сверяет восстановленный файл с копией, из которой его восстановил #1266

Description

@gHashTag

Найдено при аудите «каким событием в мире эту проверку можно уронить».

check-selftest мутирует два файла — rings/SR-00/QueenObserver.swift и сам Makefile — и восстанавливает их из копий. Ловушка на выходе (Makefile, строка ~29 внутри рецепта) делает так:

cp "$$backup" "$$victim"
vs=$$(shasum "$$victim" | cut -d" " -f1)
if [ "$$vs" != "$$victim_sha" ]; then echo "[FAIL] restore checksum mismatch"; fi

где victim_sha снята с того же файла перед копированием. Сравнение копии с оригиналом копии не может упасть — оно проверяет, что cp сработал, а не что файл никто не трогал.

Это ровно та дыра, что была в make mutants и закрыта коммитом b4d1946fe: там теперь пишется сумма мутированного состояния и сверяется перед восстановлением, а при расхождении цель отказывается затирать чужую запись и называет путь к копии.

Насколько это опасно

Меньше, чем в гарнитуре: та держала файл мутированным всё время прогона набора, около семидесяти секунд, и одна такая перезапись уже разошлась надвое (комментарий описывал код, которого в файле нет). check-selftest держит файл мутированным доли секунды между cp и cp. Но цель входит в check, а Makefile и QueenObserver.swift — файлы, которые агенты правят постоянно.

Что нужно

Тот же приём, что в b4d1946fe: записывать сумму после каждой мутации и сверять перед восстановлением; при расхождении — отказ с именем файла и путём к копии, мутацию не откатывать молча.

Мутационных мест в рецепте несколько, поэтому это не однострочная правка — отсюда отдельная задача, а не правка по ходу.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions