1*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
2*2d543d20SAndroid Build Coastguard Worker
3*2d543d20SAndroid Build Coastguard Worker #include "private.h"
4*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
5*2d543d20SAndroid Build Coastguard Worker
6*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/policydb.h>
7*2d543d20SAndroid Build Coastguard Worker
8*2d543d20SAndroid Build Coastguard Worker /* Construct a policydb from the supplied (data, len) pair */
9*2d543d20SAndroid Build Coastguard Worker
policydb_from_image(sepol_handle_t * handle,void * data,size_t len,policydb_t * policydb)10*2d543d20SAndroid Build Coastguard Worker int policydb_from_image(sepol_handle_t * handle,
11*2d543d20SAndroid Build Coastguard Worker void *data, size_t len, policydb_t * policydb)
12*2d543d20SAndroid Build Coastguard Worker {
13*2d543d20SAndroid Build Coastguard Worker
14*2d543d20SAndroid Build Coastguard Worker policy_file_t pf;
15*2d543d20SAndroid Build Coastguard Worker
16*2d543d20SAndroid Build Coastguard Worker policy_file_init(&pf);
17*2d543d20SAndroid Build Coastguard Worker pf.type = PF_USE_MEMORY;
18*2d543d20SAndroid Build Coastguard Worker pf.data = data;
19*2d543d20SAndroid Build Coastguard Worker pf.len = len;
20*2d543d20SAndroid Build Coastguard Worker pf.handle = handle;
21*2d543d20SAndroid Build Coastguard Worker
22*2d543d20SAndroid Build Coastguard Worker if (policydb_read(policydb, &pf, 0)) {
23*2d543d20SAndroid Build Coastguard Worker policydb_destroy(policydb);
24*2d543d20SAndroid Build Coastguard Worker ERR(handle, "policy image is invalid");
25*2d543d20SAndroid Build Coastguard Worker errno = EINVAL;
26*2d543d20SAndroid Build Coastguard Worker return STATUS_ERR;
27*2d543d20SAndroid Build Coastguard Worker }
28*2d543d20SAndroid Build Coastguard Worker
29*2d543d20SAndroid Build Coastguard Worker return STATUS_SUCCESS;
30*2d543d20SAndroid Build Coastguard Worker }
31*2d543d20SAndroid Build Coastguard Worker
32*2d543d20SAndroid Build Coastguard Worker /* Write a policydb to a memory region, and return the (data, len) pair. */
33*2d543d20SAndroid Build Coastguard Worker
policydb_to_image(sepol_handle_t * handle,policydb_t * policydb,void ** newdata,size_t * newlen)34*2d543d20SAndroid Build Coastguard Worker int policydb_to_image(sepol_handle_t * handle,
35*2d543d20SAndroid Build Coastguard Worker policydb_t * policydb, void **newdata, size_t * newlen)
36*2d543d20SAndroid Build Coastguard Worker {
37*2d543d20SAndroid Build Coastguard Worker
38*2d543d20SAndroid Build Coastguard Worker void *tmp_data = NULL;
39*2d543d20SAndroid Build Coastguard Worker size_t tmp_len;
40*2d543d20SAndroid Build Coastguard Worker policy_file_t pf;
41*2d543d20SAndroid Build Coastguard Worker struct policydb tmp_policydb;
42*2d543d20SAndroid Build Coastguard Worker
43*2d543d20SAndroid Build Coastguard Worker /* Compute the length for the new policy image. */
44*2d543d20SAndroid Build Coastguard Worker policy_file_init(&pf);
45*2d543d20SAndroid Build Coastguard Worker pf.type = PF_LEN;
46*2d543d20SAndroid Build Coastguard Worker pf.handle = handle;
47*2d543d20SAndroid Build Coastguard Worker if (policydb_write(policydb, &pf)) {
48*2d543d20SAndroid Build Coastguard Worker ERR(handle, "could not compute policy length");
49*2d543d20SAndroid Build Coastguard Worker errno = EINVAL;
50*2d543d20SAndroid Build Coastguard Worker goto err;
51*2d543d20SAndroid Build Coastguard Worker }
52*2d543d20SAndroid Build Coastguard Worker
53*2d543d20SAndroid Build Coastguard Worker /* Allocate the new policy image. */
54*2d543d20SAndroid Build Coastguard Worker pf.type = PF_USE_MEMORY;
55*2d543d20SAndroid Build Coastguard Worker pf.data = malloc(pf.len);
56*2d543d20SAndroid Build Coastguard Worker if (!pf.data) {
57*2d543d20SAndroid Build Coastguard Worker ERR(handle, "out of memory");
58*2d543d20SAndroid Build Coastguard Worker goto err;
59*2d543d20SAndroid Build Coastguard Worker }
60*2d543d20SAndroid Build Coastguard Worker
61*2d543d20SAndroid Build Coastguard Worker /* Need to save len and data prior to modification by policydb_write. */
62*2d543d20SAndroid Build Coastguard Worker tmp_len = pf.len;
63*2d543d20SAndroid Build Coastguard Worker tmp_data = pf.data;
64*2d543d20SAndroid Build Coastguard Worker
65*2d543d20SAndroid Build Coastguard Worker /* Write out the new policy image. */
66*2d543d20SAndroid Build Coastguard Worker if (policydb_write(policydb, &pf)) {
67*2d543d20SAndroid Build Coastguard Worker ERR(handle, "could not write policy");
68*2d543d20SAndroid Build Coastguard Worker errno = EINVAL;
69*2d543d20SAndroid Build Coastguard Worker goto err;
70*2d543d20SAndroid Build Coastguard Worker }
71*2d543d20SAndroid Build Coastguard Worker
72*2d543d20SAndroid Build Coastguard Worker /* Verify the new policy image. */
73*2d543d20SAndroid Build Coastguard Worker pf.type = PF_USE_MEMORY;
74*2d543d20SAndroid Build Coastguard Worker pf.data = tmp_data;
75*2d543d20SAndroid Build Coastguard Worker pf.len = tmp_len;
76*2d543d20SAndroid Build Coastguard Worker if (policydb_init(&tmp_policydb)) {
77*2d543d20SAndroid Build Coastguard Worker ERR(handle, "Out of memory");
78*2d543d20SAndroid Build Coastguard Worker errno = ENOMEM;
79*2d543d20SAndroid Build Coastguard Worker goto err;
80*2d543d20SAndroid Build Coastguard Worker }
81*2d543d20SAndroid Build Coastguard Worker if (policydb_read(&tmp_policydb, &pf, 0)) {
82*2d543d20SAndroid Build Coastguard Worker ERR(handle, "new policy image is invalid");
83*2d543d20SAndroid Build Coastguard Worker errno = EINVAL;
84*2d543d20SAndroid Build Coastguard Worker goto err;
85*2d543d20SAndroid Build Coastguard Worker }
86*2d543d20SAndroid Build Coastguard Worker policydb_destroy(&tmp_policydb);
87*2d543d20SAndroid Build Coastguard Worker
88*2d543d20SAndroid Build Coastguard Worker /* Update (newdata, newlen) */
89*2d543d20SAndroid Build Coastguard Worker *newdata = tmp_data;
90*2d543d20SAndroid Build Coastguard Worker *newlen = tmp_len;
91*2d543d20SAndroid Build Coastguard Worker
92*2d543d20SAndroid Build Coastguard Worker /* Recover */
93*2d543d20SAndroid Build Coastguard Worker return STATUS_SUCCESS;
94*2d543d20SAndroid Build Coastguard Worker
95*2d543d20SAndroid Build Coastguard Worker err:
96*2d543d20SAndroid Build Coastguard Worker ERR(handle, "could not create policy image");
97*2d543d20SAndroid Build Coastguard Worker
98*2d543d20SAndroid Build Coastguard Worker /* Recover */
99*2d543d20SAndroid Build Coastguard Worker free(tmp_data);
100*2d543d20SAndroid Build Coastguard Worker return STATUS_ERR;
101*2d543d20SAndroid Build Coastguard Worker }
102