[packages/setools3] - saving setools 3.x parts discontinued in setools 4.x as setools3 - enhanced sepol patch to cover l

qboosh qboosh at pld-linux.org
Tue Jul 17 18:06:21 CEST 2018


commit 342fd9455ef1e692b56354c77f14a719fbf88c3f
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Tue Jul 17 18:08:13 2018 +0200

    - saving setools 3.x parts discontinued in setools 4.x as setools3
    - enhanced sepol patch to cover libsepol 2.8 (changes taken from setools 4.x libqpol code)
    - release 6

 setools-sepol.patch           | 475 ++++++++++++++++++++++++++++++++++++++++++
 setools.spec => setools3.spec |  74 +++----
 2 files changed, 513 insertions(+), 36 deletions(-)
---
diff --git a/setools.spec b/setools3.spec
similarity index 92%
rename from setools.spec
rename to setools3.spec
index a984201..97dba7d 100644
--- a/setools.spec
+++ b/setools3.spec
@@ -5,25 +5,25 @@
 #
 Summary:	Policy analysis tools for SELinux
 Summary(pl.UTF-8):	Narzędzia do analizy polityk SELinuksa
-Name:		setools
+Name:		setools3
 Version:	3.3.8
-Release:	5
+Release:	6
 License:	GPL v2+ (tools), LGPL v2.1+ (libraries)
 Group:		Applications/System
 #Source0Download: https://github.com/TresysTechnology/setools3/wiki/Download
-Source0:	https://raw.githubusercontent.com/wiki/TresysTechnology/setools3/files/dists/%{name}-%{version}/%{name}-%{version}.tar.bz2
+Source0:	https://raw.githubusercontent.com/wiki/TresysTechnology/setools3/files/dists/setools-%{version}/setools-%{version}.tar.bz2
 # Source0-md5:	d68d0d4e4da0f01da0f208782ff04b91
 Source1:	seaudit.pamd
-Patch0:		%{name}-swig.patch
-Patch1:		%{name}-sh.patch
-Patch2:		%{name}-tcl.patch
-Patch3:		%{name}-format.patch
-Patch4:		%{name}-swig-part2.patch
-Patch5:		%{name}-link.patch
-Patch6:		%{name}-x32.patch
-Patch7:		%{name}-swig-version.patch
-Patch8:		%{name}-sepol.patch
-Patch9:		%{name}-selinux.patch
+Patch0:		setools-swig.patch
+Patch1:		setools-sh.patch
+Patch2:		setools-tcl.patch
+Patch3:		setools-format.patch
+Patch4:		setools-swig-part2.patch
+Patch5:		setools-link.patch
+Patch6:		setools-x32.patch
+Patch7:		setools-swig-version.patch
+Patch8:		setools-sepol.patch
+Patch9:		setools-selinux.patch
 Patch10:	python-prefix.patch
 URL:		https://github.com/TresysTechnology/setools3/wiki
 BuildRequires:	autoconf >= 2.59
@@ -36,8 +36,8 @@ BuildRequires:	gtk+2-devel >= 2:2.8
 %{?with_java:BuildRequires:	jdk >= 1.2}
 BuildRequires:	libglade2-devel >= 2.0
 BuildRequires:	libselinux-devel >= 1.30
-BuildRequires:	libsepol-devel >= 2.4
-BuildRequires:	libsepol-static >= 2.4
+BuildRequires:	libsepol-devel >= 2.8
+BuildRequires:	libsepol-static >= 2.8
 BuildRequires:	libstdc++-devel
 BuildRequires:	libtool
 BuildRequires:	libxml2-devel >= 2
@@ -53,9 +53,10 @@ BuildRequires:	tcl-devel >= 8.4
 BuildRequires:	tk-devel >= 8.4
 Requires:	%{name}-libs = %{version}-%{release}
 Suggests:	policy-sources
+Obsoletes:	setools < 4
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
-%define		pkgdatadir	%{_datadir}/%{name}-3.3
+%define		pkgdatadir	%{_datadir}/setools-3.3
 
 # python modules use Py* symbols, some of .so files are versioned
 %define		skip_post_check_so	.*%{py_sitedir}/setools/.*
@@ -91,6 +92,7 @@ Requires:	%{name} = %{version}-%{release}
 Requires:	gtk+2 >= 2:2.8
 Requires:	tk >= 8.4
 Requires:	tk-BWidget >= 1.8
+Obsoletes:	setools-gui < 4
 
 %description gui
 SETools is a collection of graphical tools, command-line tools, and
@@ -116,8 +118,9 @@ Summary(pl.UTF-8):	Biblioteki wspierające analizę polityk SELinuksa
 License:	LGPL v2.1+
 Group:		Libraries
 Requires:	libselinux >= 2.4
-Requires:	libsepol >= 2.4
+Requires:	libsepol >= 2.8
 Requires:	sqlite3 >= 3.2.0
+Obsoletes:	setools-libs < 4
 
 %description libs
 SETools is a collection of graphical tools, command-line tools, and
@@ -148,6 +151,7 @@ Summary(pl.UTF-8):	Pliki nagłówkowe bibliotek SETools
 License:	LGPL v2.1+
 Group:		Development/Libraries
 Requires:	%{name}-libs = %{version}-%{release}
+Obsoletes:	setools-devel < 4
 
 %description devel
 Header files for SETools libraries: libapol, libpoldiff, libqpol,
@@ -163,6 +167,7 @@ Summary(pl.UTF-8):	Statyczne biblioteki SETools
 License:	LGPL v2.1+
 Group:		Development/Libraries
 Requires:	%{name}-devel = %{version}-%{release}
+Obsoletes:	setools-static < 4
 
 %description static
 Static SETools libraries.
@@ -201,14 +206,16 @@ Ten pakiet zawiera wiązania Javy do bibliotek uruchomieniowych:
   z plików logów
 - libsefs - kontekstów plików SELinuksa
 
-%package -n python-setools
+%package -n python-setools3
 Summary:	Python bindings for SELinux policy analysis libraries
 Summary(pl.UTF-8):	Wiązania Pythona do bibliotek analizy polityk SELinuksa
 License:	LGPL v2.1+ (core modules), GPL v2+ (seinfo and sesearch)
 Group:		Libraries/Python
 Requires:	%{name}-libs = %{version}-%{release}
+Requires:	python-setools >= 4
+Obsoletes:	python-setools < 4
 
-%description -n python-setools
+%description -n python-setools3
 SETools is a collection of graphical tools, command-line tools, and
 libraries designed to facilitate SELinux policy analysis.
 
@@ -219,7 +226,7 @@ This package includes Python bindings for the following libraries:
 - libseaudit: parse and filter SELinux audit messages in log files
 - libsefs: SELinux file contexts library
 
-%description -n python-setools -l pl.UTF-8
+%description -n python-setools3 -l pl.UTF-8
 SETools to zbiór narzędzi graficznych, narzędzi linii poleceń oraz
 bibliotek mających na celu ułatwienie analizy polityk SELinuksa.
 
@@ -263,7 +270,7 @@ Ten pakiet zawiera wiązania Tcl-a do bibliotek uruchomieniowych:
 - libsefs - kontekstów plików SELinuksa
 
 %prep
-%setup -q
+%setup -q -n setools-%{version}
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
@@ -301,9 +308,16 @@ install -d $RPM_BUILD_ROOT{%{_desktopdir},%{_pixmapsdir},/etc/pam.d}
 %{__make} install \
 	DESTDIR=$RPM_BUILD_ROOT
 
+# continued in setools 4.x
+%{__rm} $RPM_BUILD_ROOT%{_bindir}/{apol,sediff,seinfo,sesearch}
+%{__rm} $RPM_BUILD_ROOT%{_mandir}/man1/{apol,sediff,seinfo,sesearch}.1
+%if %{with python}
+%{__rm} $RPM_BUILD_ROOT%{py_sitedir}/setools/{_qpol.so*,qpol.py}
+%endif
+
 cp -p %{SOURCE1} $RPM_BUILD_ROOT/etc/pam.d/seaudit
