diff options
author | William Roberts <william.c.roberts@intel.com> | 2015-10-22 23:12:06 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2015-10-22 23:12:06 +0000 |
commit | ca65fd5116ff9605f143aef40b8d7b6f497f9ff9 (patch) | |
tree | c43ae5f3611a32519e1dfe4800fd56726310dcd1 | |
parent | 04badd25be333633a686452bfadc5c960973035a (diff) | |
parent | 6d5e6edc21b1c41e815403a7ff9d8678642b744d (diff) | |
download | libselinux-ca65fd5116ff9605f143aef40b8d7b6f497f9ff9.tar.gz |
Use libpackageparser
am: 6d5e6edc21
* commit '6d5e6edc21b1c41e815403a7ff9d8678642b744d':
Use libpackageparser
-rw-r--r-- | Android.mk | 4 | ||||
-rw-r--r-- | src/android.c | 124 |
2 files changed, 32 insertions, 96 deletions
@@ -50,7 +50,7 @@ LOCAL_MODULE:= libselinux LOCAL_MODULE_TAGS := eng LOCAL_STATIC_LIBRARIES := libmincrypt LOCAL_C_INCLUDES := external/pcre -LOCAL_WHOLE_STATIC_LIBRARIES := libpcre +LOCAL_WHOLE_STATIC_LIBRARIES := libpcre libpackagelistparser # 1003 corresponds to auditd, from system/core/logd/event.logtags LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003 # mapping.c has redundant check of array p_in->perms. @@ -80,7 +80,7 @@ LOCAL_COPY_HEADERS_TO := $(common_COPY_HEADERS_TO) LOCAL_COPY_HEADERS := $(common_COPY_HEADERS) LOCAL_STATIC_LIBRARIES := libmincrypt LOCAL_C_INCLUDES := external/pcre -LOCAL_SHARED_LIBRARIES := liblog libpcre +LOCAL_SHARED_LIBRARIES := liblog libpcre libpackagelistparser # 1003 corresponds to auditd, from system/core/logd/event.logtags LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003 # mapping.c has redundant check of array p_in->perms. diff --git a/src/android.c b/src/android.c index 5db47c3..a627b15 100644 --- a/src/android.c +++ b/src/android.c @@ -32,6 +32,7 @@ #include <sys/vfs.h> #include <linux/magic.h> #include <libgen.h> +#include <packagelistparser/packagelistparser.h> /* * XXX Where should this configuration file be located? @@ -974,17 +975,8 @@ static void file_context_init(void) static pthread_once_t fc_once = PTHREAD_ONCE_INIT; -struct pkgInfo { - char *name; - uid_t uid; - bool debuggable; - char *dataDir; - char *seinfo; - struct pkgInfo *next; -}; - #define PKGTAB_SIZE 256 -static struct pkgInfo *pkgTab[PKGTAB_SIZE]; +static struct pkg_info *pkgTab[PKGTAB_SIZE]; static unsigned int pkghash(const char *pkgname) { @@ -995,82 +987,41 @@ static unsigned int pkghash(const char *pkgname) return h & (PKGTAB_SIZE - 1); } -/* The file containing the list of installed packages on the system */ -#define PACKAGES_LIST_FILE "/data/system/packages.list" +static bool pkg_parse_callback(pkg_info *info, void *userdata) { + + (void) userdata; + + unsigned int hash = pkghash(info->name); + if (pkgTab[hash]) + info->private_data = pkgTab[hash]; + pkgTab[hash] = info; + return true; +} static void package_info_init(void) { - char *buf = NULL; - size_t buflen = 0; - ssize_t bytesread; - FILE *fp; - char *cur, *next; - struct pkgInfo *pkgInfo = NULL; - unsigned int hash; - unsigned long lineno = 1; - fp = fopen(PACKAGES_LIST_FILE, "r"); - if (!fp) { - selinux_log(SELINUX_ERROR, "SELinux: Could not open %s: %s.\n", - PACKAGES_LIST_FILE, strerror(errno)); + bool rc = packagelist_parse(pkg_parse_callback, NULL); + if (!rc) { + selinux_log(SELINUX_ERROR, "SELinux: Could NOT parse package list\n"); return; } - while ((bytesread = getline(&buf, &buflen, fp)) > 0) { - pkgInfo = calloc(1, sizeof(*pkgInfo)); - if (!pkgInfo) - goto err; - next = buf; - cur = strsep(&next, " \t\n"); - if (!cur) - goto err; - pkgInfo->name = strdup(cur); - if (!pkgInfo->name) - goto err; - cur = strsep(&next, " \t\n"); - if (!cur) - goto err; - pkgInfo->uid = atoi(cur); - if (!pkgInfo->uid) - goto err; - cur = strsep(&next, " \t\n"); - if (!cur) - goto err; - pkgInfo->debuggable = atoi(cur); - cur = strsep(&next, " \t\n"); - if (!cur) - goto err; - pkgInfo->dataDir = strdup(cur); - if (!pkgInfo->dataDir) - goto err; - cur = strsep(&next, " \t\n"); - if (!cur) - goto err; - pkgInfo->seinfo = strdup(cur); - if (!pkgInfo->seinfo) - goto err; - - hash = pkghash(pkgInfo->name); - if (pkgTab[hash]) - pkgInfo->next = pkgTab[hash]; - pkgTab[hash] = pkgInfo; - - lineno++; - } #if DEBUG { - unsigned int buckets, entries, chainlen, longestchain; + unsigned int hash, buckets, entries, chainlen, longestchain; + struct pkg_info *info = NULL; buckets = entries = longestchain = 0; for (hash = 0; hash < PKGTAB_SIZE; hash++) { if (pkgTab[hash]) { buckets++; chainlen = 0; - for (pkgInfo = pkgTab[hash]; pkgInfo; pkgInfo = pkgInfo->next) { + for (info = pkgTab[hash]; info; info = (pkg_info *)info->private_data) { chainlen++; selinux_log(SELINUX_INFO, "%s: name=%s uid=%u debuggable=%s dataDir=%s seinfo=%s\n", __FUNCTION__, - pkgInfo->name, pkgInfo->uid, pkgInfo->debuggable ? "true" : "false", pkgInfo->dataDir, pkgInfo->seinfo); + info->name, info->uid, info->debuggable ? "true" : "false", info->data_dir, info->seinfo); } entries += chainlen; if (longestchain < chainlen) @@ -1081,36 +1032,21 @@ static void package_info_init(void) } #endif -out: - free(buf); - fclose(fp); - return; - -err: - selinux_log(SELINUX_ERROR, "SELinux: Error reading %s on line %lu.\n", - PACKAGES_LIST_FILE, lineno); - if (pkgInfo) { - free(pkgInfo->name); - free(pkgInfo->dataDir); - free(pkgInfo->seinfo); - free(pkgInfo); - } - goto out; } static pthread_once_t pkg_once = PTHREAD_ONCE_INIT; -struct pkgInfo *package_info_lookup(const char *name) +struct pkg_info *package_info_lookup(const char *name) { - struct pkgInfo *pkgInfo; + struct pkg_info *info; unsigned int hash; __selinux_once(pkg_once, package_info_init); hash = pkghash(name); - for (pkgInfo = pkgTab[hash]; pkgInfo; pkgInfo = pkgInfo->next) { - if (!strcmp(name, pkgInfo->name)) - return pkgInfo; + for (info = pkgTab[hash]; info; info = (pkg_info *)info->private_data) { + if (!strcmp(name, info->name)) + return info; } return NULL; } @@ -1128,7 +1064,7 @@ static int pkgdir_selabel_lookup(const char *pathname, char **secontextp) { char *pkgname = NULL, *end = NULL; - struct pkgInfo *pkgInfo = NULL; + struct pkg_info *info = NULL; char *secontext = *secontextp; context_t ctx = NULL; int rc = 0; @@ -1170,8 +1106,8 @@ static int pkgdir_selabel_lookup(const char *pathname, *end = '\0'; if (!seinfo) { - pkgInfo = package_info_lookup(pkgname); - if (!pkgInfo) { + info = package_info_lookup(pkgname); + if (!info) { selinux_log(SELINUX_WARNING, "SELinux: Could not look up information for package %s, cannot restorecon %s.\n", pkgname, pathname); free(pkgname); @@ -1183,8 +1119,8 @@ static int pkgdir_selabel_lookup(const char *pathname, if (!ctx) goto err; - rc = seapp_context_lookup(SEAPP_TYPE, pkgInfo ? pkgInfo->uid : uid, 0, - pkgInfo ? pkgInfo->seinfo : seinfo, pkgInfo ? pkgInfo->name : pkgname, pathname, ctx); + rc = seapp_context_lookup(SEAPP_TYPE, info ? info->uid : uid, 0, + info ? info->seinfo : seinfo, info ? info->name : pkgname, pathname, ctx); if (rc < 0) goto err; @@ -1212,7 +1148,7 @@ out: return rc; err: selinux_log(SELINUX_ERROR, "%s: Error looking up context for path %s, pkgname %s, seinfo %s, uid %u: %s\n", - __FUNCTION__, pathname, pkgname, pkgInfo->seinfo, pkgInfo->uid, strerror(errno)); + __FUNCTION__, pathname, pkgname, info->seinfo, info->uid, strerror(errno)); rc = -1; goto out; } |