Page 2 of 16

Re: Путь приложения

Posted: Sat Nov 19, 2016 5:25 am
by Serge
Pathoswithin
app_path много лет был 1024 байта. Это должно быть в глубинах форума. И буфер во всех приложениях для него 1024 байта. А теперь ядро туда может записать 4Кб, не проверяя, влезет или нет. Что в этом хорошего ? Если меняешь ABI, обеспечивай совместимость.

Re: Путь приложения

Posted: Sat Nov 19, 2016 12:10 pm
by Pathoswithin
А что в этом несовместимого? Что раньше ядро делало, если путь не влазил в argv[0]?

Объявлено в глубинах форума... надо запомнить эту фразу.

Re: Путь приложения

Posted: Sat Nov 19, 2016 1:45 pm
by 0CodErr
Pathoswithin wrote:А что в этом несовместимого?
Serge wrote:теперь ядро туда может записать 4Кб, не проверяя, влезет или нет.
Pathoswithin wrote:Что раньше ядро делало, если путь не влазил в argv[0]?
Оно не писало больше 1024 байта, и поэтому он туда влазил. Приложениям достаточно было просто выделять буфер на 1024 байта.
Pathoswithin wrote:В коде было где как: и 1024, и 4096, и даже 260. Теперь везде одна константа. Где приложения работали, там по прежнему работают.
Ну теоретически завтра можно вообще сделать эту константу на 10Kb. И сказать, что она теперь такая вот стала, вот и исправляйте свои приложения. :lol:

Вообще-то, если что-то ломаешь, то нужно тогда везде правки вносить. И не создавать проблемы другим участникам.
А или лучше сделай себе бранч и играйся в игрушки там.

Re: Путь приложения

Posted: Sat Nov 19, 2016 2:05 pm
by Pathoswithin
Понятно, что не писало больше, я не об этом. Наводящий вопрос: как потом приложение работало с обрубком пути?

Re: Путь приложения

Posted: Sat Nov 19, 2016 2:40 pm
by Serge
Pathoswithin
Да, работало с обрубком пути. Shit happens. Раньше ядро писало 1023 байта пути и завершающий ноль. А теперь затрёт память с непредсказуемыми последствиями.
Кстати

Code: Select all

        mov     ecx, [ebp+APP_HDR.filename_size]
        rep movsb
        mov     byte [edi], 0
filename_size может быть равно 4096 ?
Я не знаю нужен ли такой длинный путь. Когда diamond установил ограничение 1023 байта у него наверное были разумные причины.
Pathoswithin wrote:Объявлено в глубинах форума... надо запомнить эту фразу.
Если знать где искать, можно найти много интересного. viewtopic.php?f=35&t=475&p=6218#p6218
diamond wrote:1. Путь (если он требуется) передаётся "как есть", т.е. как его передало 70-й функции запускающее приложение. При этом длина пути с учётом завершающего нуля не может превосходить 1024 символов (иначе вызов 70-й функции провалится).

Re: Путь приложения

Posted: Sat Nov 19, 2016 4:35 pm
by Pathoswithin
*запускалось с обрубком пути. А как оно работало?

Re: Путь приложения

Posted: Sat Nov 19, 2016 5:04 pm
by Serge
Это от приложения зависит. Главное, что не падало в ядре с утечкой памяти. Я напомню, что все программы на Си/Си++ обязательно получают путь к приложению. Независимо от того, нужен он им, или нет. Т.е. все эти программы в данный момент уязвимы.

Re: Путь приложения

Posted: Sat Nov 19, 2016 5:22 pm
by GerdtR
Винда при пути больше 260 байт просто выкидывает ошибку на попытку открыть файл. То есть у программы не будет слишком длинного пути - она просто не запуститься. Вот и всё. Никто ничего не затрёт, если будет определённая константа и ядро с приложениями будут её учитывать.

Re: Путь приложения

Posted: Sat Nov 19, 2016 5:30 pm
by Serge
GerdtR
Константа была, 1023 байта + завершающий ноль. А теперь её увеличили до 4Кб, даже не сообщив об этом.

Re: Путь приложения

Posted: Sat Nov 19, 2016 7:38 pm
by Pathoswithin
И как обычно проблемы с сями... Тогда так: если на ограничение в 1023 байта были разумные причины, то путь никогда не будет длиннее и проблем не возникнет, а иначе значит, что 1023 байта мало, и я правильно сделал. Собственно, программам ничего не запрещает выделить буфер ещё меньше, и в большинстве случаев его тоже хватит. В идеале, надо было изначально делать так, чтоб ядро выделяло буфер, а не приложение (как со слишком длинной строкой параметров).

Re: Путь приложения

Posted: Sat Nov 19, 2016 8:15 pm
by Serge
Pathoswithin
В идеале да. Но для командной строки почти десять лет потребовалось. Умная мысля иногда приходит с большой задержкой.
Я думаю 1023 байта для пути достаточно. Я хотел вообще убрать отдельный буфер для текущего каталога и хранить путь в структуре процесса. Тем более, что он общий для потоков в многопоточном приложении.

Re: Путь приложения

Posted: Sat Nov 19, 2016 8:54 pm
by 0CodErr
Serge wrote:Я думаю 1023 байта для пути достаточно.
Serge wrote:Константа была, 1023 байта + завершающий ноль. А теперь её увеличили до 4Кб
Я тоже думаю, достаточно. Надо просто сделать maxPathLength = 1024, тем самым вернув всё на свои места.
Serge wrote:Я хотел вообще убрать отдельный буфер для текущего каталога и хранить путь в структуре процесса.
По-моему, хорошая идея.

Re: Путь приложения

Posted: Sat Nov 19, 2016 9:16 pm
by Ray
Верните кто-нибудь обратно. Pathoswithin никогда не будет признавать своих косяков, он всегда прав. Пора было уже понять это.

Re: Путь приложения

Posted: Sat Nov 19, 2016 10:58 pm
by Pathoswithin
Куда вернуть? Я там половину переделал. И я действительно не признаю косяков, если их нет, тут обсуждается чисто теоретическая проблема.

Конечно, можно и ограничить длину argv[0] до 1024, это запросто, но длину пути для доступа к файлам лучше оставить 4096.

Re: Путь приложения

Posted: Sun Nov 20, 2016 1:16 am
by Siemargl
Я же привел примеры, где используется.

Если ограничивать путь 256 символами, то при наихудшем раскладе х4, 1к достаточно.