-cp -p packages/rpm/*.desktop $RPM_BUILD_ROOT%{_desktopdir}
-cp -p apol/apol.png seaudit/seaudit.png sediff/sediffx.png $RPM_BUILD_ROOT%{_pixmapsdir}
+cp -p packages/rpm/{seaudit,sediffx}.desktop $RPM_BUILD_ROOT%{_desktopdir}
+cp -p seaudit/seaudit.png sediff/sediffx.png $RPM_BUILD_ROOT%{_pixmapsdir}
 
 # let rpm autodetect dependencies
 chmod 755 $RPM_BUILD_ROOT%{_libdir}/lib*.so* \
@@ -336,9 +350,6 @@ rm -rf $RPM_BUILD_ROOT
 %attr(755,root,root) %{_bindir}/replcon
 %attr(755,root,root) %{_bindir}/seaudit-report
 %attr(755,root,root) %{_bindir}/sechecker
-%attr(755,root,root) %{_bindir}/sediff
-%attr(755,root,root) %{_bindir}/seinfo
-%attr(755,root,root) %{_bindir}/sesearch
 %dir %{pkgdatadir}
 %{pkgdatadir}/sechecker-profiles
 %{pkgdatadir}/sechecker_help.txt
@@ -349,14 +360,10 @@ rm -rf $RPM_BUILD_ROOT
 %{_mandir}/man1/indexcon.1*
 %{_mandir}/man1/replcon.1*
 %{_mandir}/man1/sechecker.1*
-%{_mandir}/man1/sediff.1*
-%{_mandir}/man1/seinfo.1*
-%{_mandir}/man1/sesearch.1*
 %{_mandir}/man8/seaudit-report.8*
 
 %files gui
 %defattr(644,root,root,755)
-%attr(755,root,root) %{_bindir}/apol
 %attr(755,root,root) %{_bindir}/sediffx
 %attr(755,root,root) %{_sbindir}/seaudit
 %dir %{_libdir}/setools/apol_tcl
@@ -375,13 +382,10 @@ rm -rf $RPM_BUILD_ROOT
 %{pkgdatadir}/*.glade
 %{pkgdatadir}/*.png
 %config(noreplace) %verify(not md5 mtime size) /etc/pam.d/seaudit
-%{_desktopdir}/apol.desktop
 %{_desktopdir}/seaudit.desktop
 %{_desktopdir}/sediffx.desktop
-%{_pixmapsdir}/apol.png
 %{_pixmapsdir}/seaudit.png
 %{_pixmapsdir}/sediffx.png
-%{_mandir}/man1/apol.1*
 %{_mandir}/man1/sediffx.1*
 %{_mandir}/man8/seaudit.8*
 
@@ -451,12 +455,11 @@ rm -rf $RPM_BUILD_ROOT
 %endif
 
 %if %{with python}
-%files -n python-setools
+%files -n python-setools3
 %defattr(644,root,root,755)
 %dir %{py_sitedir}/setools
 %attr(755,root,root) %{py_sitedir}/setools/_apol.so*
 %attr(755,root,root) %{py_sitedir}/setools/_poldiff.so*
-%attr(755,root,root) %{py_sitedir}/setools/_qpol.so*
 %attr(755,root,root) %{py_sitedir}/setools/_seaudit.so*
 %attr(755,root,root) %{py_sitedir}/setools/_sefs.so*
 %attr(755,root,root) %{py_sitedir}/setools/_seinfo.so
@@ -464,7 +467,6 @@ rm -rf $RPM_BUILD_ROOT
 %{py_sitedir}/setools/__init__.py[co]
 %{py_sitedir}/setools/apol.py[co]
 %{py_sitedir}/setools/poldiff.py[co]
-%{py_sitedir}/setools/qpol.py[co]
 %{py_sitedir}/setools/seaudit.py[co]
 %{py_sitedir}/setools/sefs.py[co]
 %{py_sitedir}/setools-1.0-py*.egg-info
diff --git a/setools-sepol.patch b/setools-sepol.patch
index e39bd5f..93a3d27 100644
--- a/setools-sepol.patch
+++ b/setools-sepol.patch
@@ -62,3 +62,478 @@
  			if (tmp) {
  				tmp++; /* remove prepended space */
  				for (cur = 0; cur < perm_list_sz; cur++)
