Re: "SELinux: ebitmap: truncated map" after editing with libsepol

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/17/2014 09:02 AM, Stephen Smalley wrote:
> On 12/17/2014 04:30 AM, Andrew Gunnerson wrote:
>> Hello all,
>>
>> I have a very simple test program to help with debugging my Android
>> dual booting project. It reads the current policy from
>> /sys/fs/selinux/policy,
>> changes a single type to be permissive, and then loads the new policy
>> by writing it to /sys/fs/selinux/load. The problem is, after editing the
>> policy with sepol, it fails to load and the kernel prints the following
>> message in dmesg: "SELinux: ebitmap: truncated map".
>>
>> The program reads and writes the policy file using the standard fopen
>> and policydb_read/policydb_write calls. I then set a few types to be
>> permissive using the following loop:
>>
>>     ...
>>     char *name;
>>     int is_permissive;
>>     char **types = (null terminated char* array)
>>     char **type;
>>     ...
>>     for (unsigned int i = 0; i < pdb->p_types.nprim - 1; i++) {
>>         name = pdb->p_type_val_to_name[i];
>>         is_permissive = ebitmap_get_bit(&pdb->permissive_map, i + 1);
>>
>>         if (!is_permissive) {
>>             for (type = types; *type; type++) {
>>                 if (strcmp(*type, name) == 0) {
>>                     ebitmap_set_bit(&pdb->permissive_map, i + 1, 1);
>>                     break;
>>                 }
>>             }
>>         }
>>     }
>>     ...
>>
>> I've been trying to debug this for many hours, but I can't seem to figure
>> out why this is happening. Is there a simple mistake I'm overlooking or
>> am I approaching this in a completely wrong way?
>>
>> Thanks in advance! Any help is greatly appreciated!
>>
>> Andrew Gunnerson
>>
>>
>> PS: This is running on Android 5.0 with libsepol 2.4-rc4 and kernel
>> 3.4.0-g88fbc66.
> 
> The implementation of /sys/fs/selinux/load requires you to write the
> entire policy in a single write(2) call, so you can't use stdio methods
> for writing the policy image.  policydb_write() the image to memory and
> then call security_load_policy() on that memory region.

You can use policydb_to_image() to write a policydb to a memory region,
obtaining a (data, len) pair describing the region, and then call
security_load_policy() on that pair.

> Also, you can see a working example of a program that does this kind of
> thing (but on files rather than directly to /sys/fs/selinux/load) in
> sepolicy-inject,
> https://bitbucket.org/joshua_brindle/sepolicy-inject
> 
> Any particular reason you are building a pre-release upstream libsepol
> rather than the one included in AOSP (external/libsepol)?  Admittedly,
> that is only built for the host, not the device, presently, so you'd at
> least need to change that.
> 

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux