Fix filename buffer overflow in create_filename

FILE_NAME is a fixed 48-byte buffer, but the loop copying the
filename parsed from the download URL had no length check, so a
filename longer than 48 characters would overflow into adjacent
variables (FILE_INI, DIR_zifi, DIR_download, DIR_date). Bound the
copy loop to 48 bytes.

Verified on hardware via a temporary diagnostic test (since removed):
folder/file creation with long names and write+read-back through the
FAT32 driver both work correctly, and downloads/<date> is confirmed
write-only (playback/viewing always reads from memory, never disk).

Documented the fix in README.md.
This commit is contained in:
2026-09-01 16:34:52 +03:00
parent 54e0031a22
commit 08dc6ab6a4
3 changed files with 6 additions and 4 deletions
+2 -1
View File
@@ -48,7 +48,8 @@ AT+CIPSNTPTIME? — получить текущее врем
**Мелкие исправления:** **Мелкие исправления:**
- перевёл обращение к порту `#EFF7` (общий системный регистр — управляет не только доступом к часам, но и видеорежимом/turbo/кэшем) на read-modify-write вместо прямой перезаписи всего байта, чтобы не сбивать остальные настройки; - перевёл обращение к порту `#EFF7` (общий системный регистр — управляет не только доступом к часам, но и видеорежимом/turbo/кэшем) на read-modify-write вместо прямой перезаписи всего байта, чтобы не сбивать остальные настройки;
- исправил баг в разборе двузначного GMT-смещения из `zifi.ini` (например `+10`) — были перепутаны местами разряды; - исправил баг в разборе двузначного GMT-смещения из `zifi.ini` (например `+10`) — были перепутаны местами разряды;
- теперь DMA-очистка под индикатор громкости дожидается завершения перед тем, как CPU начинает рисовать поверх той же области (была гонка записи). - теперь DMA-очистка под индикатор громкости дожидается завершения перед тем, как CPU начинает рисовать поверх той же области (была гонка записи);
- исправил переполнение буфера имени файла (`create_filename`): при скачивании имя файла из ссылки копировалось в 48-байтный буфер без проверки длины, и если оно было длиннее — переполнение затирало соседние переменные (`zifi.ini`, имена служебных папок) прямо в памяти. Теперь копирование корректно обрезается на 48 символах. Проверено на железе: создание папки и файла с длинными именами (в т.ч. ровно 48 символов) и последующее чтение содержимого — всё работает штатно, никакой драйверной обрезки до 8 символов нет.
**Известная нерешённая мелочь:** курсор мыши (аппаратный спрайт TSU) обрывается по фиксированной строке экрана прямо над нижней панелью управления — похоже на границу, завязанную на тайминг переключения видеорежима или на аппаратный бордюр, а не на что-то, что двигается вместе с содержимым панели. Я не нашёл способ поправить это без риска сломать что-то ещё, оставил как есть. **Известная нерешённая мелочь:** курсор мыши (аппаратный спрайт TSU) обрывается по фиксированной строке экрана прямо над нижней панелью управления — похоже на границу, завязанную на тайминг переключения видеорежима или на аппаратный бордюр, а не на что-то, что двигается вместе с содержимым панели. Я не нашёл способ поправить это без риска сломать что-то ещё, оставил как есть.
Binary file not shown.
+2 -1
View File
@@ -159,13 +159,14 @@ create_filename ; and check extension for scl scr sxg others
1 1
inc hl inc hl
ld de,FILE_NAME ; file_name create ld de,FILE_NAME ; file_name create
ld b,48 ; FILE_NAME is exactly 48 bytes - never write past it
2 ld a,(hl) 2 ld a,(hl)
cp ' ' cp ' '
jr z,1f jr z,1f
ld (de),a ld (de),a
inc hl inc hl
inc de inc de
jr 2b djnz 2b ; ran out of room - stop here and null-terminate below
1 1
xor a xor a