[cdev] Утилита ps
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Вс Мар 21 20:14:37 MSK 2010
Лучше обращаться к рассылке в целом. Она не моя личная, а ваша)) Вас
больше тут чем меня.
Дело в том что коварный пользователь может процесс любой запустить с
любыми значениями которые окажутся в argv[]. Это как раз то что вы
видите в cmdline.
Это значит что любой символ из набора ASCII и выше там может очутиться.
Если вы посмотрите в ASCII таблицу, то увидите что там не все символы
печатные, т.е. отображаемые. Некоторые имеют специальное значение,
например символ табуляции '\t' с кодом 0x09.
Кроме того, для терминалов комбинации из специальных символов могут
являться командами. Например, для linux-консоли (похож на vt-220)
последователность ESC [ 2 J (где ESC это 0x1b) очистит весь экран.
Подробнее про управляющие последовательности linux-консоли можно
прочитать в console_codes(4). Если пользователь в argv[] передаст такую
последовательность, то ваш ps просто экран будет стирать при выводе
cmdline, если вы не экранируете ESC.
Можете проверить, как работают эти управляющие последовательности:
$ echo -e \\033[2J
В ctype.h есть определения функций стандартной библиотеки, которые вам
помогут определить категорию символа. Посмотрите man-страницу по
isprint(3) и iscntrl(3).
Получается что вам нужно посимвольно пробежаться по буферу, куда вы
поместили выковыренные строки из cmdline (они там разделены нулём) и
проверить, к какой категории относится каждый символ. Результат
помещаете в выходной буфер. Я думаю что выходной буфер должен
передаваться как аргумент в функцию экранирования вместе со своим размером.
--
Г.А.
Malkov Stanislav пишет:
> Здравствуйте. Григорий Александрович Мы исправили некоторые недочеты, можете посмотреть, если будет время. Но у нас есть проблема, мы не понимаем значение третьего пункта замечаний, объясните пожалуйста поподробнее: что может случиться, как этого избежать и как это проверить???
>
>
>> 3. В /proc//cmdline аргументы, которые были переданы с командной
>> строки разделены нулём, т.е. символом, который обозначает в Си
>> завершение строки. Поэтому вам надо их там особым образом все прочитать
>> поля.
>>
>> $ hexdump -c /proc/self/cmdline
>> 0000000 h e x d u m p \0 - c \0 / p r o c
>> 0000010 / s e l f / c m d l i n e \0
>> 000001e
>>
>> Кроме того, это строки, задаваемые пользователем. А пользователь может
>> быть очень коварным, и может туда засунуть всё что угодно, и символ
>> табуляции и переноса каретки и т.д. По идее, все непечатные символы надо
>> оттуда убрать (экранировать).
Подробная информация о списке рассылки cdev