[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