|
From: <ssm...@us...> - 2007-05-31 20:57:47
|
Revision: 2454
http://svn.sourceforge.net/selinux/?rev=2454&view=rev
Author: ssmalley
Date: 2007-05-31 13:57:45 -0700 (Thu, 31 May 2007)
Log Message:
-----------
Author: Yuichi Nakamura
Email: yn...@hi...
Subject: Reducing size of libselinux/libsepol: 3rd
Date: Wed, 23 May 2007 10:39:36 +0900
Hi.
As discussed in previous threads,
http://marc.info/?t=117609454600002&r=1&w=2
http://marc.info/?t=117886013000001&r=1&w=2
I would like to submit patch to reduce size of libselinux+libsepol, again.
1. Background
Current libselinux+libsepol size is big for embedded devices.
libselinux.so.1: 115348 byte
libsepol.so.1:302067
Total: 417415 byte
It uses more than 400kbyte.
Needs for embedded device is various, because hardware resource is various.
If device is rich enough, people may want full-featured SELinux.
If device is not rich, people want to reduce binary size by removing
some features.
For example, some may not want modular policy, may not want boolean.
We thought size of libselinux+libsepol can be reduced
by removing libsepol and removing unnecessary functions from libselinux.
2. What this patch does
1) libsepol is separated from libselinux
libsepol is not required by libselinux.
So you do not have to compile libsepol,
if you do not need libsepol functions.
2) Some features are disabled in libselinux
By typing "make EMBEDDED=y" in libselinux dir, what happens is following.
Following values are defined in Makefile.
>ifeq ($(EMBEDDED),y)
> override DISABLE_AVC=y
> override DISABLE_SETRANS=y
> override DISABLE_RPM=y
> override DISABLE_BOOL=y
>endif
* DISABLE_AVC
Disables user space avc support, avc.c avc_internal.c avc_sidtab.c are not compiled.
* DISABLE_SETRANS
Some functions of translations are replaced with stubs in setrans_client.c
* DISABLE_RPM
Disables rpm features, rpm.c are not compiled.
* DISABLE_BOOL
Disable boolean features, booleans.c are not compiled.
3) Fixes to libselinux/utils
* -lsepol is removed
* When make EMBEDDED=y, some utils are not compiled.
3. Size measurement
Compiled libselinux/libsepol in trunk by gcc(x86).
* Before
libselinux.so.1: 115348 byte
libsepol.so.1:302067
Total: 417415 byte
* After
libselinux.so.1: 77103 byte
libsepol.so.1:0 byte(do not have to compile)
Total: 77103 byte
Please consider merging this patch.
Acked-by: Stephen Smalley <sd...@ty...>
Modified Paths:
--------------
trunk/libselinux/Makefile
trunk/libselinux/src/Makefile
trunk/libselinux/src/load_policy.c
trunk/libselinux/src/policy.h
trunk/libselinux/src/policyvers.c
trunk/libselinux/src/setrans_client.c
trunk/libselinux/utils/Makefile
Modified: trunk/libselinux/Makefile
===================================================================
--- trunk/libselinux/Makefile 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/Makefile 2007-05-31 20:57:45 UTC (rev 2454)
@@ -1,3 +1,21 @@
+DISABLE_AVC ?= n
+DISABLE_SETRANS ?= n
+DISABLE_RPM ?= n
+DISABLE_BOOL ?= n
+ifeq ($(EMBEDDED),y)
+ override DISABLE_AVC=y
+ override DISABLE_SETRANS=y
+ override DISABLE_RPM=y
+ override DISABLE_BOOL=y
+endif
+ifeq ($(DISABLE_BOOL),y)
+ EMFLAGS+= -DDISABLE_BOOL
+endif
+ifeq ($(DISABLE_SETRANS),y)
+ EMFLAGS+= -DDISABLE_SETRANS
+endif
+export DISABLE_AVC DISABLE_SETRANS DISABLE_RPM DISABLE_BOOL EMFLAGS
+
all:
$(MAKE) -C src
$(MAKE) -C utils
Modified: trunk/libselinux/src/Makefile
===================================================================
--- trunk/libselinux/src/Makefile 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/src/Makefile 2007-05-31 20:57:45 UTC (rev 2454)
@@ -18,10 +18,22 @@
SWIGSO=_selinux.so
SWIGFILES=$(SWIGSO) selinux.py
LIBSO=$(TARGET).$(LIBVERSION)
-OBJS= $(patsubst %.c,%.o,$(filter-out $(SWIGCOUT),$(wildcard *.c)))
-LOBJS= $(patsubst %.c,%.lo,$(filter-out $(SWIGCOUT),$(wildcard *.c)))
+
+ifeq ($(DISABLE_AVC),y)
+ UNUSED_SRCS+=avc.c avc_internal.c avc_sidtab.c
+endif
+ifeq ($(DISABLE_BOOL),y)
+ UNUSED_SRCS+=booleans.c
+endif
+ifeq ($(DISABLE_RPM),y)
+ UNUSED_SRCS+=rpm.c
+endif
+SRCS= $(filter-out $(UNUSED_SRCS), $(filter-out $(SWIGCOUT),$(wildcard *.c)))
+
+OBJS= $(patsubst %.c,%.o,$(SRCS))
+LOBJS= $(patsubst %.c,%.lo,$(SRCS))
CFLAGS ?= -Wall -W -Wundef -Wmissing-noreturn -Wmissing-format-attribute
-override CFLAGS += -I../include -I$(INCLUDEDIR) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
+override CFLAGS += -I../include -I$(INCLUDEDIR) -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(EMFLAGS)
RANLIB=ranlib
ARCH := $(patsubst i%86,i386,$(shell uname -m))
@@ -48,7 +60,7 @@
$(CC) $(LDFLAGS) -shared -o $@ $< -L. -lselinux -L$(LIBDIR) -Wl,-soname,$@
$(LIBSO): $(LOBJS)
- $(CC) $(LDFLAGS) -shared -o $@ $^ -ldl -lsepol -L$(LIBDIR) -Wl,-soname,$(LIBSO),-z,defs,-z,relro
+ $(CC) $(LDFLAGS) -shared -o $@ $^ -ldl -L$(LIBDIR) -Wl,-soname,$(LIBSO),-z,defs,-z,relro
ln -sf $@ $(TARGET)
%.o: %.c policy.h
Modified: trunk/libselinux/src/load_policy.c
===================================================================
--- trunk/libselinux/src/load_policy.c 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/src/load_policy.c 2007-05-31 20:57:45 UTC (rev 2454)
@@ -12,6 +12,7 @@
#include "selinux_internal.h"
#include <sepol/sepol.h>
#include <sepol/policydb.h>
+#include <dlfcn.h>
#include "policy.h"
#include <limits.h>
@@ -42,9 +43,9 @@
int load_setlocaldefs hidden = 1;
int selinux_mkload_policy(int preservebools)
-{
- int vers = sepol_policy_kern_vers_max();
+{
int kernvers = security_policyvers();
+ int vers = kernvers, minvers = DEFAULT_POLICY_VERSION;
char path[PATH_MAX], **names;
struct stat sb;
size_t size;
@@ -52,20 +53,95 @@
int fd, rc = -1, *values, len, i, prot;
sepol_policydb_t *policydb;
sepol_policy_file_t *pf;
+ int usesepol = 0;
+ int (*vers_max)(void) = NULL;
+ int (*vers_min)(void) = NULL;
+ int (*policy_file_create)(sepol_policy_file_t **) = NULL;
+ void (*policy_file_free)(sepol_policy_file_t *) = NULL;
+ void (*policy_file_set_mem)(sepol_policy_file_t *, char*, size_t) = NULL;
+ int (*policydb_create)(sepol_policydb_t **) = NULL;
+ void (*policydb_free)(sepol_policydb_t *) = NULL;
+ int (*policydb_read)(sepol_policydb_t *, sepol_policy_file_t *) = NULL;
+ int (*policydb_set_vers)(sepol_policydb_t *, unsigned int) = NULL;
+ int (*policydb_to_image)(sepol_handle_t *, sepol_policydb_t *, void **, size_t *) = NULL;
+ int (*genbools_array)(void *data, size_t len, char **names, int *values, int nel) = NULL;
+ int (*genusers)(void *data, size_t len, const char *usersdir, void **newdata, size_t * newlen) = NULL;
+ int (*genbools)(void *data, size_t len, char *boolpath) = NULL;
+#ifdef SHARED
+ char *errormsg = NULL;
+ void *libsepolh = NULL;
+ libsepolh = dlopen("libsepol.so", RTLD_NOW);
+ if (libsepolh) {
+ usesepol = 1;
+ dlerror();
+#define DLERR() if ((errormsg = dlerror())) goto dlclose;
+ vers_max = dlsym(libsepolh, "sepol_policy_kern_vers_max");
+ DLERR();
+ vers_min = dlsym(libsepolh, "sepol_policy_kern_vers_min");
+ DLERR();
+
+ policy_file_create = dlsym(libsepolh, "sepol_policy_file_create");
+ DLERR();
+ policy_file_free = dlsym(libsepolh, "sepol_policy_file_free");
+ DLERR();
+ policy_file_set_mem = dlsym(libsepolh, "sepol_policy_file_set_mem");
+ DLERR();
+ policydb_create = dlsym(libsepolh, "sepol_policydb_create");
+ DLERR();
+ policydb_free = dlsym(libsepolh, "sepol_policydb_free");
+ DLERR();
+ policydb_read = dlsym(libsepolh, "sepol_policydb_read");
+ DLERR();
+ policydb_set_vers = dlsym(libsepolh, "sepol_policydb_set_vers");
+ DLERR();
+ policydb_to_image = dlsym(libsepolh, "sepol_policydb_to_image");
+ DLERR();
+ genbools_array = dlsym(libsepolh, "sepol_genbools_array");
+ DLERR();
+ genusers = dlsym(libsepolh, "sepol_genusers");
+ DLERR();
+ genbools = dlsym(libsepolh, "sepol_genbools");
+ DLERR();
+
+#undef DLERR
+ }
+#else
+ usesepol = 1;
+ vers_max = sepol_policy_kern_vers_max;
+ vers_min = sepol_policy_kern_vers_min;
+ policy_file_create = sepol_policy_file_create;
+ policy_file_free = sepol_policy_file_free;
+ policy_file_set_mem = sepol_policy_file_set_mem;
+ policydb_create = sepol_policydb_create;
+ policydb_free = sepol_policydb_free;
+ policydb_read = sepol_policydb_read;
+ policydb_set_vers = sepol_policydb_set_vers;
+ policydb_to_image = sepol_policydb_to_image;
+ genbools_array = sepol_genbools_array;
+ genusers = sepol_genusers;
+ genbools = sepol_genbools;
+
+#endif
+
+ if (usesepol) {
+ vers = vers_max();
+ minvers = vers_min();
+ }
+
search:
snprintf(path, sizeof(path), "%s.%d",
selinux_binary_policy_path(), vers);
fd = open(path, O_RDONLY);
while (fd < 0 && errno == ENOENT
- && --vers >= sepol_policy_kern_vers_min()) {
+ && --vers >= minvers) {
/* Check prior versions to see if old policy is available */
snprintf(path, sizeof(path), "%s.%d",
selinux_binary_policy_path(), vers);
fd = open(path, O_RDONLY);
}
if (fd < 0)
- return -1;
+ goto dlclose;
if (fstat(fd, &sb) < 0)
goto close;
@@ -79,71 +155,76 @@
if (map == MAP_FAILED)
goto close;
- if (vers > kernvers) {
+ if (vers > kernvers && usesepol) {
/* Need to downgrade to kernel-supported version. */
- if (sepol_policy_file_create(&pf))
+ if (policy_file_create(&pf))
goto unmap;
- if (sepol_policydb_create(&policydb)) {
- sepol_policy_file_free(pf);
+ if (policydb_create(&policydb)) {
+ policy_file_free(pf);
goto unmap;
}
- sepol_policy_file_set_mem(pf, data, size);
- if (sepol_policydb_read(policydb, pf)) {
- sepol_policy_file_free(pf);
- sepol_policydb_free(policydb);
+ policy_file_set_mem(pf, data, size);
+ if (policydb_read(policydb, pf)) {
+ policy_file_free(pf);
+ policydb_free(policydb);
goto unmap;
}
- if (sepol_policydb_set_vers(policydb, kernvers) ||
- sepol_policydb_to_image(NULL, policydb, &data, &size)) {
+ if (policydb_set_vers(policydb, kernvers) ||
+ policydb_to_image(NULL, policydb, &data, &size)) {
/* Downgrade failed, keep searching. */
- sepol_policy_file_free(pf);
- sepol_policydb_free(policydb);
+ policy_file_free(pf);
+ policydb_free(policydb);
munmap(map, sb.st_size);
close(fd);
vers--;
goto search;
}
- sepol_policy_file_free(pf);
- sepol_policydb_free(policydb);
+ policy_file_free(pf);
+ policydb_free(policydb);
}
- if (load_setlocaldefs) {
- void *olddata = data;
- size_t oldsize = size;
- rc = sepol_genusers(olddata, oldsize, selinux_users_path(),
- &data, &size);
- if (rc < 0) {
- /* Fall back to the prior image if genusers failed. */
- data = olddata;
- size = oldsize;
- rc = 0;
- } else {
- if (olddata != map)
- free(olddata);
+ if (usesepol) {
+ if (load_setlocaldefs) {
+ void *olddata = data;
+ size_t oldsize = size;
+ rc = genusers(olddata, oldsize, selinux_users_path(),
+ &data, &size);
+ if (rc < 0) {
+ /* Fall back to the prior image if genusers failed. */
+ data = olddata;
+ size = oldsize;
+ rc = 0;
+ } else {
+ if (olddata != map)
+ free(olddata);
+ }
}
- }
-
- if (preservebools) {
- rc = security_get_boolean_names(&names, &len);
- if (!rc) {
- values = malloc(sizeof(int) * len);
- if (!values)
- goto unmap;
- for (i = 0; i < len; i++)
- values[i] =
- security_get_boolean_active(names[i]);
- (void)sepol_genbools_array(data, size, names, values,
- len);
- free(values);
- for (i = 0; i < len; i++)
- free(names[i]);
- free(names);
+
+#ifndef DISABLE_BOOL
+ if (preservebools) {
+ rc = security_get_boolean_names(&names, &len);
+ if (!rc) {
+ values = malloc(sizeof(int) * len);
+ if (!values)
+ goto unmap;
+ for (i = 0; i < len; i++)
+ values[i] =
+ security_get_boolean_active(names[i]);
+ (void)genbools_array(data, size, names, values,
+ len);
+ free(values);
+ for (i = 0; i < len; i++)
+ free(names[i]);
+ free(names);
+ }
+ } else if (load_setlocaldefs) {
+ (void)genbools(data, size,
+ (char *)selinux_booleans_path());
}
- } else if (load_setlocaldefs) {
- (void)sepol_genbools(data, size,
- (char *)selinux_booleans_path());
+#endif
}
+
rc = security_load_policy(data, size);
unmap:
@@ -152,6 +233,13 @@
munmap(map, sb.st_size);
close:
close(fd);
+ dlclose:
+#ifdef SHARED
+ if (errormsg)
+ fprintf(stderr, "libselinux: %s\n", errormsg);
+ if (libsepolh)
+ dlclose(libsepolh);
+#endif
return rc;
}
Modified: trunk/libselinux/src/policy.h
===================================================================
--- trunk/libselinux/src/policy.h 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/src/policy.h 2007-05-31 20:57:45 UTC (rev 2454)
@@ -20,4 +20,6 @@
#define FILECONTEXTS "/etc/security/selinux/file_contexts"
+#define DEFAULT_POLICY_VERSION 15
+
#endif
Modified: trunk/libselinux/src/policyvers.c
===================================================================
--- trunk/libselinux/src/policyvers.c 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/src/policyvers.c 2007-05-31 20:57:45 UTC (rev 2454)
@@ -10,8 +10,6 @@
#include "dso.h"
#include <limits.h>
-#define DEFAULT_POLICY_VERSION 15
-
int security_policyvers(void)
{
int fd, ret;
Modified: trunk/libselinux/src/setrans_client.c
===================================================================
--- trunk/libselinux/src/setrans_client.c 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/src/setrans_client.c 2007-05-31 20:57:45 UTC (rev 2454)
@@ -1,4 +1,10 @@
-/* Copyright (c) 2006 Trusted Computer Solutions, Inc. */
+/* Copyright (c) 2006 Trusted Computer Solutions, Inc.
+ *
+ * Modified:
+ * Yuichi Nakamura <yn...@hi...>
+ - Stubs are used when DISABLE_SETRANS is defined,
+ it is to reduce size for such as embedded devices.
+*/
#include <sys/types.h>
#include <sys/socket.h>
@@ -16,6 +22,7 @@
#include "selinux_internal.h"
#include "setrans_internal.h"
+#ifndef DISABLE_SETRANS
static int mls_enabled = -1;
// Simple cache
@@ -290,3 +297,43 @@
}
hidden_def(selinux_raw_to_trans_context)
+#else /*DISABLE_SETRANS*/
+
+hidden void fini_context_translations(void)
+{
+}
+
+hidden int init_context_translations(void)
+{
+ return 0;
+}
+
+int selinux_trans_to_raw_context(security_context_t trans,
+ security_context_t * rawp)
+{
+ if (!trans) {
+ *rawp = NULL;
+ return 0;
+ }
+
+ *rawp = strdup(trans);
+
+ return *rawp ? 0 : -1;
+}
+
+hidden_def(selinux_trans_to_raw_context)
+
+int selinux_raw_to_trans_context(security_context_t raw,
+ security_context_t * transp)
+{
+ if (!raw) {
+ *transp = NULL;
+ return 0;
+ }
+ *transp = strdup(raw);
+
+ return *transp ? 0 : -1;
+}
+
+hidden_def(selinux_raw_to_trans_context)
+#endif /*DISABLE_SETRANS*/
Modified: trunk/libselinux/utils/Makefile
===================================================================
--- trunk/libselinux/utils/Makefile 2007-05-31 20:54:23 UTC (rev 2453)
+++ trunk/libselinux/utils/Makefile 2007-05-31 20:57:45 UTC (rev 2454)
@@ -4,10 +4,17 @@
BINDIR ?= $(PREFIX)/sbin
CFLAGS ?= -Wall
-override CFLAGS += -I../include -D_GNU_SOURCE
-LDLIBS += -L../src -lselinux -lsepol -L$(LIBDIR)
+override CFLAGS += -I../include -D_GNU_SOURCE $(EMFLAGS)
+LDLIBS += -L../src -lselinux -L$(LIBDIR)
TARGETS=$(patsubst %.c,%,$(wildcard *.c))
+ifeq ($(DISABLE_AVC),y)
+ UNUSED_TARGETS+=compute_av compute_create compute_member compute_relabel
+endif
+ifeq ($(DISABLE_BOOL),y)
+ UNUSED_TARGETS+=getsebool togglesebool
+endif
+TARGETS:= $(filter-out $(UNUSED_TARGETS), $(TARGETS))
all: $(TARGETS)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|