Читайте нас в Telegram или Макс

Telegram Desktop из-за бага удалил 800 ГБ файлов на Windows

Пользователь Telegram Desktop рассказал на «Хабре» о необычной ошибке в мессенджере, из-за которой лишился около 800 ГБ данных на компьютере с Windows.

Причиной оказался баг, связанный с проверкой орфографии: при определённых условиях Telegram мог начать рекурсивно удалять содержимое папки custom в корне диска.

Что случилось?

Как рассказал автор истории, после очередного запуска компьютера некоторые установленные программы перестали открываться — их исполняемые файлы исчезли.

  • Позже выяснилось, что в папке C:\custom, где у него хранились программы, проекты и другие данные, почти ничего не осталось. Всего там находилось около 800 ГБ файлов. Он начал запускать приложения по одному и выяснил, что файлы исчезают после запуска Telegram Desktop.
  • Чтобы исключить проблему с местом установки, он переустановил мессенджер из C:\custom в другую папку, однако созданный для проверки файл внутри C:\custom после запуска Telegram снова удалился.
  • После этого пользователь изучил происходящее с помощью Process Monitor. Согласно его наблюдениям, Telegram обращался к C:\custom, просматривал вложенные папки и пытался удалять находящиеся там файлы.

Позднее он отправил репорт о баге в репозитории Telegram Desktop на GitHub. В нём автор указал, что проблема проявлялась в версии 7.1.1, тогда как в Telegram Desktop 6.9.4 её не было.

Почему так произошло?

Причина оказалась связана с механизмом проверки орфографии. Telegram хранит добавленные пользователем слова в файле custom.

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

Затем библиотека формировала путь к пользовательскому словарю, добавляя к пустому значению /custom. Qt интерпретировал его как папку custom в корне текущего диска — в случае автора это была C:\custom. Код ожидал обнаружить там файл, однако если по этому пути находилась папка, запускалось её рекурсивное удаление.

При этом удалялись только те файлы, к которым приложение получало необходимый доступ. Например, занятые другими процессами файлы могли остаться на месте, поскольку используемая функция QDir::removeRecursively() продолжает работу, даже если удалить некоторые элементы не удалось.

Исправлен ли баг?

Баг попал в версии Telegram Desktop 7.1.0 и 7.1.1. Для исправления разработчики перенесли установку пути к словарю до досрочного завершения функции, а в библиотеку проверки орфографии добавили дополнительную защиту от пустого пути.

Исправления вошли в Telegram Desktop 7.1.2, выпущенный 25 августа. В официальном списке изменений это описано как исправление сохранения слов при использовании системной проверки орфографии. По словам автора разбора, ошибку подтвердили на Windows со встроенной системной проверкой орфографии.

«Популярность продукта и количество его пользователей от простых ошибок не защищают. Иногда между "починили пользовательский словарь" и "удалили 800 ГБ данных" находится всего несколько строк кода», — заключил автор истории.

На Linux и macOS такую же цепочку действий не обнаружили. Более подробное описание автора истории опубликовано на «Хабре».