Skip to content

Commit 0b58e6a

Browse files
Modify installd to set the SELinux security context on package directories.
installd already sets the UID/GID/mode for package directories. Extend it to also call libselinux to set the SELinux security context. Change-Id: I22d38e3e7facdfcee20a34bf30f1412dbb87761f
1 parent d80cbb8 commit 0b58e6a

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

cmds/installd/Android.mk

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ LOCAL_SHARED_LIBRARIES := \
3434
LOCAL_STATIC_LIBRARIES := \
3535
libdiskusage
3636

37+
ifeq ($(HAVE_SELINUX),true)
38+
LOCAL_C_INCLUDES += external/libselinux/include
39+
LOCAL_SHARED_LIBRARIES += libselinux
40+
LOCAL_CFLAGS := -DHAVE_SELINUX
41+
endif # HAVE_SELINUX
42+
3743
LOCAL_MODULE := installd
3844

3945
LOCAL_MODULE_TAGS := optional

cmds/installd/commands.c

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
#include "installd.h"
1818
#include <diskusage/dirsize.h>
1919

20+
#ifdef HAVE_SELINUX
21+
#include <selinux/android.h>
22+
#endif
23+
2024
/* Directory records that are used in execution of commands. */
2125
dir_rec_t android_data_dir;
2226
dir_rec_t android_asec_dir;
@@ -58,6 +62,15 @@ int install(const char *pkgname, uid_t uid, gid_t gid)
5862
unlink(pkgdir);
5963
return -errno;
6064
}
65+
66+
#ifdef HAVE_SELINUX
67+
if (selinux_android_setfilecon(pkgdir, pkgname, uid) < 0) {
68+
LOGE("cannot setfilecon dir '%s': %s\n", pkgdir, strerror(errno));
69+
unlink(pkgdir);
70+
return -errno;
71+
}
72+
#endif
73+
6174
if (mkdir(libdir, 0755) < 0) {
6275
ALOGE("cannot create dir '%s': %s\n", libdir, strerror(errno));
6376
unlink(pkgdir);
@@ -75,6 +88,16 @@ int install(const char *pkgname, uid_t uid, gid_t gid)
7588
unlink(pkgdir);
7689
return -errno;
7790
}
91+
92+
#ifdef HAVE_SELINUX
93+
if (selinux_android_setfilecon(libdir, pkgname, AID_SYSTEM) < 0) {
94+
LOGE("cannot setfilecon dir '%s': %s\n", libdir, strerror(errno));
95+
unlink(libdir);
96+
unlink(pkgdir);
97+
return -errno;
98+
}
99+
#endif
100+
78101
return 0;
79102
}
80103

@@ -135,6 +158,15 @@ int make_user_data(const char *pkgname, uid_t uid, uid_t persona)
135158
unlink(pkgdir);
136159
return -errno;
137160
}
161+
162+
#ifdef HAVE_SELINUX
163+
if (selinux_android_setfilecon(pkgdir, pkgname, uid) < 0) {
164+
LOGE("cannot setfilecon dir '%s': %s\n", pkgdir, strerror(errno));
165+
unlink(pkgdir);
166+
return -errno;
167+
}
168+
#endif
169+
138170
return 0;
139171
}
140172

@@ -284,12 +316,18 @@ int protect(char *pkgname, gid_t gid)
284316
ALOGE("failed to chgrp '%s': %s\n", pkgpath, strerror(errno));
285317
return -1;
286318
}
287-
288319
if (chmod(pkgpath, S_IRUSR|S_IWUSR|S_IRGRP) < 0) {
289320
ALOGE("failed to chmod '%s': %s\n", pkgpath, strerror(errno));
290321
return -1;
291322
}
292323

324+
#ifdef HAVE_SELINUX
325+
if (selinux_android_setfilecon(pkgpath, pkgname, s.st_uid) < 0) {
326+
LOGE("cannot setfilecon dir '%s': %s\n", pkgpath, strerror(errno));
327+
return -1;
328+
}
329+
#endif
330+
293331
return 0;
294332
}
295333

0 commit comments

Comments
 (0)