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:
@@ -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.
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user