ftpd: Add MKD command #342
Reference in New Issue
Block a user
Delete Branch "igorsh/kolibrios:ftpd-add-mkd-command"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Added MKD command
@@ -334,2 +334,4 @@retalign 4console_fs_error:Don't forget the server in floppy disk image. I think here you can write more optimally, for example, get a line with an error by index.
@@ -1251,0 +1322,4 @@mov byte [edi], 0x00call create_pathdec ediBad ident
@@ -336,0 +337,4 @@fs_err_table:dd str_fs_error2 ; 2dd str_fs_error3 ; 3dd str_fs_error5 ; 5I suggest using 4 as str_fs_error
@@ -336,0 +346,4 @@dd str_fs_error11 ; 11dd str_fs_error12 ; 12console_fs_error:I think you can shorten it something like this
@@ -1251,0 +1323,4 @@; called fs functionpush ebxdec espmov byte[esp], 0May be
xor eax, eaxandpush eax? I also don’t understand why there ismovandpushhere.pushis smaller in sizeЭта часть скопирована с cmdDELE. Если не добавить 1 байт в стек - получаю Page Fault.
@@ -1251,0 +1331,4 @@push dword SSF_CREATE_FOLDERmov ebx, espmcall SF_FILEadd esp, 6*4 + 1I guess the problem (https://git.kolibrios.org/KolibriOS/kolibrios/pulls/342/files#issuecomment-4485) is here
No, at that line -
mcall SF_FILEYou are right. I read SF 70 and understood why there is one byte.
But I would still recommend storing 0 in the register and then doing a
pushandmov.Немного не пойму что ты предлагаешь:
push ebxxor eax, eaxpush eaxadd esp, 3вместо
push ebxdec espmov byte[esp], 0?
I suggest leaving it as is. I'm already confused myself.
e72e908c1ato27c3bcbbd0MKD не проверяет, что путь вообще передан, и при пустом аргументе может попытаться создать текущий каталог вместо того, чтобы вернуть ошибку, в programs/network/ftpd/commands.inc (line 1348). В отличие от cmdDELE (line 496), cmdRETR (line 981) и cmdSTOR (line 1079), здесь нет проверки видаsub ecx, 5 / jb .... Для MKD\r\n код соберёт пустое имя, вызовет create_path, и дальше операция пойдёт по пути текущей директории, что выглядит как неверное поведение.MKD обрабатывает абсолютные пути не так, как остальные файловые команды, в programs/network/ftpd/commands.inc (line 1369). В DELE/RETR/STOR есть специальное пропускание ведущего / перед дописыванием к fpath (см. commands.inc (line 512), commands.inc (line 998), commands.inc (line 1099)). У MKD этого нет, поэтому MKD /foo будет собираться иначе, чем аналогичные операции над файлами. Это как минимум несогласованность поведения, а возможно и неправильная логика.ftpd: Add mkd commandto ftpd: Add MKD commandHi, @igorsh.
PR is okay overall, but I propose this changes before it got merged.
Please, check them.
ftpd.asm
commands.inc
@@ -1313,0 +1355,4 @@mov ecx, 1024cmp byte[esi], 0x20jb .errorAn undefined value in the eax register
1: Сломана проверка пустого аргумента
ecxвключает завершающий CR/LF, поэтому проверка по длине не отличает пустоеMKD\r\n(ecx=5,5-5=0, неjb) от 1-символьного имени - пустой аргумент проходит, иSF_CREATE_FOLDERвызывается на текущем каталоге. Проверка первого байта аргумента надёжна независимо от CR/LF и разделителя.Исправление:
2: Ответ 257 отдаёт абсолютный путь сервера
fpath=home_dir + work_dir + имя(реальный путь на сервере): отдавать его в 257 - это утечка структуры ФС и поломка round-trip (клиент подставит путь вCWD=> демон снова допишетhome_dir). Эхо-им запрошенный клиентом путь (buffer+4); ответ собираем вfpath(после syscall не нужен), чтобы не было самоперекрытия буфера.Исправление:
@@ -1313,0 +1350,4 @@test [ebp + thread_data.permissions], PERMISSION_WRITEjz permission_deniedmov eax, 4 ; Unknown filesystem errorкостыль
UPD: при обнаружении ошибочного запроса, который не может быть корректно обработан сервером, клиенту должно отправляться сообщение об ошибке(что реализовано), но при этом, так как не возникла ошибка файловой системы в консоль не должно выводится ошибочное сообщение о проблемах с фс
Should be fixed, check, please.