@@ -27,13 +27,15 @@ dir_rec_t android_data_dir;
2727dir_rec_t android_asec_dir ;
2828dir_rec_t android_app_dir ;
2929dir_rec_t android_app_private_dir ;
30+ dir_rec_t android_app_lib_dir ;
3031dir_rec_t android_media_dir ;
3132dir_rec_array_t android_system_dirs ;
3233
3334int install (const char * pkgname , uid_t uid , gid_t gid )
3435{
3536 char pkgdir [PKG_PATH_MAX ];
36- char libdir [PKG_PATH_MAX ];
37+ char libsymlink [PKG_PATH_MAX ];
38+ char applibdir [PKG_PATH_MAX ];
3739
3840 if ((uid < AID_SYSTEM ) || (gid < AID_SYSTEM )) {
3941 ALOGE ("invalid uid/gid: %d %d\n" , uid , gid );
@@ -45,63 +47,48 @@ int install(const char *pkgname, uid_t uid, gid_t gid)
4547 return -1 ;
4648 }
4749
48- if (create_pkg_path (libdir , pkgname , PKG_LIB_POSTFIX , 0 )) {
49- ALOGE ("cannot create package lib path\n" );
50+ if (create_pkg_path (libsymlink , pkgname , PKG_LIB_POSTFIX , 0 )) {
51+ ALOGE ("cannot create package lib symlink origin path\n" );
52+ return -1 ;
53+ }
54+
55+ if (create_pkg_path_in_dir (applibdir , & android_app_lib_dir , pkgname , PKG_DIR_POSTFIX )) {
56+ ALOGE ("cannot create package lib symlink dest path\n" );
5057 return -1 ;
5158 }
5259
5360 if (mkdir (pkgdir , 0751 ) < 0 ) {
5461 ALOGE ("cannot create dir '%s': %s\n" , pkgdir , strerror (errno ));
55- return - errno ;
62+ return -1 ;
5663 }
5764 if (chmod (pkgdir , 0751 ) < 0 ) {
5865 ALOGE ("cannot chmod dir '%s': %s\n" , pkgdir , strerror (errno ));
5966 unlink (pkgdir );
60- return - errno ;
67+ return -1 ;
6168 }
6269
63- if (mkdir (libdir , 0755 ) < 0 ) {
64- ALOGE ("cannot create dir '%s': %s\n" , libdir , strerror (errno ));
70+ if (symlink (applibdir , libsymlink ) < 0 ) {
71+ ALOGE ("couldn't symlink directory '%s' -> '%s': %s\n" , libsymlink , applibdir ,
72+ strerror (errno ));
6573 unlink (pkgdir );
66- return - errno ;
67- }
68- if (chmod (libdir , 0755 ) < 0 ) {
69- ALOGE ("cannot chmod dir '%s': %s\n" , libdir , strerror (errno ));
70- unlink (libdir );
71- unlink (pkgdir );
72- return - errno ;
73- }
74- if (chown (libdir , AID_SYSTEM , AID_SYSTEM ) < 0 ) {
75- ALOGE ("cannot chown dir '%s': %s\n" , libdir , strerror (errno ));
76- unlink (libdir );
77- unlink (pkgdir );
78- return - errno ;
74+ return -1 ;
7975 }
8076
8177#ifdef HAVE_SELINUX
82- if (selinux_android_setfilecon (libdir , pkgname , AID_SYSTEM ) < 0 ) {
83- ALOGE ("cannot setfilecon dir '%s': %s\n" , libdir , strerror (errno ));
84- unlink (libdir );
78+ if (selinux_android_setfilecon (pkgdir , pkgname , uid ) < 0 ) {
79+ ALOGE ("cannot setfilecon dir '%s': %s\n" , pkgdir , strerror (errno ));
80+ unlink (libsymlink );
8581 unlink (pkgdir );
86- return - errno ;
82+ return -1 ;
8783 }
8884#endif
8985
9086 if (chown (pkgdir , uid , gid ) < 0 ) {
9187 ALOGE ("cannot chown dir '%s': %s\n" , pkgdir , strerror (errno ));
92- unlink (libdir );
93- unlink (pkgdir );
94- return - errno ;
95- }
96-
97- #ifdef HAVE_SELINUX
98- if (selinux_android_setfilecon (pkgdir , pkgname , uid ) < 0 ) {
99- ALOGE ("cannot setfilecon dir '%s': %s\n" , pkgdir , strerror (errno ));
100- unlink (libdir );
88+ unlink (libsymlink );
10189 unlink (pkgdir );
102- return - errno ;
90+ return -1 ;
10391 }
104- #endif
10592
10693 return 0 ;
10794}
@@ -185,7 +172,6 @@ int delete_user_data(const char *pkgname, uid_t persona)
185172int make_user_data (const char * pkgname , uid_t uid , uid_t persona )
186173{
187174 char pkgdir [PKG_PATH_MAX ];
188- char real_libdir [PKG_PATH_MAX ];
189175
190176 // Create the data dir for the package
191177 if (create_pkg_path (pkgdir , pkgname , PKG_DIR_POSTFIX , persona )) {
@@ -1038,85 +1024,3 @@ int linklib(const char* dataDir, const char* asecLibDir)
10381024
10391025 return rc ;
10401026}
1041-
1042- int unlinklib (const char * dataDir )
1043- {
1044- char libdir [PKG_PATH_MAX ];
1045- struct stat s , libStat ;
1046- int rc = 0 ;
1047-
1048- const size_t libdirLen = strlen (dataDir ) + strlen (PKG_LIB_POSTFIX );
1049- if (libdirLen >= PKG_PATH_MAX ) {
1050- return -1 ;
1051- }
1052-
1053- if (snprintf (libdir , sizeof (libdir ), "%s%s" , dataDir , PKG_LIB_POSTFIX ) != (ssize_t )libdirLen ) {
1054- ALOGE ("library dir not written successfully: %s\n" , strerror (errno ));
1055- return -1 ;
1056- }
1057-
1058- if (stat (dataDir , & s ) < 0 ) {
1059- ALOGE ("couldn't state data dir" );
1060- return -1 ;
1061- }
1062-
1063- if (chown (dataDir , AID_INSTALL , AID_INSTALL ) < 0 ) {
1064- ALOGE ("failed to chown '%s': %s\n" , dataDir , strerror (errno ));
1065- return -1 ;
1066- }
1067-
1068- if (chmod (dataDir , 0700 ) < 0 ) {
1069- ALOGE ("unlinklib() 1: failed to chmod '%s': %s\n" , dataDir , strerror (errno ));
1070- rc = -1 ;
1071- goto out ;
1072- }
1073-
1074- if (lstat (libdir , & libStat ) < 0 ) {
1075- ALOGE ("couldn't stat lib dir: %s\n" , strerror (errno ));
1076- rc = -1 ;
1077- goto out ;
1078- }
1079-
1080- if (S_ISDIR (libStat .st_mode )) {
1081- if (delete_dir_contents (libdir , 1 , 0 ) < 0 ) {
1082- rc = -1 ;
1083- goto out ;
1084- }
1085- } else if (S_ISLNK (libStat .st_mode )) {
1086- if (unlink (libdir ) < 0 ) {
1087- rc = -1 ;
1088- goto out ;
1089- }
1090- }
1091-
1092- if (mkdir (libdir , 0755 ) < 0 ) {
1093- ALOGE ("cannot create dir '%s': %s\n" , libdir , strerror (errno ));
1094- rc = - errno ;
1095- goto out ;
1096- }
1097- if (chmod (libdir , 0755 ) < 0 ) {
1098- ALOGE ("cannot chmod dir '%s': %s\n" , libdir , strerror (errno ));
1099- unlink (libdir );
1100- rc = - errno ;
1101- goto out ;
1102- }
1103- if (chown (libdir , AID_SYSTEM , AID_SYSTEM ) < 0 ) {
1104- ALOGE ("cannot chown dir '%s': %s\n" , libdir , strerror (errno ));
1105- unlink (libdir );
1106- rc = - errno ;
1107- goto out ;
1108- }
1109-
1110- out :
1111- if (chmod (dataDir , s .st_mode ) < 0 ) {
1112- ALOGE ("unlinklib() 2: failed to chmod '%s': %s\n" , dataDir , strerror (errno ));
1113- rc = -1 ;
1114- }
1115-
1116- if (chown (dataDir , s .st_uid , s .st_gid ) < 0 ) {
1117- ALOGE ("failed to chown '%s' : %s\n" , dataDir , strerror (errno ));
1118- return -1 ;
1119- }
1120-
1121- return rc ;
1122- }
0 commit comments