Как linuxabilities.h использует 32-битную маску для 34 элементов? - PullRequest
0 голосов
/ 27 декабря 2011

Файл в /usr/include/linux/capability.h # определяет 34 возможных возможностей. Это идет как:

#define CAP_CHOWN            0

#define CAP_DAC_OVERRIDE     1

.....

#define CAP_MAC_ADMIN        33

#define CAP_LAST_CAP         CAP_MAC_ADMIN

каждый процесс имеет определенные таким образом возможности

typedef struct __user_cap_data_struct {

        __u32 effective;
        __u32 permitted;
        __u32 inheritable;
} * cap_user_data_t;

Я в замешательстве - у процесса могут быть 32-битные эффективные возможности, но общее количество возможностей, определенное в Capacity.h, равно 34. Как можно кодировать 34 позиции в 32-битной маске?

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Потому что вы не прочитали все руководство.

Руководство по использованию capget начинается с убеждения, что вы не должны его использовать:

These two functions are the raw kernel interface for getting  and  set‐
ting  thread capabilities.  Not only are these system calls specific to
Linux, but the kernel API is likely to change and use  of  these  func‐
tions  (in  particular the format of the cap_user_*_t types) is subject
to extension with each kernel revision,  but  old  programs  will  keep
working.

The  portable  interfaces  are  cap_set_proc(3) and cap_get_proc(3); if
possible you should use those interfaces in applications.  If you  wish
to use the Linux extensions in applications, you should use the easier-
to-use interfaces capsetp(3) and capgetp(3).

Текущие данные

Now that you have been warned, some current kernel details.  The struc‐
tures are defined as follows.

#define _LINUX_CAPABILITY_VERSION_1  0x19980330
#define _LINUX_CAPABILITY_U32S_1     1

#define _LINUX_CAPABILITY_VERSION_2  0x20071026
#define _LINUX_CAPABILITY_U32S_2     2

[...]
effective,  permitted,  inheritable  are  bitmasks  of the capabilities
defined in capability(7).  Note the CAP_* values are  bit  indexes  and
need to be bit-shifted before ORing into the bit fields.
[...]
Kernels  prior  to  2.6.25  prefer  32-bit  capabilities  with  version
_LINUX_CAPABILITY_VERSION_1, and kernels 2.6.25+ prefer 64-bit capabil‐
ities with version _LINUX_CAPABILITY_VERSION_2.  Note, 64-bit capabili‐
ties  use  datap[0]  and datap[1], whereas 32-bit capabilities only use
datap[0].

, где datap определен ранее как указатель на __user_cap_data_struct. Таким образом, вы просто представляете 64-битные значения с двумя __u32 в массиве из двух __user_cap_data_struct.

Это само по себе говорит мне никогда не использовать этот API, поэтому я не читал остальную часть руководства.

2 голосов
/ 27 декабря 2011

Они не битовые маски, они просто постоянные. НАПРИМЕР. CAP_MAC_ADMIN устанавливает более одного бита. В двоичном, 33 это что, 10001?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...