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. */
2125dir_rec_t android_data_dir ;
2226dir_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