+--- setools-3.3.8/libqpol/src/mlsrule_query.c	2013-01-16 17:36:24.000000000 +0100
++++ setools-4.1.1/libqpol/mlsrule_query.c	2017-08-05 22:07:48.000000000 +0200
+@@ -36,7 +36,8 @@
+ 
+ typedef struct range_trans_state
+ {
+-	range_trans_t *head;
++    unsigned int bucket;
++    hashtab_ptr_t cur_item;
+ 	range_trans_t *cur;
+ } range_trans_state_t;
+ 
+@@ -55,8 +56,9 @@
+ static void *range_trans_state_get_cur(const qpol_iterator_t * iter)
+ {
+ 	range_trans_state_t *rs = NULL;
++    const policydb_t *db = NULL;
+ 
+-	if (!iter || !(rs = qpol_iterator_state(iter))) {
++	if (!iter || !(rs = qpol_iterator_state(iter)) || !(db = qpol_iterator_policy(iter))) {
+ 		errno = EINVAL;
+ 		return NULL;
+ 	}
+@@ -67,8 +69,9 @@
+ static int range_trans_state_next(qpol_iterator_t * iter)
+ {
+ 	range_trans_state_t *rs = NULL;
++    const policydb_t *db = NULL;
+ 
+-	if (!iter || !(rs = qpol_iterator_state(iter))) {
++	if (!iter || !(rs = qpol_iterator_state(iter))  || !(db = qpol_iterator_policy(iter))) {
+ 		errno = EINVAL;
+ 		return STATUS_ERR;
+ 	}
+@@ -78,7 +81,21 @@
+ 		return STATUS_ERR;
+ 	}
+ 
+-	rs->cur = rs->cur->next;
++    rs->cur_item = rs->cur_item->next;
++    while (rs->cur_item == NULL) {
++        rs->bucket++;
++        if (rs->bucket >= db->range_tr->size) {
++            break;
++        }
++
++        rs->cur_item = db->range_tr->htable[rs->bucket];
++    }
++
++    if (rs->cur_item == NULL) {
++        rs->cur = NULL;
++    } else {
++        rs->cur = (range_trans_t*)rs->cur_item->key;
++    }
+ 
+ 	return STATUS_SUCCESS;
+ }
+@@ -86,16 +103,23 @@
+ static size_t range_trans_state_size(const qpol_iterator_t * iter)
+ {
+ 	range_trans_state_t *rs = NULL;
++    const policydb_t *db = NULL;
+ 	size_t count = 0;
+-	range_trans_t *tmp = NULL;
++    unsigned int i = 0;
+ 
+-	if (!iter || !(rs = qpol_iterator_state(iter))) {
++	if (!iter || !(rs = qpol_iterator_state(iter)) || !(db = qpol_iterator_policy(iter))) {
+ 		errno = EINVAL;
+ 		return 0;
+ 	}
+ 
+-	for (tmp = rs->head; tmp; tmp = tmp->next)
+-		count++;
++    hashtab_ptr_t cur = NULL;
++    for (i = 0; i < db->range_tr->size; i++) {
++        cur = db->range_tr->htable[i];
++        while (cur != NULL) {
++            count++;
++            cur = cur->next;
++        }
++    }
+ 
+ 	return count;
+ }
+@@ -133,7 +157,24 @@
+ 		return STATUS_ERR;
+ 	}
+ 
+-	rs->head = rs->cur = db->range_tr;
++    rs->bucket = 0;
++    rs->cur_item = db->range_tr->htable[0];
++    rs->cur = NULL;
++
++    rs->cur_item = db->range_tr->htable[rs->bucket];
++    while (rs->cur_item == NULL) {
++        rs->bucket++;
++        if (rs->bucket >= db->range_tr->size) {
++            break;
++        }
++
++        rs->cur_item = db->range_tr->htable[rs->bucket];
++    }
++
++    if (rs->cur_item != NULL) {
++        rs->cur = (range_trans_t*)rs->cur_item->key;
++    }
++    
+ 	return STATUS_SUCCESS;
+ }
+ 
+@@ -208,7 +249,6 @@
+ 
+ int qpol_range_trans_get_range(const qpol_policy_t * policy, const qpol_range_trans_t * rule, const qpol_mls_range_t ** range)
+ {
+-	policydb_t *db = NULL;
+ 	range_trans_t *rt = NULL;
+ 
+ 	if (range) {
+@@ -221,10 +261,16 @@
+ 		return STATUS_ERR;
+ 	}
+ 
+-	db = &policy->p->p;
++    policydb_t *db = &policy->p->p;
+ 	rt = (range_trans_t *) rule;
++    mls_range_t *target_range = NULL;
++
++    target_range = hashtab_search(db->range_tr, (hashtab_key_t)rt);
++    if (target_range == NULL) {
++        return STATUS_ERR;
++    }
+ 
+-	*range = (qpol_mls_range_t *) & rt->target_range;
++	*range = (qpol_mls_range_t *)target_range;
+ 
+ 	return STATUS_SUCCESS;
+ }
+--- setools-3.3.8/libqpol/src/policy_define.c.orig	2018-07-17 17:29:40.264481696 +0200
++++ setools-3.3.8/libqpol/src/policy_define.c	2018-07-17 17:53:07.581132295 +0200
+@@ -45,8 +45,14 @@
+ #include <string.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
++#ifndef IPPROTO_DCCP
++#define IPPROTO_DCCP 33
++#endif
+ #include <arpa/inet.h>
+ #include <stdlib.h>
++#include <limits.h>
++#include <inttypes.h>
++#include <ctype.h>
+ 
+ #include <sepol/policydb/expand.h>
+ #include <sepol/policydb/policydb.h>
+@@ -54,18 +60,14 @@
+ #include <sepol/policydb/conditional.h>
+ #include <sepol/policydb/flask.h>
+ #include <sepol/policydb/hierarchy.h>
+-#ifdef HAVE_SEPOL_POLICYCAPS
+ #include <sepol/policydb/polcaps.h>
+-#endif
+-#ifdef HAVE_SEPOL_ERRCODES
+-#include <sepol/errcodes.h>
+-#endif
+-
+ #include "queue.h"
+-#include <qpol/policy.h>
+ #include "module_compiler.h"
+ #include "policy_define.h"
+ 
++/* Required for SETools libqpol - Removed #include "checkpolicy.h"*/
++#include <qpol/policy.h>
++
+ policydb_t *policydbp;
+ queue_t id_queue = 0;
+ unsigned int pass;
+@@ -78,8 +80,8 @@
+ extern unsigned long source_lineno;
+ extern unsigned int policydb_errors;
+ 
+-extern int yywarn(char *msg);
+-extern int yyerror(char *msg);
++extern int yywarn(const char *msg);
++extern int yyerror(const char *msg);
+ 
+ #define ERRORMSG_LEN 255
+ static char errormsg[ERRORMSG_LEN + 1] = { 0 };
+@@ -98,6 +100,7 @@
+ 	num_rules = 0;
+ }
+ 
++__attribute__ ((format(printf, 1, 2)))
+ void yyerror2(char *fmt, ...)
+ {
+ 	va_list ap;
+@@ -107,6 +110,7 @@
+ 	va_end(ap);
+ }
+ 
++/* Required for SETools libqpol */
+ int define_mls(void)
+ {
+ 	mlspol = 1;
+@@ -2243,12 +2247,13 @@
+ 	ebitmap_t e_tclasses;
+ 	ebitmap_node_t *snode, *tnode, *cnode;
+ 	filename_trans_t *ft;
++	filename_trans_datum_t *ftdatum;
+ 	filename_trans_rule_t *ftr;
+ 	class_datum_t *cladatum;
+ 	type_datum_t *typdatum;
+ 	uint32_t otype;
+ 	unsigned int c, s, t;
+-	int add;
++	int add, rc;
+ 
+ 	if (pass == 1) {
+ 		/* stype */
+@@ -2347,40 +2352,46 @@
+ 			ebitmap_for_each_bit(&e_ttypes, tnode, t) {
+ 				if (!ebitmap_node_get_bit(tnode, t))
+ 					continue;
+-	
+-				for (ft = policydbp->filename_trans; ft; ft = ft->next) {
+-					if (ft->stype == (s + 1) &&
+-					    ft->ttype == (t + 1) &&
+-					    ft->tclass == (c + 1) &&
+-					    !strcmp(ft->name, name)) {
+-						yyerror2("duplicate filename transition for: filename_trans %s %s %s:%s",
+-							 name, 
+-							 policydbp->p_type_val_to_name[s],
+-							 policydbp->p_type_val_to_name[t],
+-							 policydbp->p_class_val_to_name[c]);
+-						goto bad;
+-					}
+-				}
+-	
+-				ft = malloc(sizeof(*ft));
++
++				ft = calloc(1, sizeof(*ft));
+ 				if (!ft) {
+ 					yyerror("out of memory");
+ 					goto bad;
+ 				}
+-				memset(ft, 0, sizeof(*ft));
+-	
+-				ft->next = policydbp->filename_trans;
+-				policydbp->filename_trans = ft;
+-	
++				ft->stype = s + 1;
++				ft->ttype = t + 1;
++				ft->tclass = c + 1;
+ 				ft->name = strdup(name);
+ 				if (!ft->name) {
+ 					yyerror("out of memory");
+ 					goto bad;
+ 				}
+-				ft->stype = s + 1;
+-				ft->ttype = t + 1;
+-				ft->tclass = c + 1;
+-				ft->otype = otype;
++
++				ftdatum = hashtab_search(policydbp->filename_trans,
++							 (hashtab_key_t)ft);
++				if (ftdatum) {
++					yyerror2("duplicate filename transition for: filename_trans %s %s %s:%s",
++						 name,
++						 policydbp->p_type_val_to_name[s],
++						 policydbp->p_type_val_to_name[t],
++						 policydbp->p_class_val_to_name[c]);
++					goto bad;
++				}
++
++				ftdatum = calloc(1, sizeof(*ftdatum));
++				if (!ftdatum) {
++					yyerror("out of memory");
++					goto bad;
++				}
++				ftdatum->otype = otype;
++	
++				rc = hashtab_insert(policydbp->filename_trans,
++						    (hashtab_key_t)ft,
++						    ftdatum);
++				if (rc) {
++					yyerror("out of memory");
++					goto bad;
++				}
+ 			}
+ 		}
+ 	
+@@ -2394,8 +2405,14 @@
+ 		append_filename_trans(ftr);
+ 
+ 		ftr->name = strdup(name);
+-		ftr->stypes = stypes;
+-		ftr->ttypes = ttypes;
++		if (type_set_cpy(&ftr->stypes, &stypes)) {
++			yyerror("out of memory");
++			goto bad;
++		}
++		if (type_set_cpy(&ftr->ttypes, &ttypes)) {
++			yyerror("out of memory");
++			goto bad;
++		}
+ 		ftr->tclass = c + 1;
+ 		ftr->otype = otype;
+ 	}
+@@ -3703,7 +3720,7 @@
+ 	newc->u.iomem.high_iomem = high;
+ 
+ 	if (low > high) {
+-		yyerror2("low memory 0x%x exceeds high memory 0x%x", low, high);
++		yyerror2("low memory 0x%lx exceeds high memory 0x%lx", low, high);
+ 		free(newc);
+ 		return -1;
+ 	}
+@@ -3715,12 +3732,14 @@
+ 
+ 	head = policydbp->ocontexts[OCON_XEN_IOMEM];
+ 	for (l = NULL, c = head; c; l = c, c = c->next) {
+-		unsigned int low2, high2;
++		unsigned long low2, high2;
+ 
+ 		low2 = c->u.iomem.low_iomem;
+ 		high2 = c->u.iomem.high_iomem;
+ 		if (low <= high2 && low2 <= high) {
+-			yyerror2("iomemcon entry for 0x%x-0x%x overlaps with " "earlier entry 0x%x-0x%x", low, high, low2, high2);
++			yyerror2("iomemcon entry for 0x%lx-0x%lx overlaps with "
++				"earlier entry 0x%lx-0x%lx", low, high,
++				low2, high2);
+ 			goto bad;
+ 		}
+ 	}
+@@ -3770,7 +3789,7 @@
+ 	newc->u.ioport.high_ioport = high;
+ 
+ 	if (low > high) {
+-		yyerror2("low ioport 0x%x exceeds high ioport 0x%x", low, high);
++		yyerror2("low ioport 0x%lx exceeds high ioport 0x%lx", low, high);
+ 		free(newc);
+ 		return -1;
+ 	}
+@@ -3787,7 +3806,9 @@
+ 		low2 = c->u.ioport.low_ioport;
+ 		high2 = c->u.ioport.high_ioport;
+ 		if (low <= high2 && low2 <= high) {
+-			yyerror2("ioportcon entry for 0x%x-0x%x overlaps with" "earlier entry 0x%x-0x%x", low, high, low2, high2);
++			yyerror2("ioportcon entry for 0x%lx-0x%lx overlaps with"
++				"earlier entry 0x%x-0x%x", low, high,
++				low2, high2);
+ 			goto bad;
+ 		}
+ 	}
+@@ -3846,7 +3867,8 @@
+ 
+ 		device2 = c->u.device;
+ 		if (device == device2) {
+-			yyerror2("duplicate pcidevicecon entry for 0x%x ", device);
++			yyerror2("duplicate pcidevicecon entry for 0x%lx",
++				 device);
+ 			goto bad;
+ 		}
+ 	}
+--- setools-3.3.8/libqpol/src/ftrule_query.c	2013-01-16 17:36:24.000000000 +0100
++++ setools-4.1.1/libqpol/ftrule_query.c	2017-08-05 22:07:48.000000000 +0200
+@@ -29,10 +29,12 @@
+ #include "iterator_internal.h"
+ #include "qpol_internal.h"
+ #include <sepol/policydb/policydb.h>
++#include <sepol/policydb/hashtab.h>
+ 
+ typedef struct filename_trans_state
+ {
+-	filename_trans_t *head;
++	unsigned int bucket;
++	hashtab_ptr_t cur_item;
+ 	filename_trans_t *cur;
+ } filename_trans_state_t;
+ 
+@@ -76,7 +78,21 @@
+ 		return STATUS_ERR;
+ 	}
+ 
+-	fts->cur = fts->cur->next;
++	fts->cur_item = fts->cur_item->next;
++	while (fts->cur_item == NULL) {
++		fts->bucket++;
++		if (fts->bucket >= db->filename_trans->size) {
++            break;
++		}
++
++		fts->cur_item = db->filename_trans->htable[fts->bucket];
++	}
++
++    if (fts->cur_item == NULL) {
++        fts->cur = NULL;
++    } else {
++        fts->cur = (filename_trans_t*)fts->cur_item->key;
++    }
+ 
+ 	return STATUS_SUCCESS;
+ }
+@@ -85,16 +101,22 @@
+ {
+ 	filename_trans_state_t *fts = NULL;
+ 	const policydb_t *db = NULL;
+-	filename_trans_t *tmp = NULL;
+ 	size_t count = 0;
++    unsigned int i = 0;
+ 
+ 	if (!iter || !(fts = qpol_iterator_state(iter)) || !(db = qpol_iterator_policy(iter))) {
+ 		errno = EINVAL;
+-		return STATUS_ERR;
++		return 0;
+ 	}
+ 
+-	for (tmp = fts->head; tmp; tmp = tmp->next)
+-		count++;
++	hashtab_ptr_t cur = NULL;
++	for (i = 0; i < db->filename_trans->size; i++) {
++		cur = db->filename_trans->htable[i];
++		while (cur != NULL) {
++			count++;
++			cur = cur->next;
++		}
++	}
+ 
+ 	return count;
+ }
+@@ -122,8 +144,25 @@
+ 		ERR(policy, "%s", strerror(errno));
+ 		return STATUS_ERR;
+ 	}
+-	fts->head = fts->cur = db->filename_trans;
+ 
++	fts->bucket = 0;
++	fts->cur_item = db->filename_trans->htable[0];
++	fts->cur = NULL;
++
++	fts->cur_item = db->filename_trans->htable[fts->bucket];
++	while (fts->cur_item == NULL) {
++		fts->bucket++;
++		if (fts->bucket >= db->filename_trans->size) {
++			break;
++		}
++
++		fts->cur_item = db->filename_trans->htable[fts->bucket];
++	}
++
++	if (fts->cur_item != NULL) {
++		fts->cur = (filename_trans_t*)fts->cur_item->key;
++	}
++	
+ 	if (qpol_iterator_create
+ 	    (policy, (void *)fts, filename_trans_state_get_cur, filename_trans_state_next, filename_trans_state_end, filename_trans_state_size,
+ 	     free, iter)) {
+@@ -224,7 +263,16 @@
+ 	db = &policy->p->p;
+ 	ft = (filename_trans_t *) rule;
+ 
+-	*dflt = (qpol_type_t *) db->type_val_to_struct[ft->otype - 1];
++	/* Since the filename_trans rules were converted to being stored in a hashtab, otype was moved to the datum of the hashtab.
++	 * So we just look it up here.
++	 */
++	filename_trans_datum_t *datum = hashtab_search(db->filename_trans, (hashtab_key_t)ft);
++
++	if (datum == NULL) {
++		return STATUS_ERR;
++	}
++
++	*dflt = (qpol_type_t *) db->type_val_to_struct[datum->otype - 1];
+ 
+ 	return STATUS_SUCCESS;
+ }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/setools3.git/commitdiff/342fd9455ef1e692b56354c77f14a719fbf88c3f



More information about the pld-cvs-commit mailing list