You've already forked KernelSU
mirror of
https://github.com/tiann/KernelSU.git
synced 2025-08-27 23:46:34 +00:00
compile success for libsepl in kernel
This commit is contained in:
@@ -5,6 +5,7 @@ obj-y += module_api.o
|
|||||||
obj-y += sucompat.o
|
obj-y += sucompat.o
|
||||||
|
|
||||||
obj-y += selinux/
|
obj-y += selinux/
|
||||||
|
obj-y += libsepol/
|
||||||
|
|
||||||
EXPECTED_SIZE := 0x033b
|
EXPECTED_SIZE := 0x033b
|
||||||
EXPECTED_HASH := 0xb0b91415
|
EXPECTED_HASH := 0xb0b91415
|
||||||
|
|||||||
BIN
kernel/libsepol/.DS_Store
vendored
Normal file
BIN
kernel/libsepol/.DS_Store
vendored
Normal file
Binary file not shown.
7
kernel/libsepol/.gitignore
vendored
Normal file
7
kernel/libsepol/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
utils/chkcon
|
||||||
|
utils/sepol_check_access
|
||||||
|
utils/sepol_compute_av
|
||||||
|
utils/sepol_compute_member
|
||||||
|
utils/sepol_compute_relabel
|
||||||
|
utils/sepol_validate_transition
|
||||||
|
libsepol.map
|
||||||
504
kernel/libsepol/COPYING
Normal file
504
kernel/libsepol/COPYING
Normal file
@@ -0,0 +1,504 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 2.1, February 1999
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
specially designated software packages--typically libraries--of the
|
||||||
|
Free Software Foundation and other authors who decide to use it. You
|
||||||
|
can use it too, but we suggest you first think carefully about whether
|
||||||
|
this license or the ordinary General Public License is the better
|
||||||
|
strategy to use in any particular case, based on the explanations below.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom of use,
|
||||||
|
not price. Our General Public Licenses are designed to make sure that
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
libraries. However, the Lesser license provides advantages in certain
|
||||||
|
special circumstances.
|
||||||
|
|
||||||
|
For example, on rare occasions, there may be a special need to
|
||||||
|
encourage the widest possible use of a certain library, so that it becomes
|
||||||
|
a de-facto standard. To achieve this, non-free programs must be
|
||||||
|
allowed to use the library. A more frequent case is that a free
|
||||||
|
library does the same job as widely used non-free libraries. In this
|
||||||
|
case, there is little to gain by limiting the free library to free
|
||||||
|
software only, so we use the Lesser General Public License.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
the user installs one, as long as the modified version is
|
||||||
|
interface-compatible with the version that the work was made with.
|
||||||
|
|
||||||
|
c) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply,
|
||||||
|
and the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License may add
|
||||||
|
an explicit geographical distribution limitation excluding those countries,
|
||||||
|
so that distribution is permitted only in or among countries not thus
|
||||||
|
excluded. In such case, this License incorporates the limitation as if
|
||||||
|
written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
possible use to the public, we recommend making it free software that
|
||||||
|
everyone can redistribute and change. You can do so by permitting
|
||||||
|
redistribution under these terms (or, alternatively, under the terms of the
|
||||||
|
ordinary General Public License).
|
||||||
|
|
||||||
|
To apply these terms, attach the following notices to the library. It is
|
||||||
|
safest to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least the
|
||||||
|
"copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the library's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
|
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1990
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
That's all there is to it!
|
||||||
|
|
||||||
|
|
||||||
48
kernel/libsepol/Makefile
Normal file
48
kernel/libsepol/Makefile
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
obj-y += src/assertion.o
|
||||||
|
obj-y += src/avrule_block.o
|
||||||
|
obj-y += src/avtab.o
|
||||||
|
obj-y += src/boolean_record.o
|
||||||
|
obj-y += src/booleans.o
|
||||||
|
obj-y += src/conditional.o
|
||||||
|
obj-y += src/constraint.o
|
||||||
|
obj-y += src/context.o
|
||||||
|
obj-y += src/context_record.o
|
||||||
|
obj-y += src/debug.o
|
||||||
|
obj-y += src/ebitmap.o
|
||||||
|
obj-y += src/expand.o
|
||||||
|
obj-y += src/handle.o
|
||||||
|
obj-y += src/hashtab.o
|
||||||
|
obj-y += src/hierarchy.o
|
||||||
|
# obj-y += src/ibendport_record.o
|
||||||
|
# obj-y += src/ibendports.o
|
||||||
|
# obj-y += src/ibpkey_record.o
|
||||||
|
# obj-y += src/ibpkeys.o
|
||||||
|
# obj-y += src/iface_record.o
|
||||||
|
# obj-y += src/interfaces.o
|
||||||
|
# obj-y += src/kernel_to_cil.o
|
||||||
|
# obj-y += src/kernel_to_common.o
|
||||||
|
# obj-y += src/kernel_to_conf.o
|
||||||
|
obj-y += src/link.o
|
||||||
|
obj-y += src/mls.o
|
||||||
|
obj-y += src/module.o
|
||||||
|
# obj-y += src/module_to_cil.o
|
||||||
|
obj-y += src/node_record.o
|
||||||
|
obj-y += src/nodes.o
|
||||||
|
obj-y += src/optimize.o
|
||||||
|
obj-y += src/polcaps.o
|
||||||
|
obj-y += src/policydb.o
|
||||||
|
obj-y += src/policydb_convert.o
|
||||||
|
obj-y += src/policydb_public.o
|
||||||
|
obj-y += src/policydb_validate.o
|
||||||
|
obj-y += src/port_record.o
|
||||||
|
obj-y += src/ports.o
|
||||||
|
obj-y += src/services.o
|
||||||
|
obj-y += src/sidtab.o
|
||||||
|
obj-y += src/symtab.o
|
||||||
|
obj-y += src/user_record.o
|
||||||
|
obj-y += src/users.o
|
||||||
|
obj-y += src/util.o
|
||||||
|
obj-y += src/write.o
|
||||||
|
obj-y += src/inet_ntop.o
|
||||||
|
|
||||||
|
ccflags-y += -I $(srctree)/$(src)/include
|
||||||
1
kernel/libsepol/VERSION
Normal file
1
kernel/libsepol/VERSION
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3.4
|
||||||
BIN
kernel/libsepol/cil/.DS_Store
vendored
Normal file
BIN
kernel/libsepol/cil/.DS_Store
vendored
Normal file
Binary file not shown.
14
kernel/libsepol/cil/.gitignore
vendored
Normal file
14
kernel/libsepol/cil/.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
*.swp
|
||||||
|
*.gcda
|
||||||
|
*.gcno
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
src/cil_lexer.c
|
||||||
|
unit_tests
|
||||||
|
cov
|
||||||
|
secilc
|
||||||
|
docs/pdf/
|
||||||
|
docs/html/
|
||||||
|
docs/man8/
|
||||||
|
policy.*
|
||||||
|
file_contexts
|
||||||
86
kernel/libsepol/cil/include/cil/cil.h
Normal file
86
kernel/libsepol/cil/include/cil/cil.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_H_
|
||||||
|
#define CIL_H_
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct cil_db;
|
||||||
|
typedef struct cil_db cil_db_t;
|
||||||
|
|
||||||
|
extern void cil_db_init(cil_db_t **db);
|
||||||
|
extern void cil_db_destroy(cil_db_t **db);
|
||||||
|
|
||||||
|
extern int cil_add_file(cil_db_t *db, const char *name, const char *data, size_t size);
|
||||||
|
|
||||||
|
extern int cil_compile(cil_db_t *db);
|
||||||
|
extern int cil_build_policydb(cil_db_t *db, sepol_policydb_t **sepol_db);
|
||||||
|
extern int cil_userprefixes_to_string(cil_db_t *db, char **out, size_t *size);
|
||||||
|
extern int cil_selinuxusers_to_string(cil_db_t *db, char **out, size_t *size);
|
||||||
|
extern int cil_filecons_to_string(cil_db_t *db, char **out, size_t *size);
|
||||||
|
extern void cil_set_disable_dontaudit(cil_db_t *db, int disable_dontaudit);
|
||||||
|
extern void cil_set_multiple_decls(cil_db_t *db, int multiple_decls);
|
||||||
|
extern void cil_set_qualified_names(struct cil_db *db, int qualified_names);
|
||||||
|
extern void cil_set_disable_neverallow(cil_db_t *db, int disable_neverallow);
|
||||||
|
extern void cil_set_preserve_tunables(cil_db_t *db, int preserve_tunables);
|
||||||
|
extern int cil_set_handle_unknown(cil_db_t *db, int handle_unknown);
|
||||||
|
extern void cil_set_mls(cil_db_t *db, int mls);
|
||||||
|
extern void cil_set_attrs_expand_generated(struct cil_db *db, int attrs_expand_generated);
|
||||||
|
extern void cil_set_attrs_expand_size(struct cil_db *db, unsigned attrs_expand_size);
|
||||||
|
extern void cil_set_target_platform(cil_db_t *db, int target_platform);
|
||||||
|
extern void cil_set_policy_version(cil_db_t *db, int policy_version);
|
||||||
|
extern void cil_write_policy_conf(FILE *out, struct cil_db *db);
|
||||||
|
extern int cil_write_parse_ast(FILE *out, cil_db_t *db);
|
||||||
|
extern int cil_write_build_ast(FILE *out, cil_db_t *db);
|
||||||
|
extern int cil_write_resolve_ast(FILE *out, cil_db_t *db);
|
||||||
|
|
||||||
|
enum cil_log_level {
|
||||||
|
CIL_ERR = 1,
|
||||||
|
CIL_WARN,
|
||||||
|
CIL_INFO
|
||||||
|
};
|
||||||
|
extern void cil_set_log_level(enum cil_log_level lvl);
|
||||||
|
extern void cil_set_log_handler(void (*handler)(int lvl, const char *msg));
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__ ((format(printf, 2, 3)))
|
||||||
|
#endif
|
||||||
|
extern void cil_log(enum cil_log_level lvl, const char *msg, ...);
|
||||||
|
|
||||||
|
extern void cil_set_malloc_error_handler(void (*handler)(void));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
2906
kernel/libsepol/cil/src/cil.c
Normal file
2906
kernel/libsepol/cil/src/cil.c
Normal file
File diff suppressed because it is too large
Load Diff
5217
kernel/libsepol/cil/src/cil_binary.c
Normal file
5217
kernel/libsepol/cil/src/cil_binary.c
Normal file
File diff suppressed because it is too large
Load Diff
477
kernel/libsepol/cil/src/cil_binary.h
Normal file
477
kernel/libsepol/cil/src/cil_binary.h
Normal file
@@ -0,0 +1,477 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CIL_BINARY_H_
|
||||||
|
#define _CIL_BINARY_H_
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a binary policydb from the cil db.
|
||||||
|
*
|
||||||
|
* @param[in] db The cil database.
|
||||||
|
* @param[in] pdb The policy database.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_binary_create(const struct cil_db *db, sepol_policydb_t **pdb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a pre allocated binary policydb from the cil db.
|
||||||
|
*
|
||||||
|
* It is assumed that pdb has been allocated and initialized so that fields such
|
||||||
|
* as policy type and version are set appropriately. It is recommended that
|
||||||
|
* instead of calling this, one instead calls cil_binary_create, which will
|
||||||
|
* properly allocate and initialize the pdb and then calls this function. This
|
||||||
|
* function is used to maintain binary backwards compatibility.
|
||||||
|
*
|
||||||
|
* @param[in] db The cil database.
|
||||||
|
* @param[in] pdb The policy database.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_binary_create_allocated_pdb(const struct cil_db *db, sepol_policydb_t *pdb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil common structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the common into.
|
||||||
|
* @param[in] datum The cil_common datum.
|
||||||
|
* @param[out] common_out The sepol common to send back.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_common_to_policydb(policydb_t *pdb, struct cil_class *cil_common, common_datum_t **common_out);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil class structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the class into.
|
||||||
|
* @param[in] datum The cil_class datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_class_to_policydb(policydb_t *pdb, struct cil_class *cil_class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil role structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the role into.
|
||||||
|
* @param[in] datum The cil_role datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_role_to_policydb(policydb_t *pdb, struct cil_role *cil_role);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil roletype structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the roletype into.
|
||||||
|
* @param[in] db The cil database
|
||||||
|
* @param[in] datum The cil_roletype datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR otherwise.
|
||||||
|
*/
|
||||||
|
int cil_roletype_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_role *role);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil type structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the type into.
|
||||||
|
* @param[in] datum The cil_type datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_type_to_policydb(policydb_t *pdb, struct cil_type *cil_type, void *type_value_to_cil[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil typealias structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the typealias into.
|
||||||
|
* @param[in] datum The cil_typealias datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_typealias_to_policydb(policydb_t *pdb, struct cil_alias *cil_alias);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil typepermissive structure into sepol policydb.
|
||||||
|
* The function looks up the previously inserted type and flips the bit
|
||||||
|
* in the permssive types bitmap that corresponds to that type's value.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the typepermissive into.
|
||||||
|
* @param[in] datum The cil_typepermissive datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_typepermissive_to_policydb(policydb_t *pdb, struct cil_typepermissive *cil_typeperm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil attribute structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the attribute into.
|
||||||
|
* @param[in] datum The cil_attribute datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_typeattribute_to_policydb(policydb_t *pdb, struct cil_typeattribute *cil_attr, void *type_value_to_cil[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil attribute structure into sepol type->attribute bitmap.
|
||||||
|
* The function calls helper functions to loop over the attributes lists
|
||||||
|
* of types and negative types. If either of the lists contain an attribute,
|
||||||
|
* the helper functions will recurse into the attribute and record the
|
||||||
|
* attribute's types and negative types. There is no minimum depth.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database that contains the type->attribute bitmap.
|
||||||
|
* @param[in] db The cil database
|
||||||
|
* @param[in] node The tree node that contains the cil_attribute.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_typeattribute_to_bitmap(policydb_t *pdb, const struct cil_db *cdb, struct cil_typeattribute *cil_attr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil policycap structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the policycap into.
|
||||||
|
* @param[in] node The tree node that contains the cil_policycap.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR upon error.
|
||||||
|
*/
|
||||||
|
int cil_policycap_to_policydb(policydb_t *pdb, struct cil_policycap *cil_polcap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil user structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb THe policy database to insert the user into.
|
||||||
|
* @param[in] node The tree node that contains the cil_user.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_user_to_policydb(policydb_t *pdb, struct cil_user *cil_user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil userrole structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the userrole into.
|
||||||
|
* @param[in] db The cil database
|
||||||
|
* @param[in] datum The cil_user
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR otherwise.
|
||||||
|
*/
|
||||||
|
int cil_userrole_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_user *user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil bool structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb THe policy database to insert the bool into.
|
||||||
|
* @param[in] datum The cil_bool datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_bool_to_policydb(policydb_t *pdb, struct cil_bool *cil_bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert all ordered cil category structures into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the categories into.
|
||||||
|
* @param[in] db The cil database that contains the category order list.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_catorder_to_policydb(policydb_t *pdb, const struct cil_db *db);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil category alias structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the category alias into.
|
||||||
|
* @param[in] datum The cil_catalias datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_catalias_to_policydb(policydb_t *pdb, struct cil_alias *cil_alias);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert the cil sensitivityorder into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the sensitivityorder into.
|
||||||
|
* @param[in] db the cil database that contains the sensitivityorder list.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_sensitivityorder_to_policydb(policydb_t *pdb, const struct cil_db *db);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil type rule structure into sepol policydb. This includes
|
||||||
|
* typetransition, typechange, and typemember.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the type rule into.
|
||||||
|
* @param[in] datum The cil_type_rule datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_type_rule_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_type_rule *cil_rule);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil avrule structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the avrule into.
|
||||||
|
* @param[in] datum The cil_avrule datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_avrule_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_avrule *cil_avrule);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil booleanif structure into sepol policydb. This populates the
|
||||||
|
* policydb conditional list. Each conditional node contains an expression
|
||||||
|
* and true/false avtab_ptr lists that point into te_cond_avtab.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the booleanif into.
|
||||||
|
* @param[in] node The cil_booleanif node.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_booleanif_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_tree_node *node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil role transition structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the role transition into.
|
||||||
|
* @param[in] datum The cil_role_trans datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR upon error.
|
||||||
|
*/
|
||||||
|
int cil_roletrans_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_roletransition *roletrans, hashtab_t role_trans_table);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil role allow structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the role allow into.
|
||||||
|
* @param[in] datum The cil_role_allow datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR upon error.
|
||||||
|
*/
|
||||||
|
int cil_roleallow_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_roleallow *roleallow);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil file transition structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the file transition into.
|
||||||
|
* @param[in] datum The cil_nametypetransition datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR upon error.
|
||||||
|
*/
|
||||||
|
int cil_typetransition_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_nametypetransition *typetrans);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil constrain/mlsconstrain structure(s) into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the (mls)constrain into.
|
||||||
|
* @param[in] datum The cil_(mls)constrain datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR upon error.
|
||||||
|
*/
|
||||||
|
int cil_constrain_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_constrain *cil_constrain);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define sepol level.
|
||||||
|
* Associates the sepol level (sensitivity) with categories.
|
||||||
|
* Looks at the cil_sens structure for a list of cil_cats to
|
||||||
|
* associate the sensitivity with.
|
||||||
|
* Sets the sepol level as defined in the sepol policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database that holds the sepol level.
|
||||||
|
* @param[in] datum The cil_sens datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or SEPOL_ERR upon error.
|
||||||
|
*/
|
||||||
|
int cil_sepol_level_define(policydb_t *pdb, struct cil_sens *cil_sens);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil rangetransition structure into sepol policydb.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the rangetransition into.
|
||||||
|
* @param[in] datum The cil_rangetransition datum.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_rangetransition_to_policydb(policydb_t *pdb, const struct cil_db *db, struct cil_rangetransition *rangetrans);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil ibpkeycon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted ibpkeycons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the ibpkeycon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted ibpkeycons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_ibpkeycon_to_policydb(policydb_t *pdb, struct cil_sort *ibpkeycons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil idbev structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted ibendportcons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the pkeycon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted ibendportcons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_ibendportcon_to_policydb(policydb_t *pdb, struct cil_sort *pkeycons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil portcon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted portcons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the portcon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted portcons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_portcon_to_policydb(policydb_t *pdb, struct cil_sort *portcons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil netifcon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted netifcons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the netifcon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted netifcons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_netifcon_to_policydb(policydb_t *pdb, struct cil_sort *netifcons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil nodecon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted nodecons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the nodecon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted nodecons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_nodecon_to_policydb(policydb_t *pdb, struct cil_sort *nodecons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil fsuse structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted fsuses and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the fsuse into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted fsuses.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_fsuse_to_policydb(policydb_t *pdb, struct cil_sort *fsuses);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil genfscon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted genfscons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the genfscon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted genfscons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_genfscon_to_policydb(policydb_t *pdb, struct cil_sort *genfscons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil pirqcon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted pirqcons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the pirqcon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted pirqcons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_pirqcon_to_policydb(policydb_t *pdb, struct cil_sort *pirqcons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil iomemcon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted iomemcons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the iomemcon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted iomemcons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_iomemcon_to_policydb(policydb_t *pdb, struct cil_sort *iomemcons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil ioportcon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted ioportcons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the ioportcon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted ioportcons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_ioportcon_to_policydb(policydb_t *pdb, struct cil_sort *ioportcons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert cil pcidevicecon structure into sepol policydb.
|
||||||
|
* The function is given a structure containing the sorted pcidevicecons and
|
||||||
|
* loops over this structure inserting them into the policy database.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to insert the pcidevicecon into.
|
||||||
|
* @param[in] node The cil_sort structure that contains the sorted pcidevicecons.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_pcidevicecon_to_policydb(policydb_t *pdb, struct cil_sort *pcidevicecons);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an mls level using a cil level.
|
||||||
|
* The function is given a structure containing the a cil_level and
|
||||||
|
* outputs a created mls_level_t.
|
||||||
|
*
|
||||||
|
* @param[in] pdb The policy database to use to get sepol level from cil_level's sensitivity.
|
||||||
|
* @param[in] cil_level The cil_level that will be used to create an mls_level_t.
|
||||||
|
* @param[out] mls_level The mls_level that is created.
|
||||||
|
*
|
||||||
|
* @return SEPOL_OK upon success or an error otherwise.
|
||||||
|
*/
|
||||||
|
int cil_level_to_mls_level(policydb_t *pdb, struct cil_level *cil_level, mls_level_t *mls_level);
|
||||||
|
|
||||||
|
#endif //_CIL_BINARY_H_
|
||||||
6623
kernel/libsepol/cil/src/cil_build_ast.c
Normal file
6623
kernel/libsepol/cil/src/cil_build_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
239
kernel/libsepol/cil/src/cil_build_ast.h
Normal file
239
kernel/libsepol/cil/src/cil_build_ast.h
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_BUILD_AST_H_
|
||||||
|
#define CIL_BUILD_AST_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
|
||||||
|
int cil_add_decl_to_symtab(struct cil_db *db, symtab_t *symtab, hashtab_key_t key, struct cil_symtab_datum *datum, struct cil_tree_node *node);
|
||||||
|
|
||||||
|
int cil_gen_node(struct cil_db *db, struct cil_tree_node *ast_node, struct cil_symtab_datum *datum, hashtab_key_t key, enum cil_sym_index sflavor, enum cil_flavor nflavor);
|
||||||
|
int cil_parse_to_list(struct cil_tree_node *parse_cl_head, struct cil_list *ast_cl, enum cil_flavor flavor);
|
||||||
|
|
||||||
|
int cil_gen_block(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, uint16_t is_abstract);
|
||||||
|
void cil_destroy_block(struct cil_block *block);
|
||||||
|
int cil_gen_blockinherit(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_blockinherit(struct cil_blockinherit *inherit);
|
||||||
|
int cil_gen_blockabstract(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_blockabstract(struct cil_blockabstract *abstract);
|
||||||
|
int cil_gen_in(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_in(struct cil_in *in);
|
||||||
|
int cil_gen_class(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_class(struct cil_class *class);
|
||||||
|
int cil_gen_classorder(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_classorder(struct cil_classorder *classorder);
|
||||||
|
int cil_gen_perm(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor, unsigned int *num_perms);
|
||||||
|
void cil_destroy_perm(struct cil_perm *perm);
|
||||||
|
int cil_gen_perm_nodes(struct cil_db *db, struct cil_tree_node *current_perm, struct cil_tree_node *ast_node, enum cil_flavor flavor, unsigned int *num_perms);
|
||||||
|
int cil_fill_perms(struct cil_tree_node *start_perm, struct cil_list **perm_strs);
|
||||||
|
int cil_fill_classperms(struct cil_tree_node *parse_current, struct cil_classperms **cp);
|
||||||
|
void cil_destroy_classperms(struct cil_classperms *cp);
|
||||||
|
void cil_fill_classperms_set(struct cil_tree_node *parse_current, struct cil_classperms_set **cp_set);
|
||||||
|
void cil_destroy_classperms_set(struct cil_classperms_set *cp_set);
|
||||||
|
int cil_fill_classperms_list(struct cil_tree_node *parse_current, struct cil_list **expr_list);
|
||||||
|
void cil_destroy_classperms_list(struct cil_list **cp_list);
|
||||||
|
int cil_gen_classpermission(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_classpermission(struct cil_classpermission *cp);
|
||||||
|
int cil_gen_classpermissionset(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_classpermissionset(struct cil_classpermissionset *cps);
|
||||||
|
int cil_gen_map_class(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
int cil_gen_classmapping(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_classmapping(struct cil_classmapping *mapping);
|
||||||
|
int cil_gen_common(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
int cil_gen_classcommon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_classcommon(struct cil_classcommon *clscom);
|
||||||
|
int cil_gen_sid(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_sid(struct cil_sid *sid);
|
||||||
|
int cil_gen_sidcontext(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_sidcontext(struct cil_sidcontext *sidcon);
|
||||||
|
int cil_gen_sidorder(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_sidorder(struct cil_sidorder *sidorder);
|
||||||
|
int cil_gen_user(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_user(struct cil_user *user);
|
||||||
|
int cil_gen_userattribute(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_userattribute(struct cil_userattribute *attr);
|
||||||
|
int cil_gen_userattributeset(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_userattributeset(struct cil_userattributeset *attrset);
|
||||||
|
int cil_gen_userlevel(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_userlevel(struct cil_userlevel *usrlvl);
|
||||||
|
int cil_gen_userrange(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_userrange(struct cil_userrange *userrange);
|
||||||
|
int cil_gen_userbounds(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
int cil_gen_userprefix(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_userprefix(struct cil_userprefix *userprefix);
|
||||||
|
int cil_gen_selinuxuser(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
int cil_gen_selinuxuserdefault(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_selinuxuser(struct cil_selinuxuser *selinuxuser);
|
||||||
|
int cil_gen_role(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_role(struct cil_role *role);
|
||||||
|
int cil_gen_roletype(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_roletype(struct cil_roletype *roletype);
|
||||||
|
int cil_gen_userrole(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_userrole(struct cil_userrole *userrole);
|
||||||
|
int cil_gen_roletransition(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_roletransition(struct cil_roletransition *roletrans);
|
||||||
|
int cil_gen_roleallow(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_roleallow(struct cil_roleallow *roleallow);
|
||||||
|
int cil_gen_roleattribute(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_roleattribute(struct cil_roleattribute *role);
|
||||||
|
int cil_gen_roleattributeset(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_roleattributeset(struct cil_roleattributeset *attrset);
|
||||||
|
int cil_gen_rolebounds(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
int cil_gen_avrule(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, uint32_t rule_kind);
|
||||||
|
void cil_destroy_avrule(struct cil_avrule *rule);
|
||||||
|
int cil_gen_avrulex(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, uint32_t rule_kind);
|
||||||
|
int cil_gen_permissionx(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_permissionx(struct cil_permissionx *permx);
|
||||||
|
int cil_gen_type_rule(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, uint32_t rule_kind);
|
||||||
|
void cil_destroy_type_rule(struct cil_type_rule *rule);
|
||||||
|
int cil_gen_type(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_type(struct cil_type *type);
|
||||||
|
int cil_gen_typeattribute(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_typeattribute(struct cil_typeattribute *type);
|
||||||
|
int cil_gen_bool(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, int tunableif);
|
||||||
|
void cil_destroy_bool(struct cil_bool *boolean);
|
||||||
|
int cil_gen_tunable(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_tunable(struct cil_tunable *tunable);
|
||||||
|
int cil_gen_constrain_expr(struct cil_tree_node *current, enum cil_flavor flavor, struct cil_list **stack);
|
||||||
|
int cil_gen_expr(struct cil_tree_node *current, enum cil_flavor flavor, struct cil_list **stack);
|
||||||
|
int cil_gen_boolif(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, int tunable_if);
|
||||||
|
void cil_destroy_boolif(struct cil_booleanif *bif);
|
||||||
|
int cil_gen_tunif(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_tunif(struct cil_tunableif *tif);
|
||||||
|
int cil_gen_condblock(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_condblock(struct cil_condblock *cb);
|
||||||
|
int cil_gen_alias(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_alias(struct cil_alias *alias);
|
||||||
|
int cil_gen_aliasactual(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_aliasactual(struct cil_aliasactual *aliasactual);
|
||||||
|
int cil_gen_typeattributeset(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_typeattributeset(struct cil_typeattributeset *attrtypes);
|
||||||
|
int cil_gen_expandtypeattribute(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_expandtypeattribute(struct cil_expandtypeattribute *expandattr);
|
||||||
|
int cil_gen_typebounds(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
int cil_gen_typepermissive(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_typepermissive(struct cil_typepermissive *typeperm);
|
||||||
|
int cil_gen_typetransition(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_name(struct cil_name *name);
|
||||||
|
void cil_destroy_typetransition(struct cil_nametypetransition *nametypetrans);
|
||||||
|
int cil_gen_rangetransition(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_rangetransition(struct cil_rangetransition *rangetrans);
|
||||||
|
int cil_gen_sensitivity(struct cil_db *idb, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_sensitivity(struct cil_sens *sens);
|
||||||
|
int cil_gen_category(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_category(struct cil_cat *cat);
|
||||||
|
int cil_set_to_list(struct cil_tree_node *parse_current, struct cil_list *ast_cl);
|
||||||
|
void cil_destroy_catset(struct cil_catset *catset);
|
||||||
|
int cil_gen_catorder(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_catorder(struct cil_catorder *catorder);
|
||||||
|
int cil_gen_sensitivityorder(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_sensitivityorder(struct cil_sensorder *sensorder);
|
||||||
|
int cil_gen_senscat(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_senscat(struct cil_senscat *senscat);
|
||||||
|
int cil_gen_level(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_level(struct cil_level *level);
|
||||||
|
int cil_fill_levelrange(struct cil_tree_node *low, struct cil_levelrange *lvlrange);
|
||||||
|
int cil_gen_levelrange(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_levelrange(struct cil_levelrange *lvlrange);
|
||||||
|
void cil_destroy_constrain_node(struct cil_tree_node *cons_node);
|
||||||
|
int cil_gen_constrain(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_constrain(struct cil_constrain *cons);
|
||||||
|
int cil_gen_validatetrans(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_validatetrans(struct cil_validatetrans *validtrans);
|
||||||
|
int cil_fill_context(struct cil_tree_node *user_node, struct cil_context *context);
|
||||||
|
int cil_gen_context(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_context(struct cil_context *context);
|
||||||
|
int cil_gen_filecon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_filecon(struct cil_filecon *filecon);
|
||||||
|
int cil_gen_ibpkeycon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_ibpkeycon(struct cil_ibpkeycon *ibpkeycon);
|
||||||
|
int cil_gen_ibendportcon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_ibendportcon(struct cil_ibendportcon *ibendportcon);
|
||||||
|
int cil_gen_portcon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_portcon(struct cil_portcon *portcon);
|
||||||
|
int cil_gen_nodecon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_nodecon(struct cil_nodecon *nodecon);
|
||||||
|
int cil_gen_genfscon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_genfscon(struct cil_genfscon *genfscon);
|
||||||
|
int cil_gen_netifcon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_netifcon(struct cil_netifcon *netifcon);
|
||||||
|
int cil_gen_pirqcon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_pirqcon(struct cil_pirqcon *pirqcon);
|
||||||
|
int cil_gen_iomemcon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_iomemcon(struct cil_iomemcon *iomemcon);
|
||||||
|
int cil_gen_ioportcon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_ioportcon(struct cil_ioportcon *ioportcon);
|
||||||
|
int cil_gen_pcidevicecon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_pcidevicecon(struct cil_pcidevicecon *pcidevicecon);
|
||||||
|
int cil_gen_devicetreecon(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_devicetreecon(struct cil_devicetreecon *devicetreecon);
|
||||||
|
int cil_gen_fsuse(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_fsuse(struct cil_fsuse *fsuse);
|
||||||
|
void cil_destroy_param(struct cil_param *param);
|
||||||
|
int cil_gen_macro(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_macro(struct cil_macro *macro);
|
||||||
|
int cil_gen_call(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_call(struct cil_call *call);
|
||||||
|
void cil_destroy_args(struct cil_args *args);
|
||||||
|
int cil_gen_optional(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_optional(struct cil_optional *optional);
|
||||||
|
int cil_gen_policycap(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_policycap(struct cil_policycap *polcap);
|
||||||
|
int cil_gen_ipaddr(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_ipaddr(struct cil_ipaddr *ipaddr);
|
||||||
|
int cil_gen_bounds(struct cil_db *db, struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_bounds(struct cil_bounds *bounds);
|
||||||
|
int cil_gen_default(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node, enum cil_flavor flavor);
|
||||||
|
void cil_destroy_default(struct cil_default *def);
|
||||||
|
int cil_gen_handleunknown(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_handleunknown(struct cil_handleunknown *unk);
|
||||||
|
int cil_gen_mls(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_mls(struct cil_mls *mls);
|
||||||
|
int cil_gen_defaultrange(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_defaultrange(struct cil_defaultrange *def);
|
||||||
|
int cil_gen_src_info(struct cil_tree_node *parse_current, struct cil_tree_node *ast_node);
|
||||||
|
void cil_destroy_src_info(struct cil_src_info *info);
|
||||||
|
|
||||||
|
int cil_fill_cats(struct cil_tree_node *curr, struct cil_cats **cats);
|
||||||
|
void cil_destroy_cats(struct cil_cats *cats);
|
||||||
|
int cil_fill_context(struct cil_tree_node *user_node, struct cil_context *context);
|
||||||
|
int cil_fill_integer(struct cil_tree_node *int_node, uint32_t *integer, int base);
|
||||||
|
int cil_fill_integer64(struct cil_tree_node *int_node, uint64_t *integer, int base);
|
||||||
|
int cil_fill_ipaddr(struct cil_tree_node *addr_node, struct cil_ipaddr *addr);
|
||||||
|
int cil_fill_level(struct cil_tree_node *sens, struct cil_level *level);
|
||||||
|
|
||||||
|
int cil_build_ast(struct cil_db *db, struct cil_tree_node *parse_tree, struct cil_tree_node *ast);
|
||||||
|
|
||||||
|
#endif /* CIL_BUILD_AST_H_ */
|
||||||
2144
kernel/libsepol/cil/src/cil_copy_ast.c
Normal file
2144
kernel/libsepol/cil/src/cil_copy_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
120
kernel/libsepol/cil/src/cil_copy_ast.h
Normal file
120
kernel/libsepol/cil/src/cil_copy_ast.h
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_COPY_H_
|
||||||
|
#define CIL_COPY_H_
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_symtab.h"
|
||||||
|
|
||||||
|
void cil_copy_list(struct cil_list *orig, struct cil_list **copy);
|
||||||
|
int cil_copy_expr(struct cil_db *db, struct cil_list *orig, struct cil_list **new);
|
||||||
|
|
||||||
|
int cil_copy_block(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_blockabstract(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_blockinherit(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_perm(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_class(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_classorder(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_classmapping(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_permset(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
|
||||||
|
void cil_copy_classperms(struct cil_classperms *orig, struct cil_classperms **new);
|
||||||
|
void cil_copy_classperms_set(struct cil_classperms_set *orig, struct cil_classperms_set **new);
|
||||||
|
void cil_copy_classperms_list(struct cil_list *orig, struct cil_list **new);
|
||||||
|
int cil_copy_classpermission(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_classpermissionset(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab);
|
||||||
|
int cil_copy_common(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_classcommon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_sid(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_sidcontext(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_sidorder(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_user(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userattribute(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userattributeset(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userrole(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userlevel(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userrange(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userbounds(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_userprefix(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_role(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_roletype(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_rolebounds(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_roleattribute(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_roleattributeset(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_roleallow(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_type(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_typebounds(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_typepermissive(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_typeattribute(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_typeattributeset(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_typealias(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_nametypetransition(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_rangetransition(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_bool(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_avrule(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_type_rule(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_sens(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_sensalias(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_cat(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_catalias(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_catset(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_senscat(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_catorder(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_sensitivityorder(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
void cil_copy_fill_level(struct cil_db *db, struct cil_level *orig, struct cil_level **new);
|
||||||
|
int cil_copy_level(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
void cil_copy_fill_levelrange(struct cil_db *db, struct cil_levelrange *orig, struct cil_levelrange *new);
|
||||||
|
int cil_copy_levelrange(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
void cil_copy_fill_context(struct cil_db *db, struct cil_context *orig, struct cil_context *new);
|
||||||
|
int cil_copy_context(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_netifcon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_genfscon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_filecon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_nodecon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_ibpkeycon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_portcon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_pirqcon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_iomemcon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_ioportcon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_pcidevicecon(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_fsuse(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_exrp(struct cil_db *db, struct cil_list *orig, struct cil_list **new);
|
||||||
|
int cil_copy_constrain(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_validatetrans(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_call(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_optional(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
void cil_copy_fill_ipaddr(struct cil_ipaddr *orig, struct cil_ipaddr *new);
|
||||||
|
int cil_copy_ipaddr(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
int cil_copy_boolif(struct cil_db *db, void *data, void **copy, symtab_t *symtab);
|
||||||
|
|
||||||
|
int cil_copy_ast(struct cil_db *db, struct cil_tree_node *orig, struct cil_tree_node *dest);
|
||||||
|
|
||||||
|
#endif
|
||||||
391
kernel/libsepol/cil/src/cil_find.c
Normal file
391
kernel/libsepol/cil/src/cil_find.c
Normal file
@@ -0,0 +1,391 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/ebitmap.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_find.h"
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_symtab.h"
|
||||||
|
|
||||||
|
struct cil_args_find {
|
||||||
|
enum cil_flavor flavor;
|
||||||
|
void *target;
|
||||||
|
struct cil_list *matching;
|
||||||
|
int match_self;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int cil_type_match_any(struct cil_symtab_datum *d1, struct cil_symtab_datum *d2)
|
||||||
|
{
|
||||||
|
enum cil_flavor f1 = FLAVOR(d1);
|
||||||
|
enum cil_flavor f2 = FLAVOR(d2);
|
||||||
|
|
||||||
|
if (f1 != CIL_TYPEATTRIBUTE && f2 != CIL_TYPEATTRIBUTE) {
|
||||||
|
struct cil_type *t1 = (struct cil_type *)d1;
|
||||||
|
struct cil_type *t2 = (struct cil_type *)d2;
|
||||||
|
if (t1->value == t2->value) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
} else if (f1 == CIL_TYPEATTRIBUTE && f2 != CIL_TYPEATTRIBUTE) {
|
||||||
|
struct cil_typeattribute *a = (struct cil_typeattribute *)d1;
|
||||||
|
struct cil_type *t = (struct cil_type *)d2;
|
||||||
|
if (ksu_ebitmap_get_bit(a->types, t->value)) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
} else if (f1 != CIL_TYPEATTRIBUTE && f2 == CIL_TYPEATTRIBUTE) {
|
||||||
|
struct cil_type *t = (struct cil_type *)d1;
|
||||||
|
struct cil_typeattribute *a = (struct cil_typeattribute *)d2;
|
||||||
|
if (ksu_ebitmap_get_bit(a->types, t->value)) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Both are attributes */
|
||||||
|
struct cil_typeattribute *a1 = (struct cil_typeattribute *)d1;
|
||||||
|
struct cil_typeattribute *a2 = (struct cil_typeattribute *)d2;
|
||||||
|
if (d1 == d2) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
} else if (ebitmap_match_any(a1->types, a2->types)) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_type_matches(ebitmap_t *matches, struct cil_symtab_datum *d1, struct cil_symtab_datum *d2)
|
||||||
|
{
|
||||||
|
int rc = SEPOL_OK;
|
||||||
|
enum cil_flavor f1 = FLAVOR(d1);
|
||||||
|
enum cil_flavor f2 = FLAVOR(d2);
|
||||||
|
|
||||||
|
if (f1 != CIL_TYPEATTRIBUTE && f2 != CIL_TYPEATTRIBUTE) {
|
||||||
|
struct cil_type *t1 = (struct cil_type *)d1;
|
||||||
|
struct cil_type *t2 = (struct cil_type *)d2;
|
||||||
|
if (t1->value == t2->value) {
|
||||||
|
ksu_ebitmap_set_bit(matches, t1->value, 1);
|
||||||
|
}
|
||||||
|
} else if (f1 == CIL_TYPEATTRIBUTE && f2 != CIL_TYPEATTRIBUTE) {
|
||||||
|
struct cil_typeattribute *a = (struct cil_typeattribute *)d1;
|
||||||
|
struct cil_type *t = (struct cil_type *)d2;
|
||||||
|
if (ksu_ebitmap_get_bit(a->types, t->value)) {
|
||||||
|
ksu_ebitmap_set_bit(matches, t->value, 1);
|
||||||
|
}
|
||||||
|
} else if (f1 != CIL_TYPEATTRIBUTE && f2 == CIL_TYPEATTRIBUTE) {
|
||||||
|
struct cil_type *t = (struct cil_type *)d1;
|
||||||
|
struct cil_typeattribute *a = (struct cil_typeattribute *)d2;
|
||||||
|
if (ksu_ebitmap_get_bit(a->types, t->value)) {
|
||||||
|
ksu_ebitmap_set_bit(matches, t->value, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Both are attributes */
|
||||||
|
struct cil_typeattribute *a1 = (struct cil_typeattribute *)d1;
|
||||||
|
struct cil_typeattribute *a2 = (struct cil_typeattribute *)d2;
|
||||||
|
rc = ksu_ebitmap_and(matches, a1->types, a2->types);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* s1 is the src type that is matched with a self
|
||||||
|
* s2, and t2 are the source and type of the other rule
|
||||||
|
*/
|
||||||
|
static int cil_self_match_any(struct cil_symtab_datum *s1, struct cil_symtab_datum *s2, struct cil_symtab_datum *t2)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct cil_tree_node *n1 = NODE(s1);
|
||||||
|
if (n1->flavor != CIL_TYPEATTRIBUTE) {
|
||||||
|
rc = cil_type_match_any(s1, t2);
|
||||||
|
} else {
|
||||||
|
struct cil_typeattribute *a = (struct cil_typeattribute *)s1;
|
||||||
|
ebitmap_t map;
|
||||||
|
ebitmap_init(&map);
|
||||||
|
rc = cil_type_matches(&map, s2, t2);
|
||||||
|
if (rc < 0) {
|
||||||
|
ksu_ebitmap_destroy(&map);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (map.node == NULL) {
|
||||||
|
rc = CIL_FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
rc = ebitmap_match_any(&map, a->types);
|
||||||
|
ksu_ebitmap_destroy(&map);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_classperms_match_any(struct cil_classperms *cp1, struct cil_classperms *cp2)
|
||||||
|
{
|
||||||
|
struct cil_class *c1 = cp1->class;
|
||||||
|
struct cil_class *c2 = cp2->class;
|
||||||
|
struct cil_list_item *i1, *i2;
|
||||||
|
|
||||||
|
if (&c1->datum != &c2->datum) return CIL_FALSE;
|
||||||
|
|
||||||
|
cil_list_for_each(i1, cp1->perms) {
|
||||||
|
struct cil_perm *p1 = i1->data;
|
||||||
|
cil_list_for_each(i2, cp2->perms) {
|
||||||
|
struct cil_perm *p2 = i2->data;
|
||||||
|
if (&p1->datum == &p2->datum) return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __cil_classperms_list_match_any(struct cil_classperms *cp1, struct cil_list *cpl2)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct cil_list_item *curr;
|
||||||
|
|
||||||
|
cil_list_for_each(curr, cpl2) {
|
||||||
|
if (curr->flavor == CIL_CLASSPERMS) {
|
||||||
|
struct cil_classperms *cp = curr->data;
|
||||||
|
if (FLAVOR(cp->class) == CIL_CLASS) {
|
||||||
|
rc = cil_classperms_match_any(cp1, cp);
|
||||||
|
if (rc == CIL_TRUE) return CIL_TRUE;
|
||||||
|
} else { /* MAP */
|
||||||
|
struct cil_list_item *i = NULL;
|
||||||
|
cil_list_for_each(i, cp->perms) {
|
||||||
|
struct cil_perm *cmp = i->data;
|
||||||
|
rc = __cil_classperms_list_match_any(cp1, cmp->classperms);
|
||||||
|
if (rc == CIL_TRUE) return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* SET */
|
||||||
|
struct cil_classperms_set *cp_set = curr->data;
|
||||||
|
struct cil_classpermission *cp = cp_set->set;
|
||||||
|
rc = __cil_classperms_list_match_any(cp1, cp->classperms);
|
||||||
|
if (rc == CIL_TRUE) return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_classperms_list_match_any(struct cil_list *cpl1, struct cil_list *cpl2)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct cil_list_item *curr;
|
||||||
|
|
||||||
|
cil_list_for_each(curr, cpl1) {
|
||||||
|
if (curr->flavor == CIL_CLASSPERMS) {
|
||||||
|
struct cil_classperms *cp = curr->data;
|
||||||
|
if (FLAVOR(cp->class) == CIL_CLASS) {
|
||||||
|
rc = __cil_classperms_list_match_any(cp, cpl2);
|
||||||
|
if (rc == CIL_TRUE) return CIL_TRUE;
|
||||||
|
} else { /* MAP */
|
||||||
|
struct cil_list_item *i = NULL;
|
||||||
|
cil_list_for_each(i, cp->perms) {
|
||||||
|
struct cil_perm *cmp = i->data;
|
||||||
|
rc = cil_classperms_list_match_any(cmp->classperms, cpl2);
|
||||||
|
if (rc == CIL_TRUE) return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* SET */
|
||||||
|
struct cil_classperms_set *cp_set = curr->data;
|
||||||
|
struct cil_classpermission *cp = cp_set->set;
|
||||||
|
rc = cil_classperms_list_match_any(cp->classperms, cpl2);
|
||||||
|
if (rc == CIL_TRUE) return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __add_classes_from_classperms_list(struct cil_list *classperms, struct cil_list *class_list)
|
||||||
|
{
|
||||||
|
struct cil_list_item *curr;
|
||||||
|
|
||||||
|
cil_list_for_each(curr, classperms) {
|
||||||
|
if (curr->flavor == CIL_CLASSPERMS) {
|
||||||
|
struct cil_classperms *cp = curr->data;
|
||||||
|
if (FLAVOR(cp->class) == CIL_CLASS) {
|
||||||
|
cil_list_append(class_list, CIL_CLASS, cp->class);
|
||||||
|
} else { /* MAP */
|
||||||
|
struct cil_list_item *i = NULL;
|
||||||
|
cil_list_for_each(i, cp->perms) {
|
||||||
|
struct cil_perm *cmp = i->data;
|
||||||
|
__add_classes_from_classperms_list(cmp->classperms, class_list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* SET */
|
||||||
|
struct cil_classperms_set *cp_set = curr->data;
|
||||||
|
struct cil_classpermission *cp = cp_set->set;
|
||||||
|
__add_classes_from_classperms_list(cp->classperms, class_list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __add_classes_from_map_perms(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
|
||||||
|
{
|
||||||
|
struct cil_list *class_list = args;
|
||||||
|
struct cil_perm *cmp = (struct cil_perm *)d;
|
||||||
|
|
||||||
|
__add_classes_from_classperms_list(cmp->classperms, class_list);
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cil_list *cil_expand_class(struct cil_class *class)
|
||||||
|
{
|
||||||
|
struct cil_list *class_list;
|
||||||
|
|
||||||
|
cil_list_init(&class_list, CIL_CLASS);
|
||||||
|
|
||||||
|
if (FLAVOR(class) == CIL_CLASS) {
|
||||||
|
cil_list_append(class_list, CIL_CLASS, class);
|
||||||
|
} else { /* MAP */
|
||||||
|
cil_symtab_map(&class->perms, __add_classes_from_map_perms, class_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
return class_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_permissionx_match_any(struct cil_permissionx *px1, struct cil_permissionx *px2)
|
||||||
|
{
|
||||||
|
int rc = CIL_FALSE;
|
||||||
|
struct cil_list *cl1 = NULL;
|
||||||
|
struct cil_list *cl2 = NULL;
|
||||||
|
|
||||||
|
if (px1->kind != px2->kind) goto exit;
|
||||||
|
|
||||||
|
if (!ebitmap_match_any(px1->perms, px2->perms)) goto exit;
|
||||||
|
|
||||||
|
cl1 = cil_expand_class(px1->obj);
|
||||||
|
cl2 = cil_expand_class(px2->obj);
|
||||||
|
|
||||||
|
if (!cil_list_match_any(cl1, cl2)) goto exit;
|
||||||
|
|
||||||
|
rc = CIL_TRUE;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
cil_list_destroy(&cl1, CIL_FALSE);
|
||||||
|
cil_list_destroy(&cl2, CIL_FALSE);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_find_matching_avrule(struct cil_tree_node *node, struct cil_avrule *avrule, struct cil_avrule *target, struct cil_list *matching, int match_self)
|
||||||
|
{
|
||||||
|
int rc = SEPOL_OK;
|
||||||
|
struct cil_symtab_datum *s1 = avrule->src;
|
||||||
|
struct cil_symtab_datum *t1 = avrule->tgt;
|
||||||
|
struct cil_symtab_datum *s2 = target->src;
|
||||||
|
struct cil_symtab_datum *t2 = target->tgt;
|
||||||
|
|
||||||
|
if (match_self != CIL_TRUE && avrule == target) goto exit;
|
||||||
|
|
||||||
|
if (avrule->rule_kind != target->rule_kind) goto exit;
|
||||||
|
|
||||||
|
if (avrule->is_extended != target->is_extended) goto exit;
|
||||||
|
|
||||||
|
if (!cil_type_match_any(s1, s2)) goto exit;
|
||||||
|
|
||||||
|
if (t1->fqn != CIL_KEY_SELF && t2->fqn != CIL_KEY_SELF) {
|
||||||
|
if (!cil_type_match_any(t1, t2)) goto exit;
|
||||||
|
} else {
|
||||||
|
if (t1->fqn == CIL_KEY_SELF && t2->fqn == CIL_KEY_SELF) {
|
||||||
|
/* The earlier check whether s1 and s2 matches is all that is needed */
|
||||||
|
} else if (t1->fqn == CIL_KEY_SELF) {
|
||||||
|
rc = cil_self_match_any(s1, s2, t2);
|
||||||
|
if (rc < 0) {
|
||||||
|
goto exit;
|
||||||
|
} else if (rc == CIL_FALSE) {
|
||||||
|
rc = SEPOL_OK;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
} else if (t2->fqn == CIL_KEY_SELF) {
|
||||||
|
rc = cil_self_match_any(s2, s1, t1);
|
||||||
|
if (rc < 0) {
|
||||||
|
goto exit;
|
||||||
|
} else if (rc == CIL_FALSE) {
|
||||||
|
rc = SEPOL_OK;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!target->is_extended) {
|
||||||
|
if (cil_classperms_list_match_any(avrule->perms.classperms, target->perms.classperms)) {
|
||||||
|
cil_list_append(matching, CIL_NODE, node);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (cil_permissionx_match_any(avrule->perms.x.permx, target->perms.x.permx)) {
|
||||||
|
cil_list_append(matching, CIL_NODE, node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = SEPOL_OK;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __cil_find_matching_avrule_in_ast(struct cil_tree_node *node, uint32_t *finished, void *extra_args)
|
||||||
|
{
|
||||||
|
int rc = SEPOL_OK;
|
||||||
|
struct cil_args_find *args = extra_args;
|
||||||
|
|
||||||
|
if (node->flavor == CIL_BLOCK) {
|
||||||
|
struct cil_block *blk = node->data;
|
||||||
|
if (blk->is_abstract == CIL_TRUE) {
|
||||||
|
*finished = CIL_TREE_SKIP_HEAD;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
} else if (node->flavor == CIL_MACRO) {
|
||||||
|
*finished = CIL_TREE_SKIP_HEAD;
|
||||||
|
goto exit;
|
||||||
|
} else if (node->flavor == CIL_AVRULE || node->flavor == CIL_AVRULEX) {
|
||||||
|
if (node->flavor == args->flavor) {
|
||||||
|
rc = cil_find_matching_avrule(node, node->data, args->target, args->matching, args->match_self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_find_matching_avrule_in_ast(struct cil_tree_node *current, enum cil_flavor flavor, void *target, struct cil_list *matching, int match_self)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct cil_args_find args;
|
||||||
|
|
||||||
|
args.flavor = flavor;
|
||||||
|
args.target = target;
|
||||||
|
args.matching = matching;
|
||||||
|
args.match_self = match_self;
|
||||||
|
|
||||||
|
rc = cil_tree_walk(current, __cil_find_matching_avrule_in_ast, NULL, NULL, &args);
|
||||||
|
if (rc) {
|
||||||
|
cil_log(CIL_ERR, "An error occurred while searching for avrule in AST\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
40
kernel/libsepol/cil/src/cil_find.h
Normal file
40
kernel/libsepol/cil/src/cil_find.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
|
||||||
|
#ifndef CIL_FIND_H_
|
||||||
|
#define CIL_FIND_H_
|
||||||
|
|
||||||
|
int cil_find_matching_avrule_in_ast(struct cil_tree_node *current, enum cil_flavor flavor, void *target, struct cil_list *matching, int match_self);
|
||||||
|
struct cil_list *cil_expand_class(struct cil_class *class);
|
||||||
|
|
||||||
|
#endif
|
||||||
194
kernel/libsepol/cil/src/cil_flavor.h
Normal file
194
kernel/libsepol/cil/src/cil_flavor.h
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_FLAVOR_H_
|
||||||
|
#define CIL_FLAVOR_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tree/list node types
|
||||||
|
*/
|
||||||
|
#define CIL_MIN_OP_OPERANDS 1000
|
||||||
|
#define CIL_MIN_DECLARATIVE 2000
|
||||||
|
|
||||||
|
enum cil_flavor {
|
||||||
|
CIL_NONE = 0,
|
||||||
|
CIL_ROOT,
|
||||||
|
CIL_NODE,
|
||||||
|
CIL_STRING,
|
||||||
|
CIL_DATUM,
|
||||||
|
CIL_LIST,
|
||||||
|
CIL_LIST_ITEM,
|
||||||
|
CIL_PARAM,
|
||||||
|
CIL_ARGS,
|
||||||
|
CIL_BLOCKINHERIT,
|
||||||
|
CIL_BLOCKABSTRACT,
|
||||||
|
CIL_IN,
|
||||||
|
CIL_CALL,
|
||||||
|
CIL_BOOLEANIF,
|
||||||
|
CIL_TUNABLEIF,
|
||||||
|
CIL_CONDBLOCK,
|
||||||
|
CIL_CONDTRUE,
|
||||||
|
CIL_CONDFALSE,
|
||||||
|
CIL_CLASSORDER,
|
||||||
|
CIL_CLASSCOMMON,
|
||||||
|
CIL_CLASSMAPPING,
|
||||||
|
CIL_CLASSPERMS,
|
||||||
|
CIL_CLASSPERMS_SET,
|
||||||
|
CIL_CLASSPERMISSIONSET,
|
||||||
|
CIL_USERPREFIX,
|
||||||
|
CIL_USERROLE,
|
||||||
|
CIL_USERATTRIBUTESET,
|
||||||
|
CIL_USERLEVEL,
|
||||||
|
CIL_USERRANGE,
|
||||||
|
CIL_USERBOUNDS,
|
||||||
|
CIL_SELINUXUSER,
|
||||||
|
CIL_SELINUXUSERDEFAULT,
|
||||||
|
CIL_ROLEATTRIBUTESET,
|
||||||
|
CIL_ROLETYPE,
|
||||||
|
CIL_ROLEBOUNDS,
|
||||||
|
CIL_TYPEATTRIBUTESET,
|
||||||
|
CIL_EXPANDTYPEATTRIBUTE,
|
||||||
|
CIL_TYPEALIASACTUAL,
|
||||||
|
CIL_TYPEBOUNDS,
|
||||||
|
CIL_TYPEPERMISSIVE,
|
||||||
|
CIL_SENSALIASACTUAL,
|
||||||
|
CIL_SENSITIVITYORDER,
|
||||||
|
CIL_SENSCAT,
|
||||||
|
CIL_CATALIASACTUAL,
|
||||||
|
CIL_CATORDER,
|
||||||
|
CIL_SIDORDER,
|
||||||
|
CIL_ROLEALLOW,
|
||||||
|
CIL_AVRULE,
|
||||||
|
CIL_AVRULEX,
|
||||||
|
CIL_ROLETRANSITION,
|
||||||
|
CIL_TYPE_RULE,
|
||||||
|
CIL_NAMETYPETRANSITION,
|
||||||
|
CIL_RANGETRANSITION,
|
||||||
|
CIL_CONSTRAIN,
|
||||||
|
CIL_MLSCONSTRAIN,
|
||||||
|
CIL_VALIDATETRANS,
|
||||||
|
CIL_MLSVALIDATETRANS,
|
||||||
|
CIL_SIDCONTEXT,
|
||||||
|
CIL_FSUSE,
|
||||||
|
CIL_FILECON,
|
||||||
|
CIL_PORTCON,
|
||||||
|
CIL_NODECON,
|
||||||
|
CIL_GENFSCON,
|
||||||
|
CIL_NETIFCON,
|
||||||
|
CIL_PIRQCON,
|
||||||
|
CIL_IOMEMCON,
|
||||||
|
CIL_IOPORTCON,
|
||||||
|
CIL_PCIDEVICECON,
|
||||||
|
CIL_DEVICETREECON,
|
||||||
|
CIL_DEFAULTUSER,
|
||||||
|
CIL_DEFAULTROLE,
|
||||||
|
CIL_DEFAULTTYPE,
|
||||||
|
CIL_DEFAULTRANGE,
|
||||||
|
CIL_HANDLEUNKNOWN,
|
||||||
|
CIL_MLS,
|
||||||
|
CIL_SRC_INFO,
|
||||||
|
CIL_IBPKEYCON,
|
||||||
|
CIL_IBENDPORTCON,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* boolean constraint set catset
|
||||||
|
* dom X
|
||||||
|
* domby X
|
||||||
|
* incomp X
|
||||||
|
* eq X X
|
||||||
|
* ne X X
|
||||||
|
* and X X X X
|
||||||
|
* not X X X X
|
||||||
|
* or X X X X
|
||||||
|
* xor X X X
|
||||||
|
* all X X
|
||||||
|
* range X
|
||||||
|
*/
|
||||||
|
CIL_OP = CIL_MIN_OP_OPERANDS,
|
||||||
|
CIL_ALL,
|
||||||
|
CIL_AND,
|
||||||
|
CIL_OR,
|
||||||
|
CIL_XOR,
|
||||||
|
CIL_NOT,
|
||||||
|
CIL_EQ,
|
||||||
|
CIL_NEQ,
|
||||||
|
CIL_RANGE,
|
||||||
|
CIL_CONS_DOM,
|
||||||
|
CIL_CONS_DOMBY,
|
||||||
|
CIL_CONS_INCOMP,
|
||||||
|
CIL_CONS_OPERAND,
|
||||||
|
CIL_CONS_U1,
|
||||||
|
CIL_CONS_U2,
|
||||||
|
CIL_CONS_U3,
|
||||||
|
CIL_CONS_T1,
|
||||||
|
CIL_CONS_T2,
|
||||||
|
CIL_CONS_T3,
|
||||||
|
CIL_CONS_R1,
|
||||||
|
CIL_CONS_R2,
|
||||||
|
CIL_CONS_R3,
|
||||||
|
CIL_CONS_L1,
|
||||||
|
CIL_CONS_L2,
|
||||||
|
CIL_CONS_H1,
|
||||||
|
CIL_CONS_H2,
|
||||||
|
|
||||||
|
CIL_BLOCK = CIL_MIN_DECLARATIVE,
|
||||||
|
CIL_MACRO,
|
||||||
|
CIL_OPTIONAL,
|
||||||
|
CIL_BOOL,
|
||||||
|
CIL_TUNABLE,
|
||||||
|
CIL_PERM,
|
||||||
|
CIL_MAP_PERM,
|
||||||
|
CIL_COMMON,
|
||||||
|
CIL_CLASS,
|
||||||
|
CIL_MAP_CLASS,
|
||||||
|
CIL_CLASSPERMISSION,
|
||||||
|
CIL_USER,
|
||||||
|
CIL_USERATTRIBUTE,
|
||||||
|
CIL_ROLE,
|
||||||
|
CIL_ROLEATTRIBUTE,
|
||||||
|
CIL_TYPE,
|
||||||
|
CIL_TYPEATTRIBUTE,
|
||||||
|
CIL_TYPEALIAS,
|
||||||
|
CIL_SENS,
|
||||||
|
CIL_SENSALIAS,
|
||||||
|
CIL_CAT,
|
||||||
|
CIL_CATSET,
|
||||||
|
CIL_CATALIAS,
|
||||||
|
CIL_LEVEL,
|
||||||
|
CIL_LEVELRANGE,
|
||||||
|
CIL_SID,
|
||||||
|
CIL_NAME,
|
||||||
|
CIL_CONTEXT,
|
||||||
|
CIL_IPADDR,
|
||||||
|
CIL_POLICYCAP,
|
||||||
|
CIL_PERMISSIONX
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CIL_FLAVOR_H_ */
|
||||||
143
kernel/libsepol/cil/src/cil_fqn.c
Normal file
143
kernel/libsepol/cil/src/cil_fqn.c
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "cil_fqn.h"
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_strpool.h"
|
||||||
|
#include "cil_symtab.h"
|
||||||
|
|
||||||
|
struct cil_fqn_args {
|
||||||
|
char prefix[CIL_MAX_NAME_LENGTH];
|
||||||
|
int len;
|
||||||
|
struct cil_tree_node *node;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __cil_fqn_qualify_decls(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
|
||||||
|
{
|
||||||
|
struct cil_fqn_args *fqn_args = args;
|
||||||
|
struct cil_symtab_datum *datum = (struct cil_symtab_datum *)d;
|
||||||
|
int newlen;
|
||||||
|
char prefix[CIL_MAX_NAME_LENGTH];
|
||||||
|
int rc = SEPOL_OK;
|
||||||
|
|
||||||
|
if (fqn_args->len == 0) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
newlen = fqn_args->len + strlen(datum->name);
|
||||||
|
if (newlen >= CIL_MAX_NAME_LENGTH) {
|
||||||
|
cil_log(CIL_INFO, "Fully qualified name for %s is too long\n", datum->name);
|
||||||
|
rc = SEPOL_ERR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
strcpy(prefix, fqn_args->prefix);
|
||||||
|
strcat(prefix, datum->name);
|
||||||
|
datum->fqn = cil_strpool_add(prefix);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __cil_fqn_qualify_blocks(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
|
||||||
|
{
|
||||||
|
struct cil_fqn_args *fqn_args = args;
|
||||||
|
struct cil_fqn_args child_args;
|
||||||
|
struct cil_block *block = (struct cil_block *)d;
|
||||||
|
struct cil_symtab_datum *datum = (struct cil_symtab_datum *)block;
|
||||||
|
struct cil_tree_node *node = NODE(datum);
|
||||||
|
int i;
|
||||||
|
int rc = SEPOL_OK;
|
||||||
|
int newlen;
|
||||||
|
|
||||||
|
if (node->flavor != CIL_BLOCK) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
newlen = fqn_args->len + strlen(datum->name) + 1;
|
||||||
|
if (newlen >= CIL_MAX_NAME_LENGTH) {
|
||||||
|
cil_log(CIL_INFO, "Fully qualified name for block %s is too long\n", datum->name);
|
||||||
|
rc = SEPOL_ERR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
child_args.node = node;
|
||||||
|
child_args.len = newlen;
|
||||||
|
strcpy(child_args.prefix, fqn_args->prefix);
|
||||||
|
strcat(child_args.prefix, datum->name);
|
||||||
|
strcat(child_args.prefix, ".");
|
||||||
|
|
||||||
|
for (i=1; i<CIL_SYM_NUM; i++) {
|
||||||
|
switch (i) {
|
||||||
|
case CIL_SYM_CLASSPERMSETS:
|
||||||
|
case CIL_SYM_CONTEXTS:
|
||||||
|
case CIL_SYM_LEVELRANGES:
|
||||||
|
case CIL_SYM_IPADDRS:
|
||||||
|
case CIL_SYM_NAMES:
|
||||||
|
case CIL_SYM_PERMX:
|
||||||
|
/* These do not show up in the kernel policy */
|
||||||
|
break;
|
||||||
|
case CIL_SYM_POLICYCAPS:
|
||||||
|
/* Valid policy capability names are defined in libsepol */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rc = cil_symtab_map(&(block->symtab[i]), __cil_fqn_qualify_decls, &child_args);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = cil_symtab_map(&(block->symtab[CIL_SYM_BLOCKS]), __cil_fqn_qualify_blocks, &child_args);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
cil_tree_log(node, CIL_ERR,"Problem qualifying names in block");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_fqn_qualify(struct cil_tree_node *root_node)
|
||||||
|
{
|
||||||
|
struct cil_root *root = root_node->data;
|
||||||
|
struct cil_fqn_args fqn_args;
|
||||||
|
|
||||||
|
fqn_args.prefix[0] = '\0';
|
||||||
|
fqn_args.len = 0;
|
||||||
|
fqn_args.node = root_node;
|
||||||
|
|
||||||
|
return cil_symtab_map(&(root->symtab[CIL_SYM_BLOCKS]), __cil_fqn_qualify_blocks, &fqn_args);
|
||||||
|
}
|
||||||
|
|
||||||
38
kernel/libsepol/cil/src/cil_fqn.h
Normal file
38
kernel/libsepol/cil/src/cil_fqn.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_FQN_H_
|
||||||
|
#define CIL_FQN_H_
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
|
||||||
|
int cil_fqn_qualify(struct cil_tree_node *root_node);
|
||||||
|
|
||||||
|
#endif /* CIL_FQN_H_ */
|
||||||
1089
kernel/libsepol/cil/src/cil_internal.h
Normal file
1089
kernel/libsepol/cil/src/cil_internal.h
Normal file
File diff suppressed because it is too large
Load Diff
55
kernel/libsepol/cil/src/cil_lexer.h
Normal file
55
kernel/libsepol/cil/src/cil_lexer.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_LEXER_H_
|
||||||
|
#define CIL_LEXER_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define OPAREN 1
|
||||||
|
#define CPAREN 2
|
||||||
|
#define SYMBOL 3
|
||||||
|
#define QSTRING 4
|
||||||
|
#define COMMENT 5
|
||||||
|
#define HLL_LINEMARK 6
|
||||||
|
#define NEWLINE 7
|
||||||
|
#define END_OF_FILE 8
|
||||||
|
#define UNKNOWN 9
|
||||||
|
|
||||||
|
struct token {
|
||||||
|
uint32_t type;
|
||||||
|
char * value;
|
||||||
|
uint32_t line;
|
||||||
|
};
|
||||||
|
|
||||||
|
int cil_lexer_setup(char *buffer, uint32_t size);
|
||||||
|
void cil_lexer_destroy(void);
|
||||||
|
int cil_lexer_next(struct token *tok);
|
||||||
|
|
||||||
|
#endif /* CIL_LEXER_H_ */
|
||||||
94
kernel/libsepol/cil/src/cil_lexer.l
Normal file
94
kernel/libsepol/cil/src/cil_lexer.l
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sepol/errcodes.h>
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_lexer.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_mem.h"
|
||||||
|
char *value = NULL;
|
||||||
|
int line = 1;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%option nounput
|
||||||
|
%option noinput
|
||||||
|
%option noyywrap
|
||||||
|
%option prefix="cil_yy"
|
||||||
|
|
||||||
|
digit [0-9]
|
||||||
|
alpha [a-zA-Z]
|
||||||
|
spec_char [\[\]\.\@\=\/\*\-\_\$\%\+\-\!\|\&\^\:\~\`\#\{\}\'\<\>\?\,]
|
||||||
|
symbol ({digit}|{alpha}|{spec_char})+
|
||||||
|
white [ \t]
|
||||||
|
newline [\n\r]
|
||||||
|
qstring \"[^"\n\0]*\"
|
||||||
|
hll_lm ^;;\*
|
||||||
|
comment ;
|
||||||
|
|
||||||
|
%%
|
||||||
|
{newline} line++; return NEWLINE;
|
||||||
|
{hll_lm} value=yytext; return HLL_LINEMARK;
|
||||||
|
{comment} value=yytext; return COMMENT;
|
||||||
|
"(" value=yytext; return OPAREN;
|
||||||
|
")" value=yytext; return CPAREN;
|
||||||
|
{symbol} value=yytext; return SYMBOL;
|
||||||
|
{white} ;
|
||||||
|
{qstring} value=yytext; return QSTRING;
|
||||||
|
<<EOF>> return END_OF_FILE;
|
||||||
|
. value=yytext; return UNKNOWN;
|
||||||
|
%%
|
||||||
|
|
||||||
|
int cil_lexer_setup(char *buffer, uint32_t size)
|
||||||
|
{
|
||||||
|
size = (yy_size_t)size;
|
||||||
|
if (yy_scan_buffer(buffer, size) == NULL) {
|
||||||
|
cil_log(CIL_INFO, "Lexer failed to setup buffer\n");
|
||||||
|
return SEPOL_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
line = 1;
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_lexer_destroy(void)
|
||||||
|
{
|
||||||
|
yylex_destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_lexer_next(struct token *tok)
|
||||||
|
{
|
||||||
|
tok->type = yylex();
|
||||||
|
tok->value = value;
|
||||||
|
tok->line = line;
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
278
kernel/libsepol/cil/src/cil_list.c
Normal file
278
kernel/libsepol/cil/src/cil_list.c
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_mem.h"
|
||||||
|
|
||||||
|
__attribute__((noreturn)) __attribute__((format (printf, 1, 2))) static void cil_list_error(const char* msg, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, msg);
|
||||||
|
cil_vlog(CIL_ERR, msg, ap);
|
||||||
|
va_end(ap);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_init(struct cil_list **list, enum cil_flavor flavor)
|
||||||
|
{
|
||||||
|
struct cil_list *new_list = cil_malloc(sizeof(*new_list));
|
||||||
|
new_list->head = NULL;
|
||||||
|
new_list->tail = NULL;
|
||||||
|
new_list->flavor = flavor;
|
||||||
|
*list = new_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_destroy(struct cil_list **list, unsigned destroy_data)
|
||||||
|
{
|
||||||
|
struct cil_list_item *item;
|
||||||
|
|
||||||
|
if (*list == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item = (*list)->head;
|
||||||
|
while (item != NULL)
|
||||||
|
{
|
||||||
|
struct cil_list_item *next = item->next;
|
||||||
|
if (item->flavor == CIL_LIST) {
|
||||||
|
cil_list_destroy((struct cil_list**)&(item->data), destroy_data);
|
||||||
|
free(item);
|
||||||
|
} else {
|
||||||
|
cil_list_item_destroy(&item, destroy_data);
|
||||||
|
}
|
||||||
|
item = next;
|
||||||
|
}
|
||||||
|
free(*list);
|
||||||
|
*list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_item_init(struct cil_list_item **item)
|
||||||
|
{
|
||||||
|
struct cil_list_item *new_item = cil_malloc(sizeof(*new_item));
|
||||||
|
new_item->next = NULL;
|
||||||
|
new_item->flavor = CIL_NONE;
|
||||||
|
new_item->data = NULL;
|
||||||
|
|
||||||
|
*item = new_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_item_destroy(struct cil_list_item **item, unsigned destroy_data)
|
||||||
|
{
|
||||||
|
if (destroy_data) {
|
||||||
|
cil_destroy_data(&(*item)->data, (*item)->flavor);
|
||||||
|
}
|
||||||
|
free(*item);
|
||||||
|
*item = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_append(struct cil_list *list, enum cil_flavor flavor, void *data)
|
||||||
|
{
|
||||||
|
struct cil_list_item *item;
|
||||||
|
|
||||||
|
if (list == NULL) {
|
||||||
|
cil_list_error("Attempt to append data to a NULL list");
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_list_item_init(&item);
|
||||||
|
item->flavor = flavor;
|
||||||
|
item->data = data;
|
||||||
|
|
||||||
|
if (list->tail == NULL) {
|
||||||
|
list->head = item;
|
||||||
|
list->tail = item;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->tail->next = item;
|
||||||
|
list->tail = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_prepend(struct cil_list *list, enum cil_flavor flavor, void *data)
|
||||||
|
{
|
||||||
|
struct cil_list_item *item;
|
||||||
|
|
||||||
|
if (list == NULL) {
|
||||||
|
cil_list_error("Attempt to prepend data to a NULL list");
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_list_item_init(&item);
|
||||||
|
item->flavor = flavor;
|
||||||
|
item->data = data;
|
||||||
|
|
||||||
|
if (list->tail == NULL) {
|
||||||
|
list->head = item;
|
||||||
|
list->tail = item;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->next = list->head;
|
||||||
|
list->head = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cil_list_item *cil_list_insert(struct cil_list *list, struct cil_list_item *curr, enum cil_flavor flavor, void *data)
|
||||||
|
{
|
||||||
|
struct cil_list_item *item;
|
||||||
|
|
||||||
|
if (list == NULL) {
|
||||||
|
cil_list_error("Attempt to append data to a NULL list");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curr == NULL) {
|
||||||
|
/* Insert at the front of the list */
|
||||||
|
cil_list_prepend(list, flavor, data);
|
||||||
|
return list->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curr == list->tail) {
|
||||||
|
cil_list_append(list, flavor, data);
|
||||||
|
return list->tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_list_item_init(&item);
|
||||||
|
item->flavor = flavor;
|
||||||
|
item->data = data;
|
||||||
|
item->next = curr->next;
|
||||||
|
|
||||||
|
curr->next = item;
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_append_item(struct cil_list *list, struct cil_list_item *item)
|
||||||
|
{
|
||||||
|
struct cil_list_item *last = item;
|
||||||
|
|
||||||
|
if (list == NULL) {
|
||||||
|
cil_list_error("Attempt to append an item to a NULL list");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item == NULL) {
|
||||||
|
cil_list_error("Attempt to append a NULL item to a list");
|
||||||
|
}
|
||||||
|
|
||||||
|
while (last->next != NULL) {
|
||||||
|
last = last->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->tail == NULL) {
|
||||||
|
list->head = item;
|
||||||
|
list->tail = last;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->tail->next = item;
|
||||||
|
list->tail = last;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_prepend_item(struct cil_list *list, struct cil_list_item *item)
|
||||||
|
{
|
||||||
|
struct cil_list_item *last = item;
|
||||||
|
|
||||||
|
if (list == NULL) {
|
||||||
|
cil_list_error("Attempt to prepend an item to a NULL list");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item == NULL) {
|
||||||
|
cil_list_error("Attempt to prepend a NULL item to a list");
|
||||||
|
}
|
||||||
|
|
||||||
|
while (last->next != NULL) {
|
||||||
|
last = last->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list->tail == NULL) {
|
||||||
|
list->head = item;
|
||||||
|
list->tail = last;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
last->next = list->head;
|
||||||
|
list->head = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_list_remove(struct cil_list *list, enum cil_flavor flavor, void *data, unsigned destroy_data)
|
||||||
|
{
|
||||||
|
struct cil_list_item *item;
|
||||||
|
struct cil_list_item *previous = NULL;
|
||||||
|
|
||||||
|
if (list == NULL) {
|
||||||
|
cil_list_error("Attempt to remove data from a NULL list");
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_list_for_each(item, list) {
|
||||||
|
if (item->data == data && item->flavor == flavor) {
|
||||||
|
if (previous == NULL) {
|
||||||
|
list->head = item->next;
|
||||||
|
} else {
|
||||||
|
previous->next = item->next;
|
||||||
|
}
|
||||||
|
if (item->next == NULL) {
|
||||||
|
list->tail = previous;
|
||||||
|
}
|
||||||
|
cil_list_item_destroy(&item, destroy_data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
previous = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_list_contains(struct cil_list *list, void *data)
|
||||||
|
{
|
||||||
|
struct cil_list_item *curr = NULL;
|
||||||
|
|
||||||
|
cil_list_for_each(curr, list) {
|
||||||
|
if (curr->data == data) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_list_match_any(struct cil_list *l1, struct cil_list *l2)
|
||||||
|
{
|
||||||
|
struct cil_list_item *i1;
|
||||||
|
struct cil_list_item *i2;
|
||||||
|
|
||||||
|
cil_list_for_each(i1, l1) {
|
||||||
|
cil_list_for_each(i2, l2) {
|
||||||
|
if (i1->data == i2->data && i1->flavor == i2->flavor) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
64
kernel/libsepol/cil/src/cil_list.h
Normal file
64
kernel/libsepol/cil/src/cil_list.h
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_LIST_H_
|
||||||
|
#define CIL_LIST_H_
|
||||||
|
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
|
||||||
|
struct cil_list {
|
||||||
|
struct cil_list_item *head;
|
||||||
|
struct cil_list_item *tail;
|
||||||
|
enum cil_flavor flavor;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_list_item {
|
||||||
|
struct cil_list_item *next;
|
||||||
|
enum cil_flavor flavor;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define cil_list_for_each(item, list) \
|
||||||
|
for (item = (list)->head; item != NULL; item = item->next)
|
||||||
|
|
||||||
|
|
||||||
|
void cil_list_init(struct cil_list **list, enum cil_flavor flavor);
|
||||||
|
void cil_list_destroy (struct cil_list **list, unsigned destroy_data);
|
||||||
|
void cil_list_item_init(struct cil_list_item **item);
|
||||||
|
void cil_list_item_destroy(struct cil_list_item **item, unsigned destroy_data);
|
||||||
|
void cil_list_append(struct cil_list *list, enum cil_flavor flavor, void *data);
|
||||||
|
void cil_list_prepend(struct cil_list *list, enum cil_flavor flavor, void *data);
|
||||||
|
void cil_list_remove(struct cil_list *list, enum cil_flavor flavor, void *data, unsigned destroy_data);
|
||||||
|
struct cil_list_item *cil_list_insert(struct cil_list *list, struct cil_list_item *curr, enum cil_flavor flavor, void *data);
|
||||||
|
void cil_list_append_item(struct cil_list *list, struct cil_list_item *item);
|
||||||
|
void cil_list_prepend_item(struct cil_list *list, struct cil_list_item *item);
|
||||||
|
int cil_list_contains(struct cil_list *list, void *data);
|
||||||
|
int cil_list_match_any(struct cil_list *l1, struct cil_list *l2);
|
||||||
|
|
||||||
|
#endif
|
||||||
82
kernel/libsepol/cil/src/cil_log.c
Normal file
82
kernel/libsepol/cil/src/cil_log.c
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <cil/cil.h>
|
||||||
|
#include "cil_log.h"
|
||||||
|
|
||||||
|
static enum cil_log_level cil_log_level = CIL_ERR;
|
||||||
|
|
||||||
|
static void cil_default_log_handler(__attribute__((unused)) int lvl, const char *msg)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void (*cil_log_handler)(int lvl, const char *msg) = &cil_default_log_handler;
|
||||||
|
|
||||||
|
void cil_set_log_handler(void (*handler)(int lvl, const char *msg))
|
||||||
|
{
|
||||||
|
cil_log_handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((format (printf, 2, 0))) void cil_vlog(enum cil_log_level lvl, const char *msg, va_list args)
|
||||||
|
{
|
||||||
|
if (cil_log_level >= lvl) {
|
||||||
|
char buff[MAX_LOG_SIZE];
|
||||||
|
int n = vsnprintf(buff, MAX_LOG_SIZE, msg, args);
|
||||||
|
if (n > 0) {
|
||||||
|
(*cil_log_handler)(cil_log_level, buff);
|
||||||
|
if (n >= MAX_LOG_SIZE) {
|
||||||
|
(*cil_log_handler)(cil_log_level, " <LOG MESSAGE TRUNCATED>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((format (printf, 2, 3))) void cil_log(enum cil_log_level lvl, const char *msg, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, msg);
|
||||||
|
cil_vlog(lvl, msg, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_set_log_level(enum cil_log_level lvl)
|
||||||
|
{
|
||||||
|
cil_log_level = lvl;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum cil_log_level cil_get_log_level(void)
|
||||||
|
{
|
||||||
|
return cil_log_level;
|
||||||
|
}
|
||||||
43
kernel/libsepol/cil/src/cil_log.h
Normal file
43
kernel/libsepol/cil/src/cil_log.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
#ifndef CIL_LOG_H_
|
||||||
|
#define CIL_LOG_H_
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <cil/cil.h>
|
||||||
|
|
||||||
|
#define MAX_LOG_SIZE 512
|
||||||
|
|
||||||
|
__attribute__ ((format(printf, 2, 0))) void cil_vlog(enum cil_log_level lvl, const char *msg, va_list args);
|
||||||
|
__attribute__ ((format(printf, 2, 3))) void cil_log(enum cil_log_level lvl, const char *msg, ...);
|
||||||
|
|
||||||
|
enum cil_log_level cil_get_log_level(void);
|
||||||
|
|
||||||
|
#endif // CIL_LOG_H_
|
||||||
110
kernel/libsepol/cil/src/cil_mem.c
Normal file
110
kernel/libsepol/cil/src/cil_mem.c
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_mem.h"
|
||||||
|
|
||||||
|
void *cil_malloc(size_t size)
|
||||||
|
{
|
||||||
|
void *mem = malloc(size);
|
||||||
|
if (mem == NULL){
|
||||||
|
if (size == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *cil_calloc(size_t num_elements, size_t element_size)
|
||||||
|
{
|
||||||
|
void *mem = calloc(num_elements, element_size);
|
||||||
|
if (mem == NULL){
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *cil_realloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
void *mem = realloc(ptr, size);
|
||||||
|
if (mem == NULL){
|
||||||
|
if (size == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *cil_strdup(const char *str)
|
||||||
|
{
|
||||||
|
char *mem = NULL;
|
||||||
|
|
||||||
|
if (str == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mem = strdup(str);
|
||||||
|
if (mem == NULL) {
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((format (printf, 2, 3))) int cil_asprintf(char **strp, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
rc = vasprintf(strp, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
if (rc == -1) {
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
41
kernel/libsepol/cil/src/cil_mem.h
Normal file
41
kernel/libsepol/cil/src/cil_mem.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_MEM_H_
|
||||||
|
#define CIL_MEM_H_
|
||||||
|
|
||||||
|
/* Wrapped malloc that catches errors and calls the error callback */
|
||||||
|
void *cil_malloc(size_t size);
|
||||||
|
void *cil_calloc(size_t num_elements, size_t element_size);
|
||||||
|
void *cil_realloc(void *ptr, size_t size);
|
||||||
|
char *cil_strdup(const char *str);
|
||||||
|
int cil_asprintf(char **strp, const char *fmt, ...);
|
||||||
|
|
||||||
|
#endif /* CIL_MEM_H_ */
|
||||||
|
|
||||||
331
kernel/libsepol/cil/src/cil_parser.c
Normal file
331
kernel/libsepol/cil/src/cil_parser.c
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sepol/errcodes.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_mem.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_lexer.h"
|
||||||
|
#include "cil_parser.h"
|
||||||
|
#include "cil_strpool.h"
|
||||||
|
#include "cil_stack.h"
|
||||||
|
|
||||||
|
#define CIL_PARSER_MAX_EXPR_DEPTH (0x1 << 12)
|
||||||
|
|
||||||
|
struct hll_info {
|
||||||
|
uint32_t hll_offset;
|
||||||
|
uint32_t hll_expand;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void push_hll_info(struct cil_stack *stack, uint32_t hll_offset, uint32_t hll_expand)
|
||||||
|
{
|
||||||
|
struct hll_info *new = cil_malloc(sizeof(*new));
|
||||||
|
|
||||||
|
new->hll_offset = hll_offset;
|
||||||
|
new->hll_expand = hll_expand;
|
||||||
|
|
||||||
|
cil_stack_push(stack, CIL_NONE, new);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pop_hll_info(struct cil_stack *stack, uint32_t *hll_offset, uint32_t *hll_expand)
|
||||||
|
{
|
||||||
|
struct cil_stack_item *curr = cil_stack_pop(stack);
|
||||||
|
struct hll_info *info;
|
||||||
|
|
||||||
|
if (!curr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
info = curr->data;
|
||||||
|
*hll_expand = info->hll_expand;
|
||||||
|
*hll_offset = info->hll_offset;
|
||||||
|
free(curr->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_node(struct cil_tree_node **node, struct cil_tree_node *current, uint32_t line, uint32_t hll_offset, void *value)
|
||||||
|
{
|
||||||
|
cil_tree_node_init(node);
|
||||||
|
(*node)->parent = current;
|
||||||
|
(*node)->flavor = CIL_NODE;
|
||||||
|
(*node)->line = line;
|
||||||
|
(*node)->hll_offset = hll_offset;
|
||||||
|
(*node)->data = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void insert_node(struct cil_tree_node *node, struct cil_tree_node *current)
|
||||||
|
{
|
||||||
|
if (current->cl_head == NULL) {
|
||||||
|
current->cl_head = node;
|
||||||
|
} else {
|
||||||
|
current->cl_tail->next = node;
|
||||||
|
}
|
||||||
|
current->cl_tail = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int add_hll_linemark(struct cil_tree_node **current, uint32_t *hll_offset, uint32_t *hll_expand, struct cil_stack *stack, char *path)
|
||||||
|
{
|
||||||
|
char *hll_type;
|
||||||
|
struct cil_tree_node *node;
|
||||||
|
struct token tok;
|
||||||
|
uint32_t prev_hll_expand, prev_hll_offset;
|
||||||
|
|
||||||
|
cil_lexer_next(&tok);
|
||||||
|
if (tok.type != SYMBOL) {
|
||||||
|
cil_log(CIL_ERR, "Invalid line mark syntax\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
hll_type = cil_strpool_add(tok.value);
|
||||||
|
if (hll_type != CIL_KEY_SRC_HLL_LME && hll_type != CIL_KEY_SRC_HLL_LMS && hll_type != CIL_KEY_SRC_HLL_LMX) {
|
||||||
|
cil_log(CIL_ERR, "Invalid line mark syntax\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (hll_type == CIL_KEY_SRC_HLL_LME) {
|
||||||
|
if (cil_stack_is_empty(stack)) {
|
||||||
|
cil_log(CIL_ERR, "Line mark end without start\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
prev_hll_expand = *hll_expand;
|
||||||
|
prev_hll_offset = *hll_offset;
|
||||||
|
pop_hll_info(stack, hll_offset, hll_expand);
|
||||||
|
if (!*hll_expand) {
|
||||||
|
/* This is needed if not going back to an lmx section. */
|
||||||
|
*hll_offset = prev_hll_offset;
|
||||||
|
}
|
||||||
|
if (prev_hll_expand && !*hll_expand) {
|
||||||
|
/* This is needed to count the lme at the end of an lmx section
|
||||||
|
* within an lms section (or within no hll section).
|
||||||
|
*/
|
||||||
|
(*hll_offset)++;
|
||||||
|
}
|
||||||
|
*current = (*current)->parent;
|
||||||
|
} else {
|
||||||
|
push_hll_info(stack, *hll_offset, *hll_expand);
|
||||||
|
if (cil_stack_number_of_items(stack) > CIL_PARSER_MAX_EXPR_DEPTH) {
|
||||||
|
cil_log(CIL_ERR, "Number of active line marks exceeds limit of %d\n", CIL_PARSER_MAX_EXPR_DEPTH);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
create_node(&node, *current, tok.line, *hll_offset, NULL);
|
||||||
|
insert_node(node, *current);
|
||||||
|
*current = node;
|
||||||
|
|
||||||
|
create_node(&node, *current, tok.line, *hll_offset, CIL_KEY_SRC_INFO);
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
create_node(&node, *current, tok.line, *hll_offset, hll_type);
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
cil_lexer_next(&tok);
|
||||||
|
if (tok.type != SYMBOL) {
|
||||||
|
cil_log(CIL_ERR, "Invalid line mark syntax\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
create_node(&node, *current, tok.line, *hll_offset, cil_strpool_add(tok.value));
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
cil_lexer_next(&tok);
|
||||||
|
if (tok.type != SYMBOL && tok.type != QSTRING) {
|
||||||
|
cil_log(CIL_ERR, "Invalid line mark syntax\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tok.type == QSTRING) {
|
||||||
|
tok.value[strlen(tok.value) - 1] = '\0';
|
||||||
|
tok.value = tok.value+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
create_node(&node, *current, tok.line, *hll_offset, cil_strpool_add(tok.value));
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
*hll_expand = (hll_type == CIL_KEY_SRC_HLL_LMX) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_lexer_next(&tok);
|
||||||
|
if (tok.type != NEWLINE) {
|
||||||
|
cil_log(CIL_ERR, "Invalid line mark syntax\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*hll_expand) {
|
||||||
|
/* Need to increment because of the NEWLINE */
|
||||||
|
(*hll_offset)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
cil_log(CIL_ERR, "Problem with high-level line mark at line %u of %s\n", tok.line, path);
|
||||||
|
return SEPOL_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add_cil_path(struct cil_tree_node **current, char *path)
|
||||||
|
{
|
||||||
|
struct cil_tree_node *node;
|
||||||
|
|
||||||
|
create_node(&node, *current, 0, 0, NULL);
|
||||||
|
insert_node(node, *current);
|
||||||
|
*current = node;
|
||||||
|
|
||||||
|
create_node(&node, *current, 0, 0, CIL_KEY_SRC_INFO);
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
create_node(&node, *current, 0, 0, CIL_KEY_SRC_CIL);
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
create_node(&node, *current, 0, 0, cil_strpool_add("1"));
|
||||||
|
insert_node(node, *current);
|
||||||
|
|
||||||
|
create_node(&node, *current, 0, 0, path);
|
||||||
|
insert_node(node, *current);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_parser(const char *_path, char *buffer, uint32_t size, struct cil_tree **parse_tree)
|
||||||
|
{
|
||||||
|
|
||||||
|
int paren_count = 0;
|
||||||
|
|
||||||
|
struct cil_tree *tree = NULL;
|
||||||
|
struct cil_tree_node *node = NULL;
|
||||||
|
struct cil_tree_node *current = NULL;
|
||||||
|
char *path = cil_strpool_add(_path);
|
||||||
|
struct cil_stack *stack;
|
||||||
|
uint32_t hll_offset = 1;
|
||||||
|
uint32_t hll_expand = 0;
|
||||||
|
struct token tok;
|
||||||
|
int rc = SEPOL_OK;
|
||||||
|
|
||||||
|
cil_stack_init(&stack);
|
||||||
|
|
||||||
|
cil_lexer_setup(buffer, size);
|
||||||
|
|
||||||
|
tree = *parse_tree;
|
||||||
|
current = tree->root;
|
||||||
|
|
||||||
|
add_cil_path(¤t, path);
|
||||||
|
|
||||||
|
do {
|
||||||
|
cil_lexer_next(&tok);
|
||||||
|
switch (tok.type) {
|
||||||
|
case HLL_LINEMARK:
|
||||||
|
rc = add_hll_linemark(¤t, &hll_offset, &hll_expand, stack, path);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OPAREN:
|
||||||
|
paren_count++;
|
||||||
|
if (paren_count > CIL_PARSER_MAX_EXPR_DEPTH) {
|
||||||
|
cil_log(CIL_ERR, "Number of open parenthesis exceeds limit of %d at line %d of %s\n", CIL_PARSER_MAX_EXPR_DEPTH, tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
create_node(&node, current, tok.line, hll_offset, NULL);
|
||||||
|
insert_node(node, current);
|
||||||
|
current = node;
|
||||||
|
break;
|
||||||
|
case CPAREN:
|
||||||
|
paren_count--;
|
||||||
|
if (paren_count < 0) {
|
||||||
|
cil_log(CIL_ERR, "Close parenthesis without matching open at line %d of %s\n", tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
current = current->parent;
|
||||||
|
break;
|
||||||
|
case QSTRING:
|
||||||
|
tok.value[strlen(tok.value) - 1] = '\0';
|
||||||
|
tok.value = tok.value+1;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case SYMBOL:
|
||||||
|
if (paren_count == 0) {
|
||||||
|
cil_log(CIL_ERR, "Symbol not inside parenthesis at line %d of %s\n", tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
create_node(&node, current, tok.line, hll_offset, cil_strpool_add(tok.value));
|
||||||
|
insert_node(node, current);
|
||||||
|
break;
|
||||||
|
case NEWLINE :
|
||||||
|
if (!hll_expand) {
|
||||||
|
hll_offset++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COMMENT:
|
||||||
|
while (tok.type != NEWLINE && tok.type != END_OF_FILE) {
|
||||||
|
cil_lexer_next(&tok);
|
||||||
|
}
|
||||||
|
if (!hll_expand) {
|
||||||
|
hll_offset++;
|
||||||
|
}
|
||||||
|
if (tok.type != END_OF_FILE) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHRU */
|
||||||
|
// Fall through if EOF
|
||||||
|
case END_OF_FILE:
|
||||||
|
if (paren_count > 0) {
|
||||||
|
cil_log(CIL_ERR, "Open parenthesis without matching close at line %d of %s\n", tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (!cil_stack_is_empty(stack)) {
|
||||||
|
cil_log(CIL_ERR, "High-level language line marker start without close at line %d of %s\n", tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UNKNOWN:
|
||||||
|
cil_log(CIL_ERR, "Invalid token '%s' at line %d of %s\n", tok.value, tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
default:
|
||||||
|
cil_log(CIL_ERR, "Unknown token type '%d' at line %d of %s\n", tok.type, tok.line, path);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (tok.type != END_OF_FILE);
|
||||||
|
|
||||||
|
cil_lexer_destroy();
|
||||||
|
|
||||||
|
cil_stack_destroy(&stack);
|
||||||
|
|
||||||
|
*parse_tree = tree;
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
while (!cil_stack_is_empty(stack)) {
|
||||||
|
pop_hll_info(stack, &hll_offset, &hll_expand);
|
||||||
|
}
|
||||||
|
cil_lexer_destroy();
|
||||||
|
cil_stack_destroy(&stack);
|
||||||
|
|
||||||
|
return SEPOL_ERR;
|
||||||
|
}
|
||||||
37
kernel/libsepol/cil/src/cil_parser.h
Normal file
37
kernel/libsepol/cil/src/cil_parser.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_PARSER_H_
|
||||||
|
#define CIL_PARSER_H_
|
||||||
|
|
||||||
|
#include "cil_tree.h"
|
||||||
|
|
||||||
|
int cil_parser(const char *path, char *buffer, uint32_t size, struct cil_tree **parse_tree);
|
||||||
|
|
||||||
|
#endif /* CIL_PARSER_H_ */
|
||||||
1989
kernel/libsepol/cil/src/cil_policy.c
Normal file
1989
kernel/libsepol/cil/src/cil_policy.c
Normal file
File diff suppressed because it is too large
Load Diff
37
kernel/libsepol/cil/src/cil_policy.h
Normal file
37
kernel/libsepol/cil/src/cil_policy.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_POLICY_H_
|
||||||
|
#define CIL_POLICY_H_
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
|
||||||
|
void cil_gen_policy(FILE *out, struct cil_db *db);
|
||||||
|
|
||||||
|
#endif
|
||||||
2575
kernel/libsepol/cil/src/cil_post.c
Normal file
2575
kernel/libsepol/cil/src/cil_post.c
Normal file
File diff suppressed because it is too large
Load Diff
46
kernel/libsepol/cil/src/cil_post.h
Normal file
46
kernel/libsepol/cil/src/cil_post.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_POST_H_
|
||||||
|
#define CIL_POST_H_
|
||||||
|
|
||||||
|
int cil_post_filecon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_ibpkeycon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_portcon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_ibendportcon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_genfscon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_netifcon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_nodecon_compare(const void *a, const void *b);
|
||||||
|
int cil_post_fsuse_compare(const void *a, const void *b);
|
||||||
|
|
||||||
|
int cil_post_context_sort(struct cil_db *db);
|
||||||
|
|
||||||
|
int cil_post_process(struct cil_db *db);
|
||||||
|
|
||||||
|
#endif
|
||||||
660
kernel/libsepol/cil/src/cil_reset_ast.c
Normal file
660
kernel/libsepol/cil/src/cil_reset_ast.c
Normal file
@@ -0,0 +1,660 @@
|
|||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
#include "cil_reset_ast.h"
|
||||||
|
#include "cil_symtab.h"
|
||||||
|
|
||||||
|
static inline void cil_reset_classperms_list(struct cil_list *cp_list);
|
||||||
|
static inline void cil_reset_level(struct cil_level *level);
|
||||||
|
static inline void cil_reset_levelrange(struct cil_levelrange *levelrange);
|
||||||
|
static inline void cil_reset_context(struct cil_context *context);
|
||||||
|
|
||||||
|
|
||||||
|
static int __class_reset_perm_values(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
|
||||||
|
{
|
||||||
|
struct cil_perm *perm = (struct cil_perm *)d;
|
||||||
|
|
||||||
|
perm->value -= *((int *)args);
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_class(struct cil_class *class)
|
||||||
|
{
|
||||||
|
if (class->common != NULL) {
|
||||||
|
/* Must assume that the common has been destroyed */
|
||||||
|
int num_common_perms = class->num_perms - class->perms.nprim;
|
||||||
|
cil_symtab_map(&class->perms, __class_reset_perm_values, &num_common_perms);
|
||||||
|
/* during a re-resolve, we need to reset the common, so a classcommon
|
||||||
|
* statement isn't seen as a duplicate */
|
||||||
|
class->num_perms = class->perms.nprim;
|
||||||
|
class->common = NULL; /* Must make this NULL or there will be an error when re-resolving */
|
||||||
|
}
|
||||||
|
class->ordered = CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_perm(struct cil_perm *perm)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&perm->classperms, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_classperms(struct cil_classperms *cp)
|
||||||
|
{
|
||||||
|
if (cp == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cp->class = NULL;
|
||||||
|
cil_list_destroy(&cp->perms, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_classpermission(struct cil_classpermission *cp)
|
||||||
|
{
|
||||||
|
if (cp == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_list_destroy(&cp->classperms, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_classperms_set(struct cil_classperms_set *cp_set)
|
||||||
|
{
|
||||||
|
if (cp_set == NULL || cp_set->set == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp_set->set->datum.name == NULL) {
|
||||||
|
cil_reset_classperms_list(cp_set->set->classperms);
|
||||||
|
}
|
||||||
|
|
||||||
|
cp_set->set = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_classperms_list(struct cil_list *cp_list)
|
||||||
|
{
|
||||||
|
struct cil_list_item *curr;
|
||||||
|
|
||||||
|
if (cp_list == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_list_for_each(curr, cp_list) {
|
||||||
|
if (curr->flavor == CIL_CLASSPERMS) { /* KERNEL or MAP */
|
||||||
|
cil_reset_classperms(curr->data);
|
||||||
|
} else if (curr->flavor == CIL_CLASSPERMS_SET) { /* SET */
|
||||||
|
cil_reset_classperms_set(curr->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_classpermissionset(struct cil_classpermissionset *cps)
|
||||||
|
{
|
||||||
|
cil_reset_classperms_list(cps->classperms);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_classmapping(struct cil_classmapping *cm)
|
||||||
|
{
|
||||||
|
cil_reset_classperms_list(cm->classperms);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_alias(struct cil_alias *alias)
|
||||||
|
{
|
||||||
|
/* reset actual to NULL during a re-resolve */
|
||||||
|
alias->actual = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_user(struct cil_user *user)
|
||||||
|
{
|
||||||
|
/* reset the bounds to NULL during a re-resolve */
|
||||||
|
user->bounds = NULL;
|
||||||
|
user->dftlevel = NULL;
|
||||||
|
user->range = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_userattr(struct cil_userattribute *attr)
|
||||||
|
{
|
||||||
|
struct cil_list_item *expr = NULL;
|
||||||
|
struct cil_list_item *next = NULL;
|
||||||
|
|
||||||
|
/* during a re-resolve, we need to reset the lists of expression stacks associated with this attribute from a userattribute statement */
|
||||||
|
if (attr->expr_list != NULL) {
|
||||||
|
/* we don't want to destroy the expression stacks (cil_list) inside
|
||||||
|
* this list cil_list_destroy destroys sublists, so we need to do it
|
||||||
|
* manually */
|
||||||
|
expr = attr->expr_list->head;
|
||||||
|
while (expr != NULL) {
|
||||||
|
next = expr->next;
|
||||||
|
cil_list_item_destroy(&expr, CIL_FALSE);
|
||||||
|
expr = next;
|
||||||
|
}
|
||||||
|
free(attr->expr_list);
|
||||||
|
attr->expr_list = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_userattributeset(struct cil_userattributeset *uas)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&uas->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_selinuxuser(struct cil_selinuxuser *selinuxuser)
|
||||||
|
{
|
||||||
|
selinuxuser->user = NULL;
|
||||||
|
if (selinuxuser->range_str == NULL) {
|
||||||
|
cil_reset_levelrange(selinuxuser->range);
|
||||||
|
} else {
|
||||||
|
selinuxuser->range = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_role(struct cil_role *role)
|
||||||
|
{
|
||||||
|
/* reset the bounds to NULL during a re-resolve */
|
||||||
|
role->bounds = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_roleattr(struct cil_roleattribute *attr)
|
||||||
|
{
|
||||||
|
/* during a re-resolve, we need to reset the lists of expression stacks associated with this attribute from a attributeroles statement */
|
||||||
|
if (attr->expr_list != NULL) {
|
||||||
|
/* we don't want to destroy the expression stacks (cil_list) inside
|
||||||
|
* this list cil_list_destroy destroys sublists, so we need to do it
|
||||||
|
* manually */
|
||||||
|
struct cil_list_item *expr = attr->expr_list->head;
|
||||||
|
while (expr != NULL) {
|
||||||
|
struct cil_list_item *next = expr->next;
|
||||||
|
cil_list_item_destroy(&expr, CIL_FALSE);
|
||||||
|
expr = next;
|
||||||
|
}
|
||||||
|
free(attr->expr_list);
|
||||||
|
attr->expr_list = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_roleattributeset(struct cil_roleattributeset *ras)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&ras->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_type(struct cil_type *type)
|
||||||
|
{
|
||||||
|
/* reset the bounds to NULL during a re-resolve */
|
||||||
|
type->bounds = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_typeattr(struct cil_typeattribute *attr)
|
||||||
|
{
|
||||||
|
/* during a re-resolve, we need to reset the lists of expression stacks associated with this attribute from a attributetypes statement */
|
||||||
|
if (attr->expr_list != NULL) {
|
||||||
|
/* we don't want to destroy the expression stacks (cil_list) inside
|
||||||
|
* this list cil_list_destroy destroys sublists, so we need to do it
|
||||||
|
* manually */
|
||||||
|
struct cil_list_item *expr = attr->expr_list->head;
|
||||||
|
while (expr != NULL) {
|
||||||
|
struct cil_list_item *next = expr->next;
|
||||||
|
cil_list_item_destroy(&expr, CIL_FALSE);
|
||||||
|
expr = next;
|
||||||
|
}
|
||||||
|
free(attr->expr_list);
|
||||||
|
attr->expr_list = NULL;
|
||||||
|
}
|
||||||
|
attr->used = CIL_FALSE;
|
||||||
|
attr->keep = CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_typeattributeset(struct cil_typeattributeset *tas)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&tas->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_expandtypeattribute(struct cil_expandtypeattribute *expandattr)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&expandattr->attr_datums, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_avrule(struct cil_avrule *rule)
|
||||||
|
{
|
||||||
|
cil_reset_classperms_list(rule->perms.classperms);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_rangetransition(struct cil_rangetransition *rangetrans)
|
||||||
|
{
|
||||||
|
if (rangetrans->range_str == NULL) {
|
||||||
|
cil_reset_levelrange(rangetrans->range);
|
||||||
|
} else {
|
||||||
|
rangetrans->range = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_sens(struct cil_sens *sens)
|
||||||
|
{
|
||||||
|
/* during a re-resolve, we need to reset the categories associated with
|
||||||
|
* this sensitivity from a (sensitivitycategory) statement */
|
||||||
|
cil_list_destroy(&sens->cats_list, CIL_FALSE);
|
||||||
|
sens->ordered = CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_cat(struct cil_cat *cat)
|
||||||
|
{
|
||||||
|
cat->ordered = CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_cats(struct cil_cats *cats)
|
||||||
|
{
|
||||||
|
if (cats != NULL) {
|
||||||
|
cats->evaluated = CIL_FALSE;
|
||||||
|
cil_list_destroy(&cats->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void cil_reset_senscat(struct cil_senscat *senscat)
|
||||||
|
{
|
||||||
|
cil_reset_cats(senscat->cats);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_catset(struct cil_catset *catset)
|
||||||
|
{
|
||||||
|
cil_reset_cats(catset->cats);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_level(struct cil_level *level)
|
||||||
|
{
|
||||||
|
level->sens = NULL;
|
||||||
|
cil_reset_cats(level->cats);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_levelrange(struct cil_levelrange *levelrange)
|
||||||
|
{
|
||||||
|
if (levelrange->low_str == NULL) {
|
||||||
|
cil_reset_level(levelrange->low);
|
||||||
|
} else {
|
||||||
|
levelrange->low = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (levelrange->high_str == NULL) {
|
||||||
|
cil_reset_level(levelrange->high);
|
||||||
|
} else {
|
||||||
|
levelrange->high = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_userlevel(struct cil_userlevel *userlevel)
|
||||||
|
{
|
||||||
|
if (userlevel->level_str == NULL) {
|
||||||
|
cil_reset_level(userlevel->level);
|
||||||
|
} else {
|
||||||
|
userlevel->level = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_userrange(struct cil_userrange *userrange)
|
||||||
|
{
|
||||||
|
if (userrange->range_str == NULL) {
|
||||||
|
cil_reset_levelrange(userrange->range);
|
||||||
|
} else {
|
||||||
|
userrange->range = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cil_reset_context(struct cil_context *context)
|
||||||
|
{
|
||||||
|
if (!context) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (context->range_str == NULL) {
|
||||||
|
cil_reset_levelrange(context->range);
|
||||||
|
} else {
|
||||||
|
context->range = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_sidcontext(struct cil_sidcontext *sidcontext)
|
||||||
|
{
|
||||||
|
if (sidcontext->context_str == NULL) {
|
||||||
|
cil_reset_context(sidcontext->context);
|
||||||
|
} else {
|
||||||
|
sidcontext->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_filecon(struct cil_filecon *filecon)
|
||||||
|
{
|
||||||
|
if (filecon->context_str == NULL) {
|
||||||
|
cil_reset_context(filecon->context);
|
||||||
|
} else {
|
||||||
|
filecon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_ibpkeycon(struct cil_ibpkeycon *ibpkeycon)
|
||||||
|
{
|
||||||
|
if (ibpkeycon->context_str == NULL) {
|
||||||
|
cil_reset_context(ibpkeycon->context);
|
||||||
|
} else {
|
||||||
|
ibpkeycon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_portcon(struct cil_portcon *portcon)
|
||||||
|
{
|
||||||
|
if (portcon->context_str == NULL) {
|
||||||
|
cil_reset_context(portcon->context);
|
||||||
|
} else {
|
||||||
|
portcon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_nodecon(struct cil_nodecon *nodecon)
|
||||||
|
{
|
||||||
|
if (nodecon->context_str == NULL) {
|
||||||
|
cil_reset_context(nodecon->context);
|
||||||
|
} else {
|
||||||
|
nodecon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_genfscon(struct cil_genfscon *genfscon)
|
||||||
|
{
|
||||||
|
if (genfscon->context_str == NULL) {
|
||||||
|
cil_reset_context(genfscon->context);
|
||||||
|
} else {
|
||||||
|
genfscon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_netifcon(struct cil_netifcon *netifcon)
|
||||||
|
{
|
||||||
|
if (netifcon->if_context_str == NULL) {
|
||||||
|
cil_reset_context(netifcon->if_context);
|
||||||
|
} else {
|
||||||
|
netifcon->if_context = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netifcon->packet_context_str == NULL) {
|
||||||
|
cil_reset_context(netifcon->packet_context);
|
||||||
|
} else {
|
||||||
|
netifcon->packet_context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_ibendportcon(struct cil_ibendportcon *ibendportcon)
|
||||||
|
{
|
||||||
|
if (ibendportcon->context_str == NULL) {
|
||||||
|
cil_reset_context(ibendportcon->context);
|
||||||
|
} else {
|
||||||
|
ibendportcon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_pirqcon(struct cil_pirqcon *pirqcon)
|
||||||
|
{
|
||||||
|
if (pirqcon->context_str == NULL) {
|
||||||
|
cil_reset_context(pirqcon->context);
|
||||||
|
} else {
|
||||||
|
pirqcon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_iomemcon(struct cil_iomemcon *iomemcon)
|
||||||
|
{
|
||||||
|
if (iomemcon->context_str == NULL) {
|
||||||
|
cil_reset_context(iomemcon->context);
|
||||||
|
} else {
|
||||||
|
iomemcon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_ioportcon(struct cil_ioportcon *ioportcon)
|
||||||
|
{
|
||||||
|
if (ioportcon->context_str == NULL) {
|
||||||
|
cil_reset_context(ioportcon->context);
|
||||||
|
} else {
|
||||||
|
ioportcon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_pcidevicecon(struct cil_pcidevicecon *pcidevicecon)
|
||||||
|
{
|
||||||
|
if (pcidevicecon->context_str == NULL) {
|
||||||
|
cil_reset_context(pcidevicecon->context);
|
||||||
|
} else {
|
||||||
|
pcidevicecon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_devicetreecon(struct cil_devicetreecon *devicetreecon)
|
||||||
|
{
|
||||||
|
if (devicetreecon->context_str == NULL) {
|
||||||
|
cil_reset_context(devicetreecon->context);
|
||||||
|
} else {
|
||||||
|
devicetreecon->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_fsuse(struct cil_fsuse *fsuse)
|
||||||
|
{
|
||||||
|
if (fsuse->context_str == NULL) {
|
||||||
|
cil_reset_context(fsuse->context);
|
||||||
|
} else {
|
||||||
|
fsuse->context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_sid(struct cil_sid *sid)
|
||||||
|
{
|
||||||
|
/* reset the context to NULL during a re-resolve */
|
||||||
|
sid->context = NULL;
|
||||||
|
sid->ordered = CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_constrain(struct cil_constrain *con)
|
||||||
|
{
|
||||||
|
cil_reset_classperms_list(con->classperms);
|
||||||
|
cil_list_destroy(&con->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_validatetrans(struct cil_validatetrans *vt)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&vt->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_default(struct cil_default *def)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&def->class_datums, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_defaultrange(struct cil_defaultrange *def)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&def->class_datums, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_reset_booleanif(struct cil_booleanif *bif)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&bif->datum_expr, CIL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __cil_reset_node(struct cil_tree_node *node, __attribute__((unused)) uint32_t *finished, __attribute__((unused)) void *extra_args)
|
||||||
|
{
|
||||||
|
switch (node->flavor) {
|
||||||
|
case CIL_CLASS:
|
||||||
|
cil_reset_class(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_PERM:
|
||||||
|
case CIL_MAP_PERM:
|
||||||
|
cil_reset_perm(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CLASSPERMISSION:
|
||||||
|
cil_reset_classpermission(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CLASSPERMISSIONSET:
|
||||||
|
cil_reset_classpermissionset(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CLASSMAPPING:
|
||||||
|
cil_reset_classmapping(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_TYPEALIAS:
|
||||||
|
case CIL_SENSALIAS:
|
||||||
|
case CIL_CATALIAS:
|
||||||
|
cil_reset_alias(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_USERRANGE:
|
||||||
|
cil_reset_userrange(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_USERLEVEL:
|
||||||
|
cil_reset_userlevel(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_USER:
|
||||||
|
cil_reset_user(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_USERATTRIBUTE:
|
||||||
|
cil_reset_userattr(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_USERATTRIBUTESET:
|
||||||
|
cil_reset_userattributeset(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_SELINUXUSERDEFAULT:
|
||||||
|
case CIL_SELINUXUSER:
|
||||||
|
cil_reset_selinuxuser(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_ROLE:
|
||||||
|
cil_reset_role(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_ROLEATTRIBUTE:
|
||||||
|
cil_reset_roleattr(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_ROLEATTRIBUTESET:
|
||||||
|
cil_reset_roleattributeset(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_TYPE:
|
||||||
|
cil_reset_type(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_TYPEATTRIBUTE:
|
||||||
|
cil_reset_typeattr(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_TYPEATTRIBUTESET:
|
||||||
|
cil_reset_typeattributeset(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_EXPANDTYPEATTRIBUTE:
|
||||||
|
cil_reset_expandtypeattribute(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_RANGETRANSITION:
|
||||||
|
cil_reset_rangetransition(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_AVRULE:
|
||||||
|
cil_reset_avrule(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_SENS:
|
||||||
|
cil_reset_sens(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CAT:
|
||||||
|
cil_reset_cat(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_SENSCAT:
|
||||||
|
cil_reset_senscat(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CATSET:
|
||||||
|
cil_reset_catset(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_LEVEL:
|
||||||
|
cil_reset_level(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_LEVELRANGE:
|
||||||
|
cil_reset_levelrange(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CONTEXT:
|
||||||
|
cil_reset_context(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_SIDCONTEXT:
|
||||||
|
cil_reset_sidcontext(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_FILECON:
|
||||||
|
cil_reset_filecon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_IBPKEYCON:
|
||||||
|
cil_reset_ibpkeycon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_IBENDPORTCON:
|
||||||
|
cil_reset_ibendportcon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_PORTCON:
|
||||||
|
cil_reset_portcon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_NODECON:
|
||||||
|
cil_reset_nodecon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_GENFSCON:
|
||||||
|
cil_reset_genfscon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_NETIFCON:
|
||||||
|
cil_reset_netifcon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_PIRQCON:
|
||||||
|
cil_reset_pirqcon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_IOMEMCON:
|
||||||
|
cil_reset_iomemcon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_IOPORTCON:
|
||||||
|
cil_reset_ioportcon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_PCIDEVICECON:
|
||||||
|
cil_reset_pcidevicecon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_DEVICETREECON:
|
||||||
|
cil_reset_devicetreecon(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_FSUSE:
|
||||||
|
cil_reset_fsuse(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_SID:
|
||||||
|
cil_reset_sid(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_CONSTRAIN:
|
||||||
|
case CIL_MLSCONSTRAIN:
|
||||||
|
cil_reset_constrain(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_VALIDATETRANS:
|
||||||
|
case CIL_MLSVALIDATETRANS:
|
||||||
|
cil_reset_validatetrans(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_DEFAULTUSER:
|
||||||
|
case CIL_DEFAULTROLE:
|
||||||
|
case CIL_DEFAULTTYPE:
|
||||||
|
cil_reset_default(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_DEFAULTRANGE:
|
||||||
|
cil_reset_defaultrange(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_BOOLEANIF:
|
||||||
|
cil_reset_booleanif(node->data);
|
||||||
|
break;
|
||||||
|
case CIL_TUNABLEIF:
|
||||||
|
case CIL_CALL:
|
||||||
|
break; /* Not effected by optional block disabling */
|
||||||
|
case CIL_MACRO:
|
||||||
|
case CIL_SIDORDER:
|
||||||
|
case CIL_CLASSORDER:
|
||||||
|
case CIL_CATORDER:
|
||||||
|
case CIL_SENSITIVITYORDER:
|
||||||
|
break; /* Nothing to reset */
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_reset_ast(struct cil_tree_node *current)
|
||||||
|
{
|
||||||
|
int rc = SEPOL_ERR;
|
||||||
|
|
||||||
|
rc = cil_tree_walk(current, __cil_reset_node, NULL, NULL, NULL);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
cil_log(CIL_ERR, "Failed to reset AST\n");
|
||||||
|
return SEPOL_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
8
kernel/libsepol/cil/src/cil_reset_ast.h
Normal file
8
kernel/libsepol/cil/src/cil_reset_ast.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef CIL_RESET_AST_H_
|
||||||
|
#define CIL_RESET_AST_H_
|
||||||
|
|
||||||
|
#include "cil_tree.h"
|
||||||
|
|
||||||
|
int cil_reset_ast(struct cil_tree_node *current);
|
||||||
|
|
||||||
|
#endif /* CIL_RESET_AST_H_ */
|
||||||
4479
kernel/libsepol/cil/src/cil_resolve_ast.c
Normal file
4479
kernel/libsepol/cil/src/cil_resolve_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
104
kernel/libsepol/cil/src/cil_resolve_ast.h
Normal file
104
kernel/libsepol/cil/src/cil_resolve_ast.h
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_RESOLVE_AST_H_
|
||||||
|
#define CIL_RESOLVE_AST_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
|
||||||
|
int cil_resolve_classorder(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_classperms(struct cil_tree_node *current, struct cil_classperms *cp, void *extra_args);
|
||||||
|
int cil_resolve_classpermissionset(struct cil_tree_node *current, struct cil_classpermissionset *cps, void *extra_args);
|
||||||
|
int cil_resolve_classperms_list(struct cil_tree_node *current, struct cil_list *cp_list, void *extra_args);
|
||||||
|
int cil_resolve_avrule(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_type_rule(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_typeattributeset(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_typealias(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_typebounds(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_typepermissive(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_nametypetransition(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_rangetransition(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_classcommon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_classmapping(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_userrole(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_userlevel(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_userrange(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_userbounds(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_userprefix(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_userattributeset(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_selinuxuser(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_roletype(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_roletransition(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_roleallow(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_roleattributeset(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_rolebounds(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_sensalias(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_catalias(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_catorder(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_sensitivityorder(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_cat_list(struct cil_tree_node *current, struct cil_list *cat_list, struct cil_list *res_cat_list, void *extra_args);
|
||||||
|
int cil_resolve_catset(struct cil_tree_node *current, struct cil_catset *catset, void *extra_args);
|
||||||
|
int cil_resolve_senscat(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_level(struct cil_tree_node *current, struct cil_level *level, void *extra_args);
|
||||||
|
int cil_resolve_levelrange(struct cil_tree_node *current, struct cil_levelrange *levelrange, void *extra_args);
|
||||||
|
int cil_resolve_constrain(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_validatetrans(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_context(struct cil_tree_node *current, struct cil_context *context, void *extra_args);
|
||||||
|
int cil_resolve_filecon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_ibpkeycon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_ibendportcon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_portcon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_genfscon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_nodecon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_netifcon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_pirqcon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_iomemcon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_ioportcon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_pcidevicecon(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_fsuse(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_sidcontext(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_sidorder(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_blockinherit(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_in(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_call1(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_resolve_call2(struct cil_tree_node *, void *extra_args);
|
||||||
|
int cil_resolve_name_call_args(struct cil_call *call, char *name, enum cil_sym_index sym_index, struct cil_symtab_datum **datum);
|
||||||
|
int cil_resolve_expr(enum cil_flavor expr_type, struct cil_list *str_expr, struct cil_list **datum_expr, struct cil_tree_node *parent, void *extra_args);
|
||||||
|
int cil_resolve_boolif(struct cil_tree_node *current, void *extra_args);
|
||||||
|
int cil_evaluate_expr(struct cil_list *datum_expr, uint16_t *result);
|
||||||
|
int cil_resolve_tunif(struct cil_tree_node *current, void *extra_args);
|
||||||
|
|
||||||
|
int cil_resolve_ast(struct cil_db *db, struct cil_tree_node *current);
|
||||||
|
int cil_resolve_name(struct cil_tree_node *ast_node, char *name, enum cil_sym_index sym_index, void *extra_args, struct cil_symtab_datum **datum);
|
||||||
|
int cil_resolve_name_keep_aliases(struct cil_tree_node *ast_node, char *name, enum cil_sym_index sym_index, void *extra_args, struct cil_symtab_datum **datum);
|
||||||
|
|
||||||
|
#endif /* CIL_RESOLVE_AST_H_ */
|
||||||
116
kernel/libsepol/cil/src/cil_stack.c
Normal file
116
kernel/libsepol/cil/src/cil_stack.c
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_mem.h"
|
||||||
|
#include "cil_stack.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define CIL_STACK_INIT_SIZE 16
|
||||||
|
|
||||||
|
void cil_stack_init(struct cil_stack **stack)
|
||||||
|
{
|
||||||
|
struct cil_stack *new_stack = cil_malloc(sizeof(*new_stack));
|
||||||
|
new_stack->stack = cil_malloc(sizeof(*(new_stack->stack)) * CIL_STACK_INIT_SIZE);
|
||||||
|
new_stack->size = CIL_STACK_INIT_SIZE;
|
||||||
|
new_stack->pos = -1;
|
||||||
|
*stack = new_stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_stack_destroy(struct cil_stack **stack)
|
||||||
|
{
|
||||||
|
if (stack == NULL || *stack == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
free((*stack)->stack);
|
||||||
|
free(*stack);
|
||||||
|
*stack = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_stack_empty(struct cil_stack *stack)
|
||||||
|
{
|
||||||
|
stack->pos = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_stack_is_empty(struct cil_stack *stack)
|
||||||
|
{
|
||||||
|
return (stack->pos == -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_stack_number_of_items(struct cil_stack *stack)
|
||||||
|
{
|
||||||
|
return stack->pos + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_stack_push(struct cil_stack *stack, enum cil_flavor flavor, void *data)
|
||||||
|
{
|
||||||
|
stack->pos++;
|
||||||
|
|
||||||
|
if (stack->pos == stack->size) {
|
||||||
|
stack->size *= 2;
|
||||||
|
stack->stack = cil_realloc(stack->stack, sizeof(*stack->stack) * stack->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
stack->stack[stack->pos].flavor = flavor;
|
||||||
|
stack->stack[stack->pos].data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cil_stack_item *cil_stack_pop(struct cil_stack *stack)
|
||||||
|
{
|
||||||
|
if (stack->pos == -1) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
stack->pos--;
|
||||||
|
return &stack->stack[stack->pos + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cil_stack_item *cil_stack_peek(struct cil_stack *stack)
|
||||||
|
{
|
||||||
|
if (stack->pos < 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &stack->stack[stack->pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cil_stack_item *cil_stack_peek_at(struct cil_stack *stack, int pos)
|
||||||
|
{
|
||||||
|
int peekpos = stack->pos - pos;
|
||||||
|
|
||||||
|
if (peekpos < 0 || peekpos > stack->pos) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &stack->stack[peekpos];
|
||||||
|
}
|
||||||
63
kernel/libsepol/cil/src/cil_stack.h
Normal file
63
kernel/libsepol/cil/src/cil_stack.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_STACK_H_
|
||||||
|
#define CIL_STACK_H_
|
||||||
|
|
||||||
|
struct cil_stack {
|
||||||
|
struct cil_stack_item *stack;
|
||||||
|
int size;
|
||||||
|
int pos;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_stack_item {
|
||||||
|
enum cil_flavor flavor;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define cil_stack_for_each_starting_at(stack, start, pos, item) \
|
||||||
|
for (pos = start, item = cil_stack_peek_at(stack, pos); item != NULL; pos++, item = cil_stack_peek_at(stack, pos))
|
||||||
|
|
||||||
|
#define cil_stack_for_each(stack, pos, item) cil_stack_for_each_starting_at(stack, 0, pos, item)
|
||||||
|
|
||||||
|
|
||||||
|
void cil_stack_init(struct cil_stack **stack);
|
||||||
|
void cil_stack_destroy(struct cil_stack **stack);
|
||||||
|
|
||||||
|
void cil_stack_empty(struct cil_stack *stack);
|
||||||
|
int cil_stack_is_empty(struct cil_stack *stack);
|
||||||
|
int cil_stack_number_of_items(struct cil_stack *stack);
|
||||||
|
|
||||||
|
void cil_stack_push(struct cil_stack *stack, enum cil_flavor flavor, void *data);
|
||||||
|
struct cil_stack_item *cil_stack_pop(struct cil_stack *stack);
|
||||||
|
struct cil_stack_item *cil_stack_peek(struct cil_stack *stack);
|
||||||
|
struct cil_stack_item *cil_stack_peek_at(struct cil_stack *stack, int pos);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
123
kernel/libsepol/cil/src/cil_strpool.c
Normal file
123
kernel/libsepol/cil/src/cil_strpool.c
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "cil_mem.h"
|
||||||
|
#include "cil_strpool.h"
|
||||||
|
|
||||||
|
#include "cil_log.h"
|
||||||
|
#define CIL_STRPOOL_TABLE_SIZE 1 << 15
|
||||||
|
|
||||||
|
struct cil_strpool_entry {
|
||||||
|
char *str;
|
||||||
|
};
|
||||||
|
|
||||||
|
static pthread_mutex_t cil_strpool_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static unsigned int cil_strpool_readers = 0;
|
||||||
|
static hashtab_t cil_strpool_tab = NULL;
|
||||||
|
|
||||||
|
static unsigned int cil_strpool_hash(hashtab_t h, const_hashtab_key_t key)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
size_t size;
|
||||||
|
unsigned int val;
|
||||||
|
|
||||||
|
val = 0;
|
||||||
|
size = strlen(key);
|
||||||
|
for (p = key; ((size_t) (p - key)) < size; p++)
|
||||||
|
val =
|
||||||
|
(val << 4 | (val >> (8 * sizeof(unsigned int) - 4))) ^ (*p);
|
||||||
|
return val & (h->size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_strpool_compare(hashtab_t h __attribute__ ((unused)), const_hashtab_key_t key1, const_hashtab_key_t key2)
|
||||||
|
{
|
||||||
|
return strcmp(key1, key2);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *cil_strpool_add(const char *str)
|
||||||
|
{
|
||||||
|
struct cil_strpool_entry *strpool_ref = NULL;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&cil_strpool_mutex);
|
||||||
|
|
||||||
|
strpool_ref = hashtab_search(cil_strpool_tab, str);
|
||||||
|
if (strpool_ref == NULL) {
|
||||||
|
int rc;
|
||||||
|
strpool_ref = cil_malloc(sizeof(*strpool_ref));
|
||||||
|
strpool_ref->str = cil_strdup(str);
|
||||||
|
rc = hashtab_insert(cil_strpool_tab, strpool_ref->str, strpool_ref);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
pthread_mutex_unlock(&cil_strpool_mutex);
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&cil_strpool_mutex);
|
||||||
|
return strpool_ref->str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cil_strpool_entry_destroy(hashtab_key_t k __attribute__ ((unused)), hashtab_datum_t d, void *args __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
struct cil_strpool_entry *strpool_ref = (struct cil_strpool_entry*)d;
|
||||||
|
free(strpool_ref->str);
|
||||||
|
free(strpool_ref);
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_strpool_init(void)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&cil_strpool_mutex);
|
||||||
|
if (cil_strpool_tab == NULL) {
|
||||||
|
cil_strpool_tab = hashtab_create(cil_strpool_hash, cil_strpool_compare, CIL_STRPOOL_TABLE_SIZE);
|
||||||
|
if (cil_strpool_tab == NULL) {
|
||||||
|
pthread_mutex_unlock(&cil_strpool_mutex);
|
||||||
|
cil_log(CIL_ERR, "Failed to allocate memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cil_strpool_readers++;
|
||||||
|
pthread_mutex_unlock(&cil_strpool_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_strpool_destroy(void)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&cil_strpool_mutex);
|
||||||
|
cil_strpool_readers--;
|
||||||
|
if (cil_strpool_readers == 0) {
|
||||||
|
ksu_hashtab_map(cil_strpool_tab, cil_strpool_entry_destroy, NULL);
|
||||||
|
ksu_hashtab_destroy(cil_strpool_tab);
|
||||||
|
cil_strpool_tab = NULL;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&cil_strpool_mutex);
|
||||||
|
}
|
||||||
38
kernel/libsepol/cil/src/cil_strpool.h
Normal file
38
kernel/libsepol/cil/src/cil_strpool.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_STRPOOL_H_
|
||||||
|
#define CIL_STRPOOL_H_
|
||||||
|
|
||||||
|
#include <sepol/policydb/hashtab.h>
|
||||||
|
|
||||||
|
char *cil_strpool_add(const char *str);
|
||||||
|
void cil_strpool_init(void);
|
||||||
|
void cil_strpool_destroy(void);
|
||||||
|
#endif /* CIL_STRPOOL_H_ */
|
||||||
289
kernel/libsepol/cil/src/cil_symtab.c
Normal file
289
kernel/libsepol/cil/src/cil_symtab.c
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include <sepol/errcodes.h>
|
||||||
|
#include <sepol/policydb/hashtab.h>
|
||||||
|
#include <sepol/policydb/symtab.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_symtab.h"
|
||||||
|
#include "cil_mem.h"
|
||||||
|
#include "cil_strpool.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
|
||||||
|
__attribute__((noreturn)) __attribute__((format (printf, 1, 2))) static void cil_symtab_error(const char* msg, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, msg);
|
||||||
|
cil_vlog(CIL_ERR, msg, ap);
|
||||||
|
va_end(ap);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_symtab_init(symtab_t *symtab, unsigned int size)
|
||||||
|
{
|
||||||
|
int rc = ksu_symtab_init(symtab, size);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
cil_symtab_error("Failed to create symtab\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_symtab_datum_init(struct cil_symtab_datum *datum)
|
||||||
|
{
|
||||||
|
datum->name = NULL;
|
||||||
|
datum->fqn = NULL;
|
||||||
|
datum->symtab = NULL;
|
||||||
|
cil_list_init(&datum->nodes, CIL_LIST_ITEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_symtab_datum_destroy(struct cil_symtab_datum *datum)
|
||||||
|
{
|
||||||
|
cil_list_destroy(&datum->nodes, 0);
|
||||||
|
cil_symtab_remove_datum(datum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_symtab_datum_remove_node(struct cil_symtab_datum *datum, struct cil_tree_node *node)
|
||||||
|
{
|
||||||
|
if (datum && datum->nodes != NULL) {
|
||||||
|
cil_list_remove(datum->nodes, CIL_NODE, node, 0);
|
||||||
|
if (datum->nodes->head == NULL) {
|
||||||
|
cil_symtab_datum_destroy(datum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This both initializes the datum and inserts it into the symtab.
|
||||||
|
Note that cil_symtab_datum_destroy() is the analog to the initializer portion */
|
||||||
|
int cil_symtab_insert(symtab_t *symtab, hashtab_key_t key, struct cil_symtab_datum *datum, struct cil_tree_node *node)
|
||||||
|
{
|
||||||
|
int rc = hashtab_insert(symtab->table, key, (hashtab_datum_t)datum);
|
||||||
|
if (rc == SEPOL_OK) {
|
||||||
|
datum->name = key;
|
||||||
|
datum->fqn = key;
|
||||||
|
datum->symtab = symtab;
|
||||||
|
symtab->nprim++;
|
||||||
|
if (node) {
|
||||||
|
cil_list_append(datum->nodes, CIL_NODE, node);
|
||||||
|
}
|
||||||
|
} else if (rc != SEPOL_EEXIST) {
|
||||||
|
cil_symtab_error("Failed to insert datum into hashtab\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_symtab_remove_datum(struct cil_symtab_datum *datum)
|
||||||
|
{
|
||||||
|
symtab_t *symtab = datum->symtab;
|
||||||
|
|
||||||
|
if (symtab == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hashtab_remove(symtab->table, datum->name, NULL, NULL);
|
||||||
|
symtab->nprim--;
|
||||||
|
datum->symtab = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_symtab_get_datum(symtab_t *symtab, char *key, struct cil_symtab_datum **datum)
|
||||||
|
{
|
||||||
|
*datum = (struct cil_symtab_datum*)hashtab_search(symtab->table, (hashtab_key_t)key);
|
||||||
|
if (*datum == NULL) {
|
||||||
|
return SEPOL_ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_symtab_map(symtab_t *symtab,
|
||||||
|
int (*apply) (hashtab_key_t k, hashtab_datum_t d, void *args),
|
||||||
|
void *args)
|
||||||
|
{
|
||||||
|
return ksu_hashtab_map(symtab->table, apply, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __cil_symtab_destroy_helper(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, __attribute__((unused)) void *args)
|
||||||
|
{
|
||||||
|
struct cil_symtab_datum *datum = d;
|
||||||
|
datum->symtab = NULL;
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_symtab_destroy(symtab_t *symtab)
|
||||||
|
{
|
||||||
|
if (symtab->table != NULL){
|
||||||
|
cil_symtab_map(symtab, __cil_symtab_destroy_helper, NULL);
|
||||||
|
ksu_hashtab_destroy(symtab->table);
|
||||||
|
symtab->table = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cil_complex_symtab_hash(struct cil_complex_symtab_key *ckey, int mask, intptr_t *hash)
|
||||||
|
{
|
||||||
|
intptr_t sum = ckey->key1 + ckey->key2 + ckey->key3 + ckey->key4;
|
||||||
|
*hash = (intptr_t)((sum >> 2) & mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_complex_symtab_init(struct cil_complex_symtab *symtab, unsigned int size)
|
||||||
|
{
|
||||||
|
symtab->htable = cil_calloc(size, sizeof(struct cil_complex_symtab *));
|
||||||
|
|
||||||
|
symtab->nelems = 0;
|
||||||
|
symtab->nslots = size;
|
||||||
|
symtab->mask = size - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_complex_symtab_insert(struct cil_complex_symtab *symtab,
|
||||||
|
struct cil_complex_symtab_key *ckey,
|
||||||
|
struct cil_complex_symtab_datum *datum)
|
||||||
|
{
|
||||||
|
intptr_t hash;
|
||||||
|
struct cil_complex_symtab_node *node = NULL;
|
||||||
|
struct cil_complex_symtab_node *prev = NULL;
|
||||||
|
struct cil_complex_symtab_node *curr = NULL;
|
||||||
|
|
||||||
|
node = cil_malloc(sizeof(*node));
|
||||||
|
memset(node, 0, sizeof(*node));
|
||||||
|
|
||||||
|
node->ckey = ckey;
|
||||||
|
node->datum = datum;
|
||||||
|
|
||||||
|
cil_complex_symtab_hash(ckey, symtab->mask, &hash);
|
||||||
|
|
||||||
|
for (prev = NULL, curr = symtab->htable[hash]; curr != NULL;
|
||||||
|
prev = curr, curr = curr->next) {
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 == curr->ckey->key2 &&
|
||||||
|
ckey->key3 == curr->ckey->key3 &&
|
||||||
|
ckey->key4 == curr->ckey->key4) {
|
||||||
|
free(node);
|
||||||
|
return SEPOL_EEXIST;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 < curr->ckey->key2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 == curr->ckey->key2 &&
|
||||||
|
ckey->key3 < curr->ckey->key3) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 == curr->ckey->key2 &&
|
||||||
|
ckey->key3 == curr->ckey->key3 &&
|
||||||
|
ckey->key4 < curr->ckey->key4) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev != NULL) {
|
||||||
|
node->next = prev->next;
|
||||||
|
prev->next = node;
|
||||||
|
} else {
|
||||||
|
node->next = symtab->htable[hash];
|
||||||
|
symtab->htable[hash] = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
symtab->nelems++;
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_complex_symtab_search(struct cil_complex_symtab *symtab,
|
||||||
|
struct cil_complex_symtab_key *ckey,
|
||||||
|
struct cil_complex_symtab_datum **out)
|
||||||
|
{
|
||||||
|
intptr_t hash;
|
||||||
|
struct cil_complex_symtab_node *curr = NULL;
|
||||||
|
|
||||||
|
cil_complex_symtab_hash(ckey, symtab->mask, &hash);
|
||||||
|
for (curr = symtab->htable[hash]; curr != NULL; curr = curr->next) {
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 == curr->ckey->key2 &&
|
||||||
|
ckey->key3 == curr->ckey->key3 &&
|
||||||
|
ckey->key4 == curr->ckey->key4) {
|
||||||
|
*out = curr->datum;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 < curr->ckey->key2) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 == curr->ckey->key2 &&
|
||||||
|
ckey->key3 < curr->ckey->key3) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ckey->key1 == curr->ckey->key1 &&
|
||||||
|
ckey->key2 == curr->ckey->key2 &&
|
||||||
|
ckey->key3 == curr->ckey->key3 &&
|
||||||
|
ckey->key4 < curr->ckey->key4) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_complex_symtab_destroy(struct cil_complex_symtab *symtab)
|
||||||
|
{
|
||||||
|
struct cil_complex_symtab_node *curr = NULL;
|
||||||
|
struct cil_complex_symtab_node *temp = NULL;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (symtab == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < symtab->nslots; i++) {
|
||||||
|
curr = symtab->htable[i];
|
||||||
|
while (curr != NULL) {
|
||||||
|
temp = curr;
|
||||||
|
curr = curr->next;
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
symtab->htable[i] = NULL;
|
||||||
|
}
|
||||||
|
free(symtab->htable);
|
||||||
|
symtab->htable = NULL;
|
||||||
|
symtab->nelems = 0;
|
||||||
|
symtab->nslots = 0;
|
||||||
|
symtab->mask = 0;
|
||||||
|
}
|
||||||
89
kernel/libsepol/cil/src/cil_symtab.h
Normal file
89
kernel/libsepol/cil/src/cil_symtab.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CIL_SYMTAB_H_
|
||||||
|
#define __CIL_SYMTAB_H_
|
||||||
|
|
||||||
|
#include <sepol/policydb/symtab.h>
|
||||||
|
#include <sepol/policydb/hashtab.h>
|
||||||
|
|
||||||
|
#include "cil_tree.h"
|
||||||
|
|
||||||
|
struct cil_symtab_datum {
|
||||||
|
struct cil_list *nodes;
|
||||||
|
char *name;
|
||||||
|
char *fqn;
|
||||||
|
symtab_t *symtab;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DATUM(d) ((struct cil_symtab_datum *)(d))
|
||||||
|
#define NODE(n) ((struct cil_tree_node *)(DATUM(n)->nodes->head->data))
|
||||||
|
#define FLAVOR(f) (NODE(f)->flavor)
|
||||||
|
|
||||||
|
struct cil_complex_symtab_key {
|
||||||
|
intptr_t key1;
|
||||||
|
intptr_t key2;
|
||||||
|
intptr_t key3;
|
||||||
|
intptr_t key4;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_complex_symtab_datum {
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_complex_symtab_node {
|
||||||
|
struct cil_complex_symtab_key *ckey;
|
||||||
|
struct cil_complex_symtab_datum *datum;
|
||||||
|
struct cil_complex_symtab_node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_complex_symtab {
|
||||||
|
struct cil_complex_symtab_node **htable;
|
||||||
|
uint32_t nelems;
|
||||||
|
uint32_t nslots;
|
||||||
|
uint32_t mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
void cil_symtab_init(symtab_t *symtab, unsigned int size);
|
||||||
|
void cil_symtab_datum_init(struct cil_symtab_datum *datum);
|
||||||
|
void cil_symtab_datum_destroy(struct cil_symtab_datum *datum);
|
||||||
|
void cil_symtab_datum_remove_node(struct cil_symtab_datum *datum, struct cil_tree_node *node);
|
||||||
|
int cil_symtab_insert(symtab_t *symtab, hashtab_key_t key, struct cil_symtab_datum *datum, struct cil_tree_node *node);
|
||||||
|
void cil_symtab_remove_datum(struct cil_symtab_datum *datum);
|
||||||
|
int cil_symtab_get_datum(symtab_t *symtab, char *key, struct cil_symtab_datum **datum);
|
||||||
|
int cil_symtab_map(symtab_t *symtab,
|
||||||
|
int (*apply) (hashtab_key_t k, hashtab_datum_t d, void *args),
|
||||||
|
void *args);
|
||||||
|
void cil_symtab_destroy(symtab_t *symtab);
|
||||||
|
void cil_complex_symtab_init(struct cil_complex_symtab *symtab, unsigned int size);
|
||||||
|
int cil_complex_symtab_insert(struct cil_complex_symtab *symtab, struct cil_complex_symtab_key *ckey, struct cil_complex_symtab_datum *datum);
|
||||||
|
void cil_complex_symtab_search(struct cil_complex_symtab *symtab, struct cil_complex_symtab_key *ckey, struct cil_complex_symtab_datum **out);
|
||||||
|
void cil_complex_symtab_destroy(struct cil_complex_symtab *symtab);
|
||||||
|
|
||||||
|
#endif
|
||||||
337
kernel/libsepol/cil/src/cil_tree.c
Normal file
337
kernel/libsepol/cil/src/cil_tree.c
Normal file
@@ -0,0 +1,337 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#include <sepol/policydb/conditional.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_log.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
#include "cil_parser.h"
|
||||||
|
#include "cil_strpool.h"
|
||||||
|
|
||||||
|
struct cil_tree_node *cil_tree_get_next_path(struct cil_tree_node *node, char **info_kind, uint32_t *hll_line, char **path)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!node) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->parent;
|
||||||
|
|
||||||
|
while (node) {
|
||||||
|
if (node->flavor == CIL_NODE && node->data == NULL) {
|
||||||
|
if (node->cl_head && node->cl_head->data == CIL_KEY_SRC_INFO) {
|
||||||
|
if (!node->cl_head->next || !node->cl_head->next->next || !node->cl_head->next->next->next) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
/* Parse Tree */
|
||||||
|
*info_kind = node->cl_head->next->data;
|
||||||
|
rc = cil_string_to_uint32(node->cl_head->next->next->data, hll_line, 10);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
*path = node->cl_head->next->next->next->data;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
node = node->parent;
|
||||||
|
} else if (node->flavor == CIL_SRC_INFO) {
|
||||||
|
/* AST */
|
||||||
|
struct cil_src_info *info = node->data;
|
||||||
|
*info_kind = info->kind;
|
||||||
|
*hll_line = info->hll_line;
|
||||||
|
*path = info->path;
|
||||||
|
return node;
|
||||||
|
} else {
|
||||||
|
if (node->flavor == CIL_CALL) {
|
||||||
|
struct cil_call *call = node->data;
|
||||||
|
node = NODE(call->macro);
|
||||||
|
} else if (node->flavor == CIL_BLOCKINHERIT) {
|
||||||
|
struct cil_blockinherit *inherit = node->data;
|
||||||
|
node = NODE(inherit->block);
|
||||||
|
} else {
|
||||||
|
node = node->parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
*info_kind = NULL;
|
||||||
|
*hll_line = 0;
|
||||||
|
*path = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *cil_tree_get_cil_path(struct cil_tree_node *node)
|
||||||
|
{
|
||||||
|
char *info_kind;
|
||||||
|
uint32_t hll_line;
|
||||||
|
char *path;
|
||||||
|
|
||||||
|
while (node) {
|
||||||
|
node = cil_tree_get_next_path(node, &info_kind, &hll_line, &path);
|
||||||
|
if (node && info_kind == CIL_KEY_SRC_CIL) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((format (printf, 3, 4))) void cil_tree_log(struct cil_tree_node *node, enum cil_log_level lvl, const char* msg, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, msg);
|
||||||
|
cil_vlog(lvl, msg, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
if (node) {
|
||||||
|
char *path = NULL;
|
||||||
|
uint32_t hll_offset = node->hll_offset;
|
||||||
|
|
||||||
|
path = cil_tree_get_cil_path(node);
|
||||||
|
|
||||||
|
if (path != NULL) {
|
||||||
|
cil_log(lvl, " at %s:%u", path, node->line);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (node) {
|
||||||
|
do {
|
||||||
|
char *info_kind;
|
||||||
|
uint32_t hll_line;
|
||||||
|
|
||||||
|
node = cil_tree_get_next_path(node, &info_kind, &hll_line, &path);
|
||||||
|
if (!node || info_kind == CIL_KEY_SRC_CIL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (info_kind == CIL_KEY_SRC_HLL_LMS) {
|
||||||
|
hll_line += hll_offset - node->hll_offset - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_log(lvl," from %s:%u", path, hll_line);
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_log(lvl,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_tree_subtree_has_decl(struct cil_tree_node *node)
|
||||||
|
{
|
||||||
|
while (node) {
|
||||||
|
if (node->flavor >= CIL_MIN_DECLARATIVE) {
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
if (node->cl_head != NULL) {
|
||||||
|
if (cil_tree_subtree_has_decl(node->cl_head))
|
||||||
|
return CIL_TRUE;
|
||||||
|
}
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CIL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_tree_init(struct cil_tree **tree)
|
||||||
|
{
|
||||||
|
struct cil_tree *new_tree = cil_malloc(sizeof(*new_tree));
|
||||||
|
|
||||||
|
cil_tree_node_init(&new_tree->root);
|
||||||
|
|
||||||
|
*tree = new_tree;
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_tree_destroy(struct cil_tree **tree)
|
||||||
|
{
|
||||||
|
if (tree == NULL || *tree == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cil_tree_subtree_destroy((*tree)->root);
|
||||||
|
free(*tree);
|
||||||
|
*tree = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_tree_subtree_destroy(struct cil_tree_node *node)
|
||||||
|
{
|
||||||
|
cil_tree_children_destroy(node);
|
||||||
|
cil_tree_node_destroy(&node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_tree_children_destroy(struct cil_tree_node *node)
|
||||||
|
{
|
||||||
|
struct cil_tree_node *curr, *next;
|
||||||
|
|
||||||
|
if (!node) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
curr = node->cl_head;
|
||||||
|
while (curr) {
|
||||||
|
next = curr->next;
|
||||||
|
cil_tree_children_destroy(curr);
|
||||||
|
cil_tree_node_destroy(&curr);
|
||||||
|
curr = next;
|
||||||
|
}
|
||||||
|
node->cl_head = NULL;
|
||||||
|
node->cl_tail = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_tree_node_init(struct cil_tree_node **node)
|
||||||
|
{
|
||||||
|
struct cil_tree_node *new_node = cil_malloc(sizeof(*new_node));
|
||||||
|
new_node->cl_head = NULL;
|
||||||
|
new_node->cl_tail = NULL;
|
||||||
|
new_node->parent = NULL;
|
||||||
|
new_node->data = NULL;
|
||||||
|
new_node->next = NULL;
|
||||||
|
new_node->flavor = CIL_ROOT;
|
||||||
|
new_node->line = 0;
|
||||||
|
new_node->hll_offset = 0;
|
||||||
|
|
||||||
|
*node = new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cil_tree_node_destroy(struct cil_tree_node **node)
|
||||||
|
{
|
||||||
|
struct cil_symtab_datum *datum;
|
||||||
|
|
||||||
|
if (node == NULL || *node == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*node)->flavor >= CIL_MIN_DECLARATIVE) {
|
||||||
|
datum = (*node)->data;
|
||||||
|
cil_symtab_datum_remove_node(datum, *node);
|
||||||
|
if (datum->nodes == NULL) {
|
||||||
|
cil_destroy_data(&(*node)->data, (*node)->flavor);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cil_destroy_data(&(*node)->data, (*node)->flavor);
|
||||||
|
}
|
||||||
|
free(*node);
|
||||||
|
*node = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform depth-first walk of the tree
|
||||||
|
Parameters:
|
||||||
|
start_node: root node to start walking from
|
||||||
|
process_node: function to call when visiting a node
|
||||||
|
Takes parameters:
|
||||||
|
node: node being visited
|
||||||
|
finished: boolean indicating to the tree walker that it should move on from this branch
|
||||||
|
extra_args: additional data
|
||||||
|
first_child: Function to call before entering list of children
|
||||||
|
Takes parameters:
|
||||||
|
node: node of first child
|
||||||
|
extra args: additional data
|
||||||
|
last_child: Function to call when finished with the last child of a node's children
|
||||||
|
extra_args: any additional data to be passed to the helper functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int cil_tree_walk_core(struct cil_tree_node *node,
|
||||||
|
int (*process_node)(struct cil_tree_node *node, uint32_t *finished, void *extra_args),
|
||||||
|
int (*first_child)(struct cil_tree_node *node, void *extra_args),
|
||||||
|
int (*last_child)(struct cil_tree_node *node, void *extra_args),
|
||||||
|
void *extra_args)
|
||||||
|
{
|
||||||
|
int rc = SEPOL_ERR;
|
||||||
|
|
||||||
|
while (node) {
|
||||||
|
uint32_t finished = CIL_TREE_SKIP_NOTHING;
|
||||||
|
|
||||||
|
if (process_node != NULL) {
|
||||||
|
rc = (*process_node)(node, &finished, extra_args);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
cil_tree_log(node, CIL_INFO, "Problem");
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (finished & CIL_TREE_SKIP_NEXT) {
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node->cl_head != NULL && !(finished & CIL_TREE_SKIP_HEAD)) {
|
||||||
|
rc = cil_tree_walk(node, process_node, first_child, last_child, extra_args);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cil_tree_walk(struct cil_tree_node *node,
|
||||||
|
int (*process_node)(struct cil_tree_node *node, uint32_t *finished, void *extra_args),
|
||||||
|
int (*first_child)(struct cil_tree_node *node, void *extra_args),
|
||||||
|
int (*last_child)(struct cil_tree_node *node, void *extra_args),
|
||||||
|
void *extra_args)
|
||||||
|
{
|
||||||
|
int rc = SEPOL_ERR;
|
||||||
|
|
||||||
|
if (!node || !node->cl_head) {
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_child != NULL) {
|
||||||
|
rc = (*first_child)(node->cl_head, extra_args);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
cil_tree_log(node, CIL_INFO, "Problem");
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = cil_tree_walk_core(node->cl_head, process_node, first_child, last_child, extra_args);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (last_child != NULL) {
|
||||||
|
rc = (*last_child)(node->cl_tail, extra_args);
|
||||||
|
if (rc != SEPOL_OK) {
|
||||||
|
cil_tree_log(node, CIL_INFO, "Problem");
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEPOL_OK;
|
||||||
|
}
|
||||||
75
kernel/libsepol/cil/src/cil_tree.h
Normal file
75
kernel/libsepol/cil/src/cil_tree.h
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_TREE_H_
|
||||||
|
#define CIL_TREE_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
|
||||||
|
struct cil_tree {
|
||||||
|
struct cil_tree_node *root;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_tree_node {
|
||||||
|
struct cil_tree_node *parent;
|
||||||
|
struct cil_tree_node *cl_head; //Head of child_list
|
||||||
|
struct cil_tree_node *cl_tail; //Tail of child_list
|
||||||
|
struct cil_tree_node *next; //Each element in the list points to the next element
|
||||||
|
enum cil_flavor flavor;
|
||||||
|
uint32_t line;
|
||||||
|
uint32_t hll_offset;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_tree_node *cil_tree_get_next_path(struct cil_tree_node *node, char **info_kind, uint32_t *hll_line, char **path);
|
||||||
|
char *cil_tree_get_cil_path(struct cil_tree_node *node);
|
||||||
|
__attribute__((format (printf, 3, 4))) void cil_tree_log(struct cil_tree_node *node, enum cil_log_level lvl, const char* msg, ...);
|
||||||
|
|
||||||
|
int cil_tree_subtree_has_decl(struct cil_tree_node *node);
|
||||||
|
|
||||||
|
int cil_tree_init(struct cil_tree **tree);
|
||||||
|
void cil_tree_destroy(struct cil_tree **tree);
|
||||||
|
void cil_tree_subtree_destroy(struct cil_tree_node *node);
|
||||||
|
void cil_tree_children_destroy(struct cil_tree_node *node);
|
||||||
|
|
||||||
|
void cil_tree_node_init(struct cil_tree_node **node);
|
||||||
|
void cil_tree_node_destroy(struct cil_tree_node **node);
|
||||||
|
|
||||||
|
//finished values
|
||||||
|
#define CIL_TREE_SKIP_NOTHING 0
|
||||||
|
#define CIL_TREE_SKIP_NEXT 1
|
||||||
|
#define CIL_TREE_SKIP_HEAD 2
|
||||||
|
#define CIL_TREE_SKIP_ALL (CIL_TREE_SKIP_NOTHING | CIL_TREE_SKIP_NEXT | CIL_TREE_SKIP_HEAD)
|
||||||
|
int cil_tree_walk(struct cil_tree_node *start_node, int (*process_node)(struct cil_tree_node *node, uint32_t *finished, void *extra_args), int (*first_child)(struct cil_tree_node *node, void *extra_args), int (*last_child)(struct cil_tree_node *node, void *extra_args), void *extra_args);
|
||||||
|
|
||||||
|
#endif /* CIL_TREE_H_ */
|
||||||
|
|
||||||
1874
kernel/libsepol/cil/src/cil_verify.c
Normal file
1874
kernel/libsepol/cil/src/cil_verify.c
Normal file
File diff suppressed because it is too large
Load Diff
74
kernel/libsepol/cil/src/cil_verify.h
Normal file
74
kernel/libsepol/cil/src/cil_verify.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_VERIFY_H_
|
||||||
|
#define CIL_VERIFY_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "cil_internal.h"
|
||||||
|
#include "cil_flavor.h"
|
||||||
|
#include "cil_tree.h"
|
||||||
|
#include "cil_list.h"
|
||||||
|
|
||||||
|
enum cil_syntax {
|
||||||
|
CIL_SYN_STRING = 1 << 0,
|
||||||
|
CIL_SYN_LIST = 1 << 1,
|
||||||
|
CIL_SYN_EMPTY_LIST = 1 << 2,
|
||||||
|
CIL_SYN_N_LISTS = 1 << 3,
|
||||||
|
CIL_SYN_N_STRINGS = 1 << 4,
|
||||||
|
CIL_SYN_END = 1 << 5
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cil_args_verify {
|
||||||
|
struct cil_db *db;
|
||||||
|
struct cil_complex_symtab *csymtab;
|
||||||
|
int *avrule_cnt;
|
||||||
|
int *handleunknown;
|
||||||
|
int *mls;
|
||||||
|
int *nseuserdflt;
|
||||||
|
int *pass;
|
||||||
|
};
|
||||||
|
|
||||||
|
int cil_verify_name(const struct cil_db *db, const char *name, enum cil_flavor flavor);
|
||||||
|
int __cil_verify_syntax(struct cil_tree_node *parse_current, enum cil_syntax s[], size_t len);
|
||||||
|
int cil_verify_expr_syntax(struct cil_tree_node *current, enum cil_flavor op, enum cil_flavor expr_flavor);
|
||||||
|
int cil_verify_constraint_leaf_expr_syntax(enum cil_flavor l_flavor, enum cil_flavor r_flavor, enum cil_flavor op, enum cil_flavor expr_flavor);
|
||||||
|
int cil_verify_constraint_expr_syntax(struct cil_tree_node *current, enum cil_flavor op);
|
||||||
|
int cil_verify_conditional_blocks(struct cil_tree_node *current);
|
||||||
|
int cil_verify_decl_does_not_shadow_macro_parameter(struct cil_macro *macro, struct cil_tree_node *node, const char *name);
|
||||||
|
int __cil_verify_ranges(struct cil_list *list);
|
||||||
|
int __cil_verify_ordered_node_helper(struct cil_tree_node *node, uint32_t *finished, void *extra_args);
|
||||||
|
int __cil_verify_ordered(struct cil_tree_node *current, enum cil_flavor flavor);
|
||||||
|
int __cil_verify_initsids(struct cil_list *sids);
|
||||||
|
int __cil_verify_senscat(struct cil_sens *sens, struct cil_cat *cat);
|
||||||
|
int __cil_verify_helper(struct cil_tree_node *node, __attribute__((unused)) uint32_t *finished, void *extra_args);
|
||||||
|
int __cil_pre_verify_helper(struct cil_tree_node *node, __attribute__((unused)) uint32_t *finished, void *extra_args);
|
||||||
|
|
||||||
|
#endif
|
||||||
1627
kernel/libsepol/cil/src/cil_write_ast.c
Normal file
1627
kernel/libsepol/cil/src/cil_write_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
46
kernel/libsepol/cil/src/cil_write_ast.h
Normal file
46
kernel/libsepol/cil/src/cil_write_ast.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CIL_WRITE_AST_H_
|
||||||
|
#define CIL_WRITE_AST_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "cil_tree.h"
|
||||||
|
|
||||||
|
enum cil_write_ast_phase {
|
||||||
|
CIL_WRITE_AST_PHASE_PARSE = 0,
|
||||||
|
CIL_WRITE_AST_PHASE_BUILD,
|
||||||
|
CIL_WRITE_AST_PHASE_RESOLVE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void cil_write_ast_node(FILE *out, struct cil_tree_node *node);
|
||||||
|
int cil_write_ast(FILE *out, enum cil_write_ast_phase phase, struct cil_tree_node *node);
|
||||||
|
|
||||||
|
#endif /* CIL_WRITE_AST_H_ */
|
||||||
115
kernel/libsepol/cil/test/integration_testing/mls_policy.cil
Normal file
115
kernel/libsepol/cil/test/integration_testing/mls_policy.cil
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
(class testing (read open close write exec))
|
||||||
|
(class fooclass (read open close write exec))
|
||||||
|
|
||||||
|
(category c0)
|
||||||
|
(category c1)
|
||||||
|
(category c2)
|
||||||
|
(category c3)
|
||||||
|
(category c4)
|
||||||
|
(categoryalias c0 cat)
|
||||||
|
(categoryorder (c0 c1 c2 c3 c4))
|
||||||
|
(categoryset catset (c0 c2 c3))
|
||||||
|
(sensitivity s0)
|
||||||
|
(sensitivity s1)
|
||||||
|
(sensitivity s2)
|
||||||
|
(sensitivity s3)
|
||||||
|
(sensitivityalias s3 sens)
|
||||||
|
(dominance (s0 s1 s2 s3))
|
||||||
|
(sensitivitycategory s0 (c0 c2 c3))
|
||||||
|
(sensitivitycategory s0 (cat))
|
||||||
|
; the following causes a segfault
|
||||||
|
;(sensitivitycategory sens (c2))
|
||||||
|
(type foo_t)
|
||||||
|
(type typea_t)
|
||||||
|
(type typeb_t)
|
||||||
|
(type typec_t)
|
||||||
|
(role foo_r)
|
||||||
|
(role rolea_r)
|
||||||
|
(role roleb_r)
|
||||||
|
(user foo_u)
|
||||||
|
(user user_u)
|
||||||
|
(userrole foo_u foo_r)
|
||||||
|
(level low (s0 catset))
|
||||||
|
(level high (s0 (c0)))
|
||||||
|
(level test_l (s0 (cat)))
|
||||||
|
|
||||||
|
(sid test_sid)
|
||||||
|
(sidcontext test_sid (foo_u foo_r foo_t (s0 (c0)) (s0 (c0))))
|
||||||
|
(sid test_sid_anon_l)
|
||||||
|
(sidcontext test_sid_anon_l (foo_u foo_r foo_t low high))
|
||||||
|
|
||||||
|
(context con (foo_u foo_r foo_t low high))
|
||||||
|
(context con_anon_l (foo_u foo_r foo_t (s0 (c0)) high))
|
||||||
|
(fsuse xattr ext3 con)
|
||||||
|
(fsuse xattr ext3 con_anon_l)
|
||||||
|
|
||||||
|
(netifcon eth0 con con_anon_l)
|
||||||
|
|
||||||
|
(ipaddr ip_v4 192.25.35.200)
|
||||||
|
(ipaddr netmask 192.168.1.1)
|
||||||
|
(ipaddr ip_v6 2001:0DB8:AC10:FE01::)
|
||||||
|
(ipaddr netmask_v6 2001:0DE0:DA88:2222::)
|
||||||
|
; will need anon levels
|
||||||
|
(nodecon ip_v4 netmask con)
|
||||||
|
(nodecon ip_v6 netmask_v6 con_anon_l)
|
||||||
|
|
||||||
|
;needs anon levels
|
||||||
|
(portcon type 25 con)
|
||||||
|
|
||||||
|
(filecon root path file con)
|
||||||
|
|
||||||
|
(genfscon type path con)
|
||||||
|
|
||||||
|
(netifcon eth0 con con_anon_l)
|
||||||
|
|
||||||
|
(typemember typea_t typeb_t testing typec_t)
|
||||||
|
(typechange typea_t typeb_t testing typec_t)
|
||||||
|
(typetransition typea_t typeb_t testing typec_t)
|
||||||
|
|
||||||
|
(permissionset permset (open close))
|
||||||
|
(allow typea_t typeb_t testing (write))
|
||||||
|
(allow typea_t typeb_t testing permset)
|
||||||
|
|
||||||
|
(roleallow rolea_r roleb_r)
|
||||||
|
|
||||||
|
(rolebounds rolea_r roleb_r)
|
||||||
|
|
||||||
|
(roletransition foo_r foo_t testing rolea_r)
|
||||||
|
|
||||||
|
(level l2 (s0 (c0)))
|
||||||
|
(level h2 (s0 (c0)))
|
||||||
|
(mlsconstrain (fooclass testing)(open close)(eq l2 h2))
|
||||||
|
|
||||||
|
(common fooclass (open))
|
||||||
|
(classcommon fooclass fooclass)
|
||||||
|
|
||||||
|
(rangetransition typea_t typeb_t fooclass low high)
|
||||||
|
|
||||||
|
(nametypetransition string typea_t typeb_t fooclass foo_t)
|
||||||
|
|
||||||
|
(typepermissive foo_t)
|
||||||
|
|
||||||
|
(typebounds typea_t typeb_t)
|
||||||
|
|
||||||
|
(block test_b
|
||||||
|
(typealias .test_b.test typea_t)
|
||||||
|
(type test))
|
||||||
|
|
||||||
|
(attribute attrs)
|
||||||
|
(attributetypes attrs (foo_t))
|
||||||
|
|
||||||
|
(roletype foo_r foo_t)
|
||||||
|
|
||||||
|
(userbounds user_u foo_u)
|
||||||
|
|
||||||
|
(userrole user_u foo_r)
|
||||||
|
|
||||||
|
(bool foo_b true)
|
||||||
|
(bool baz_b false)
|
||||||
|
(booleanif (&& foo_b baz_b)
|
||||||
|
(allow typea_t typeb_t fooclass(read)))
|
||||||
|
;(class baz (read))
|
||||||
|
;(booleanif (&& foo_b baz_b)
|
||||||
|
; (allow foo_b baz_b fooclass (read)))
|
||||||
|
|
||||||
|
|
||||||
86
kernel/libsepol/cil/test/integration_testing/nonmls.cil
Normal file
86
kernel/libsepol/cil/test/integration_testing/nonmls.cil
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
(class testing (read open close write exec))
|
||||||
|
(class fooclass (read open close write exec))
|
||||||
|
|
||||||
|
(type foo_t)
|
||||||
|
(type typea_t)
|
||||||
|
(type typeb_t)
|
||||||
|
(type typec_t)
|
||||||
|
(role foo_r)
|
||||||
|
(role rolea_r)
|
||||||
|
(role roleb_r)
|
||||||
|
(user foo_u)
|
||||||
|
(user user_u)
|
||||||
|
(userrole foo_u foo_r)
|
||||||
|
|
||||||
|
(sid test_sid)
|
||||||
|
;(sidcontext test_sid (foo_u foo_r foo_t (s0 (c0)) (s0 (c0))))
|
||||||
|
;(sid test_sid_anon_l)
|
||||||
|
|
||||||
|
;(fsuse xattr ext3 con)
|
||||||
|
;(fsuse xattr ext3 con_anon_l)
|
||||||
|
|
||||||
|
;(netifcon eth0 con con_anon_l)
|
||||||
|
|
||||||
|
(ipaddr ip_v4 192.25.35.200)
|
||||||
|
(ipaddr netmask 192.168.1.1)
|
||||||
|
(ipaddr ip_v6 2001:0DB8:AC10:FE01::)
|
||||||
|
(ipaddr netmask_v6 2001:0DE0:DA88:2222::)
|
||||||
|
; will need anon levels
|
||||||
|
;(nodecon ip_v4 netmask con)
|
||||||
|
;(nodecon ip_v6 netmask_v6 con_anon_l)
|
||||||
|
|
||||||
|
;needs anon levels
|
||||||
|
;(portcon type 25 con)
|
||||||
|
|
||||||
|
;(filecon root path file con)
|
||||||
|
|
||||||
|
;(genfscon type path con)
|
||||||
|
|
||||||
|
;(netifcon eth0 con con_anon_l)
|
||||||
|
|
||||||
|
(typemember typea_t typeb_t testing typec_t)
|
||||||
|
(typechange typea_t typeb_t testing typec_t)
|
||||||
|
(typetransition typea_t typeb_t testing typec_t)
|
||||||
|
|
||||||
|
(permissionset permset (open close))
|
||||||
|
(allow typea_t typeb_t testing (write))
|
||||||
|
(allow typea_t typeb_t testing permset)
|
||||||
|
|
||||||
|
(roleallow rolea_r roleb_r)
|
||||||
|
|
||||||
|
(rolebounds rolea_r roleb_r)
|
||||||
|
|
||||||
|
(roletransition foo_r foo_t testing rolea_r)
|
||||||
|
|
||||||
|
(common fooclass (open))
|
||||||
|
(classcommon fooclass fooclass)
|
||||||
|
|
||||||
|
|
||||||
|
(nametypetransition string typea_t typeb_t fooclass foo_t)
|
||||||
|
|
||||||
|
(typepermissive foo_t)
|
||||||
|
|
||||||
|
(typebounds typea_t typeb_t)
|
||||||
|
|
||||||
|
(block test_b
|
||||||
|
(typealias .test_b.test typea_t)
|
||||||
|
(type test))
|
||||||
|
|
||||||
|
(attribute attrs)
|
||||||
|
(attributetypes attrs (foo_t))
|
||||||
|
|
||||||
|
(roletype foo_r foo_t)
|
||||||
|
|
||||||
|
(userbounds user_u foo_u)
|
||||||
|
|
||||||
|
(userrole user_u foo_r)
|
||||||
|
|
||||||
|
;(bool foo_b true)
|
||||||
|
;(bool baz_b false)
|
||||||
|
;(booleanif (&& foo_b baz_b)
|
||||||
|
; (allow typea_t typeb_t fooclass(read)))
|
||||||
|
;(class baz (read))
|
||||||
|
;(booleanif (&& foo_b baz_b)
|
||||||
|
; (allow foo_b baz_b fooclass (read)))
|
||||||
|
|
||||||
|
|
||||||
76
kernel/libsepol/cil/test/integration_testing/nonmls.conf
Normal file
76
kernel/libsepol/cil/test/integration_testing/nonmls.conf
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
class testing
|
||||||
|
class fooclass
|
||||||
|
|
||||||
|
sid test_sid
|
||||||
|
#end
|
||||||
|
|
||||||
|
#sid decl
|
||||||
|
sid security
|
||||||
|
|
||||||
|
|
||||||
|
class testing
|
||||||
|
{
|
||||||
|
read
|
||||||
|
open
|
||||||
|
close
|
||||||
|
write
|
||||||
|
exec
|
||||||
|
}
|
||||||
|
class fooclass
|
||||||
|
{
|
||||||
|
read
|
||||||
|
open
|
||||||
|
close
|
||||||
|
write
|
||||||
|
exec
|
||||||
|
}
|
||||||
|
#end
|
||||||
|
|
||||||
|
#attribs
|
||||||
|
|
||||||
|
attribute attrs;
|
||||||
|
#end
|
||||||
|
|
||||||
|
|
||||||
|
type foo_t, attrs;
|
||||||
|
type typea_t;
|
||||||
|
type typeb_t;
|
||||||
|
type typec_t;
|
||||||
|
#end
|
||||||
|
|
||||||
|
|
||||||
|
bool foo_b true;
|
||||||
|
bool baz_b false;
|
||||||
|
#end
|
||||||
|
|
||||||
|
|
||||||
|
role foo_r types foo_t;
|
||||||
|
role rolea_r;
|
||||||
|
role roleb_r;
|
||||||
|
#end
|
||||||
|
|
||||||
|
#role decl
|
||||||
|
|
||||||
|
|
||||||
|
allow typea_t typeb_t : testing write;
|
||||||
|
allow typea_t typeb_t : testing {open close};
|
||||||
|
type_transition typea_t typeb_t : testing typec_t;
|
||||||
|
#end
|
||||||
|
|
||||||
|
#audit rules
|
||||||
|
#dontaudit {kernel} unknown : dir search;
|
||||||
|
|
||||||
|
|
||||||
|
allow rolea_r roleb_r;
|
||||||
|
#end
|
||||||
|
|
||||||
|
#rbac stuff
|
||||||
|
#allow system {guest local_user};
|
||||||
|
#allow local_user guest;
|
||||||
|
|
||||||
|
|
||||||
|
user foo_u roles foo_r;
|
||||||
|
#end
|
||||||
|
|
||||||
|
sid test_sid foo_u:foo_r:foo_t
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
; Minimum policy
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(class foo (read))
|
||||||
|
|
||||||
|
(type bar)
|
||||||
|
(allow bar self (foo (read)))
|
||||||
|
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(sensitivity s0)
|
||||||
|
(sensitivity s1)
|
||||||
|
(sensitivity s2)
|
||||||
|
(sensitivity s3)
|
||||||
|
(sensitivity s4)
|
||||||
|
(sensitivity s5)
|
||||||
|
(sensitivity s6)
|
||||||
|
(sensitivity s7)
|
||||||
|
(sensitivity s8)
|
||||||
|
(sensitivity s9)
|
||||||
|
(dominance (s2 s3 s4))
|
||||||
|
(dominance (s1 s2 s4 s5))
|
||||||
|
(dominance (s5 s6 s8))
|
||||||
|
(dominance (s6 s7 s8 s9))
|
||||||
|
|
||||||
|
(category c0)
|
||||||
|
(category c1)
|
||||||
|
(category c2)
|
||||||
|
(category c3)
|
||||||
|
(category c4)
|
||||||
|
(category c5)
|
||||||
|
(category c6)
|
||||||
|
(category c7)
|
||||||
|
(category c8)
|
||||||
|
(category c9)
|
||||||
|
|
||||||
|
(categoryorder (c1 c3))
|
||||||
|
(categoryorder (c1 c2 c3))
|
||||||
|
(categoryorder (c5 c6 c7))
|
||||||
|
(categoryorder (c3 c4 c5))
|
||||||
|
(categoryorder (c7 c8 c9))
|
||||||
|
(categoryorder (c0 c1))
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
; Minimum policy
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(class foo (read))
|
||||||
|
|
||||||
|
(type bar)
|
||||||
|
(allow bar self (foo (read)))
|
||||||
|
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(sensitivity s0)
|
||||||
|
(sensitivity s1)
|
||||||
|
(sensitivity s2)
|
||||||
|
(sensitivity s3)
|
||||||
|
(sensitivity s4)
|
||||||
|
(sensitivity s5)
|
||||||
|
(sensitivity s6)
|
||||||
|
(sensitivity s7)
|
||||||
|
(sensitivity s8)
|
||||||
|
(sensitivity s9)
|
||||||
|
(dominance (s2 s3 s4))
|
||||||
|
(dominance (s1 s2 s4 s5))
|
||||||
|
(dominance (s5 s6 s8))
|
||||||
|
(dominance (s6 s7 s8 s9))
|
||||||
|
(dominance (s0 s1))
|
||||||
|
|
||||||
|
(category c0)
|
||||||
|
(category c1)
|
||||||
|
(category c2)
|
||||||
|
(category c3)
|
||||||
|
(category c4)
|
||||||
|
(category c5)
|
||||||
|
(category c6)
|
||||||
|
(category c7)
|
||||||
|
(category c8)
|
||||||
|
(category c9)
|
||||||
|
|
||||||
|
(categoryorder (c1 c3))
|
||||||
|
(categoryorder (c1 c2 c3))
|
||||||
|
(categoryorder (c5 c6 c7))
|
||||||
|
(categoryorder (c3 c4 c5))
|
||||||
|
(categoryorder (c7 c8 c9))
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
; Minimum policy
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(class foo (read))
|
||||||
|
|
||||||
|
(type bar)
|
||||||
|
(allow bar self (foo (read)))
|
||||||
|
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(sensitivity s0)
|
||||||
|
(sensitivity s1)
|
||||||
|
(sensitivity s2)
|
||||||
|
(sensitivity s3)
|
||||||
|
(sensitivity s4)
|
||||||
|
(sensitivity s5)
|
||||||
|
(sensitivity s6)
|
||||||
|
(sensitivity s7)
|
||||||
|
(sensitivity s8)
|
||||||
|
(sensitivity s9)
|
||||||
|
(dominance (s2 s3 s4))
|
||||||
|
(dominance (s1 s2 s5))
|
||||||
|
(dominance (s5 s6 s8))
|
||||||
|
(dominance (s6 s7 s8 s9))
|
||||||
|
(dominance (s0 s1))
|
||||||
|
|
||||||
|
(category c0)
|
||||||
|
(category c1)
|
||||||
|
(category c2)
|
||||||
|
(category c3)
|
||||||
|
(category c4)
|
||||||
|
(category c5)
|
||||||
|
(category c6)
|
||||||
|
(category c7)
|
||||||
|
(category c8)
|
||||||
|
(category c9)
|
||||||
|
|
||||||
|
(categoryorder (c1 c3))
|
||||||
|
(categoryorder (c1 c2 c3))
|
||||||
|
(categoryorder (c5 c6 c7))
|
||||||
|
(categoryorder (c3 c4 c5))
|
||||||
|
(categoryorder (c7 c8 c9))
|
||||||
|
(categoryorder (c0 c1))
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
; Minimum policy
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(class foo (read))
|
||||||
|
|
||||||
|
(type bar)
|
||||||
|
(allow bar self (foo (read)))
|
||||||
|
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(sensitivity s0)
|
||||||
|
(sensitivity s1)
|
||||||
|
(sensitivity s2)
|
||||||
|
(sensitivity s3)
|
||||||
|
(sensitivity s4)
|
||||||
|
(sensitivity s5)
|
||||||
|
(sensitivity s6)
|
||||||
|
(sensitivity s7)
|
||||||
|
(sensitivity s8)
|
||||||
|
(sensitivity s9)
|
||||||
|
(dominance (s0 s1 s2 s3 s4 s5 s6 s7 s8 s9))
|
||||||
|
|
||||||
|
(category c0)
|
||||||
|
(category c1)
|
||||||
|
(category c2)
|
||||||
|
(category c3)
|
||||||
|
(category c4)
|
||||||
|
(category c5)
|
||||||
|
(category c6)
|
||||||
|
(category c7)
|
||||||
|
(category c8)
|
||||||
|
(category c9)
|
||||||
|
|
||||||
|
(categoryorder (c2 c3 c4 c5))
|
||||||
|
(categoryorder (c0 c1 c2 c3))
|
||||||
|
(categoryorder (c5 c6 c7))
|
||||||
|
(categoryorder (c7 c8 c9))
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
; Minimum policy
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(class foo (read))
|
||||||
|
|
||||||
|
(type bar)
|
||||||
|
(allow bar self (foo (read)))
|
||||||
|
|
||||||
|
; ****************************
|
||||||
|
|
||||||
|
(sensitivity s0)
|
||||||
|
(sensitivity s1)
|
||||||
|
(sensitivity s2)
|
||||||
|
(sensitivity s3)
|
||||||
|
(sensitivity s4)
|
||||||
|
(sensitivity s5)
|
||||||
|
(sensitivity s6)
|
||||||
|
(sensitivity s7)
|
||||||
|
(sensitivity s8)
|
||||||
|
(sensitivity s9)
|
||||||
|
(dominance (s2 s3 s4))
|
||||||
|
(dominance (s1 s2 s4 s5))
|
||||||
|
(dominance (s5 s6 s8))
|
||||||
|
(dominance (s6 s7 s8 s9))
|
||||||
|
(dominance (s0 s1))
|
||||||
|
|
||||||
|
(category c0)
|
||||||
|
(category c1)
|
||||||
|
(category c2)
|
||||||
|
(category c3)
|
||||||
|
(category c4)
|
||||||
|
(category c5)
|
||||||
|
(category c6)
|
||||||
|
(category c7)
|
||||||
|
(category c8)
|
||||||
|
(category c9)
|
||||||
|
|
||||||
|
(categoryorder (c1 c3))
|
||||||
|
(categoryorder (c1 c2 c3))
|
||||||
|
(categoryorder (c5 c6 c7))
|
||||||
|
(categoryorder (c3 c4 c5))
|
||||||
|
(categoryorder (c7 c8 c9))
|
||||||
|
(categoryorder (c0 c1))
|
||||||
5
kernel/libsepol/cil/test/integration_testing/small.cil
Normal file
5
kernel/libsepol/cil/test/integration_testing/small.cil
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
(class foo (read))
|
||||||
|
|
||||||
|
(type bar)
|
||||||
|
(allow bar self (foo (read)))
|
||||||
|
|
||||||
76
kernel/libsepol/cil/test/unit/AllTests.c
Normal file
76
kernel/libsepol/cil/test/unit/AllTests.c
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "../../src/cil_log.h"
|
||||||
|
|
||||||
|
CuSuite* CilTreeGetSuite(void);
|
||||||
|
CuSuite* CilTreeGetResolveSuite(void);
|
||||||
|
CuSuite* CilTreeGetBuildSuite(void);
|
||||||
|
CuSuite* CilTestFullCil(void);
|
||||||
|
|
||||||
|
void RunAllTests(void) {
|
||||||
|
/* disable cil log output */
|
||||||
|
cil_set_log_level(0);
|
||||||
|
|
||||||
|
CuString *output = CuStringNew();
|
||||||
|
CuSuite* suite = CuSuiteNew();
|
||||||
|
CuSuite* suiteResolve = CuSuiteNew();
|
||||||
|
CuSuite* suiteBuild = CuSuiteNew();
|
||||||
|
CuSuite* suiteIntegration = CuSuiteNew();
|
||||||
|
|
||||||
|
CuSuiteAddSuite(suite, CilTreeGetSuite());
|
||||||
|
CuSuiteAddSuite(suiteResolve, CilTreeGetResolveSuite());
|
||||||
|
CuSuiteAddSuite(suiteBuild, CilTreeGetBuildSuite());
|
||||||
|
CuSuiteAddSuite(suiteIntegration, CilTestFullCil());
|
||||||
|
|
||||||
|
CuSuiteRun(suite);
|
||||||
|
CuSuiteDetails(suite, output);
|
||||||
|
CuSuiteSummary(suite, output);
|
||||||
|
|
||||||
|
CuSuiteRun(suiteResolve);
|
||||||
|
CuSuiteDetails(suiteResolve, output);
|
||||||
|
CuSuiteSummary(suiteResolve, output);
|
||||||
|
|
||||||
|
CuSuiteRun(suiteBuild);
|
||||||
|
CuSuiteDetails(suiteBuild, output);
|
||||||
|
CuSuiteSummary(suiteBuild, output);
|
||||||
|
|
||||||
|
CuSuiteRun(suiteIntegration);
|
||||||
|
CuSuiteDetails(suiteIntegration, output);
|
||||||
|
CuSuiteSummary(suiteIntegration, output);
|
||||||
|
printf("\n%s\n", output->buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(__attribute__((unused)) int argc, __attribute__((unused)) char *argv[]) {
|
||||||
|
RunAllTests();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
1974
kernel/libsepol/cil/test/unit/CilTest.c
Normal file
1974
kernel/libsepol/cil/test/unit/CilTest.c
Normal file
File diff suppressed because it is too large
Load Diff
44
kernel/libsepol/cil/test/unit/CilTest.h
Normal file
44
kernel/libsepol/cil/test/unit/CilTest.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CILTEST_H_
|
||||||
|
#define CILTEST_H_
|
||||||
|
|
||||||
|
#include "../../src/cil_tree.h"
|
||||||
|
|
||||||
|
// TODO Check more in the data structures
|
||||||
|
struct cil_file_data {
|
||||||
|
char *buffer;
|
||||||
|
uint32_t file_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
void set_cil_file_data(struct cil_file_data **);
|
||||||
|
void gen_test_tree(struct cil_tree **, char **);
|
||||||
|
|
||||||
|
#endif
|
||||||
362
kernel/libsepol/cil/test/unit/CuTest.c
Normal file
362
kernel/libsepol/cil/test/unit/CuTest.c
Normal file
@@ -0,0 +1,362 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Asim Jalis
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software in
|
||||||
|
* a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
* be misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*
|
||||||
|
* CuStr
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
char* CuStrAlloc(int size)
|
||||||
|
{
|
||||||
|
char* newStr = (char*) malloc( sizeof(char) * (size) );
|
||||||
|
return newStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* CuStrCopy(const char* old)
|
||||||
|
{
|
||||||
|
int len = strlen(old);
|
||||||
|
char* newStr = CuStrAlloc(len + 1);
|
||||||
|
strcpy(newStr, old);
|
||||||
|
return newStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*
|
||||||
|
* CuString
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void CuStringInit(CuString* str)
|
||||||
|
{
|
||||||
|
str->length = 0;
|
||||||
|
str->size = STRING_MAX;
|
||||||
|
str->buffer = (char*) malloc(sizeof(char) * str->size);
|
||||||
|
str->buffer[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
CuString* CuStringNew(void)
|
||||||
|
{
|
||||||
|
CuString* str = (CuString*) malloc(sizeof(CuString));
|
||||||
|
str->length = 0;
|
||||||
|
str->size = STRING_MAX;
|
||||||
|
str->buffer = (char*) malloc(sizeof(char) * str->size);
|
||||||
|
str->buffer[0] = '\0';
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuStringDelete(CuString *str)
|
||||||
|
{
|
||||||
|
if (!str) return;
|
||||||
|
free(str->buffer);
|
||||||
|
free(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuStringResize(CuString* str, int newSize)
|
||||||
|
{
|
||||||
|
str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize);
|
||||||
|
str->size = newSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuStringAppend(CuString* str, const char* text)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
|
||||||
|
if (text == NULL) {
|
||||||
|
text = "NULL";
|
||||||
|
}
|
||||||
|
|
||||||
|
length = strlen(text);
|
||||||
|
if (str->length + length + 1 >= str->size)
|
||||||
|
CuStringResize(str, str->length + length + 1 + STRING_INC);
|
||||||
|
str->length += length;
|
||||||
|
strcat(str->buffer, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuStringAppendChar(CuString* str, char ch)
|
||||||
|
{
|
||||||
|
char text[2];
|
||||||
|
text[0] = ch;
|
||||||
|
text[1] = '\0';
|
||||||
|
CuStringAppend(str, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((format (printf, 2, 3))) void CuStringAppendFormat(CuString* str, const char* format, ...)
|
||||||
|
{
|
||||||
|
va_list argp;
|
||||||
|
char buf[HUGE_STRING_LEN];
|
||||||
|
va_start(argp, format);
|
||||||
|
vsprintf(buf, format, argp);
|
||||||
|
va_end(argp);
|
||||||
|
CuStringAppend(str, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuStringInsert(CuString* str, const char* text, int pos)
|
||||||
|
{
|
||||||
|
int length = strlen(text);
|
||||||
|
if (pos > str->length)
|
||||||
|
pos = str->length;
|
||||||
|
if (str->length + length + 1 >= str->size)
|
||||||
|
CuStringResize(str, str->length + length + 1 + STRING_INC);
|
||||||
|
memmove(str->buffer + pos + length, str->buffer + pos, (str->length - pos) + 1);
|
||||||
|
str->length += length;
|
||||||
|
memcpy(str->buffer + pos, text, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*
|
||||||
|
* CuTest
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void CuTestInit(CuTest* t, const char* name, TestFunction function)
|
||||||
|
{
|
||||||
|
t->name = CuStrCopy(name);
|
||||||
|
t->failed = 0;
|
||||||
|
t->ran = 0;
|
||||||
|
t->message = NULL;
|
||||||
|
t->function = function;
|
||||||
|
t->jumpBuf = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
CuTest* CuTestNew(const char* name, TestFunction function)
|
||||||
|
{
|
||||||
|
CuTest* tc = CU_ALLOC(CuTest);
|
||||||
|
CuTestInit(tc, name, function);
|
||||||
|
return tc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuTestDelete(CuTest *t)
|
||||||
|
{
|
||||||
|
if (!t) return;
|
||||||
|
free(t->name);
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuTestRun(CuTest* tc)
|
||||||
|
{
|
||||||
|
jmp_buf buf;
|
||||||
|
tc->jumpBuf = &buf;
|
||||||
|
if (setjmp(buf) == 0)
|
||||||
|
{
|
||||||
|
tc->ran = 1;
|
||||||
|
(tc->function)(tc);
|
||||||
|
}
|
||||||
|
tc->jumpBuf = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CuFailInternal(CuTest* tc, const char* file, int line, CuString* string)
|
||||||
|
{
|
||||||
|
char buf[HUGE_STRING_LEN];
|
||||||
|
|
||||||
|
sprintf(buf, "%s:%d: ", file, line);
|
||||||
|
CuStringInsert(string, buf, 0);
|
||||||
|
|
||||||
|
tc->failed = 1;
|
||||||
|
tc->message = string->buffer;
|
||||||
|
if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message)
|
||||||
|
{
|
||||||
|
CuString string;
|
||||||
|
|
||||||
|
CuStringInit(&string);
|
||||||
|
if (message2 != NULL)
|
||||||
|
{
|
||||||
|
CuStringAppend(&string, message2);
|
||||||
|
CuStringAppend(&string, ": ");
|
||||||
|
}
|
||||||
|
CuStringAppend(&string, message);
|
||||||
|
CuFailInternal(tc, file, line, &string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition)
|
||||||
|
{
|
||||||
|
if (condition) return;
|
||||||
|
CuFail_Line(tc, file, line, NULL, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuAssertStrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
||||||
|
const char* expected, const char* actual)
|
||||||
|
{
|
||||||
|
CuString string;
|
||||||
|
if ((expected == NULL && actual == NULL) ||
|
||||||
|
(expected != NULL && actual != NULL &&
|
||||||
|
strcmp(expected, actual) == 0))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CuStringInit(&string);
|
||||||
|
if (message != NULL)
|
||||||
|
{
|
||||||
|
CuStringAppend(&string, message);
|
||||||
|
CuStringAppend(&string, ": ");
|
||||||
|
}
|
||||||
|
CuStringAppend(&string, "expected <");
|
||||||
|
CuStringAppend(&string, expected);
|
||||||
|
CuStringAppend(&string, "> but was <");
|
||||||
|
CuStringAppend(&string, actual);
|
||||||
|
CuStringAppend(&string, ">");
|
||||||
|
CuFailInternal(tc, file, line, &string);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuAssertIntEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
||||||
|
int expected, int actual)
|
||||||
|
{
|
||||||
|
char buf[STRING_MAX];
|
||||||
|
if (expected == actual) return;
|
||||||
|
sprintf(buf, "expected <%d> but was <%d>", expected, actual);
|
||||||
|
CuFail_Line(tc, file, line, message, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuAssertDblEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
||||||
|
double expected, double actual, double delta)
|
||||||
|
{
|
||||||
|
char buf[STRING_MAX];
|
||||||
|
if (fabs(expected - actual) <= delta) return;
|
||||||
|
sprintf(buf, "expected <%f> but was <%f>", expected, actual);
|
||||||
|
|
||||||
|
CuFail_Line(tc, file, line, message, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuAssertPtrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message,
|
||||||
|
void* expected, void* actual)
|
||||||
|
{
|
||||||
|
char buf[STRING_MAX];
|
||||||
|
if (expected == actual) return;
|
||||||
|
sprintf(buf, "expected pointer <0x%p> but was <0x%p>", expected, actual);
|
||||||
|
CuFail_Line(tc, file, line, message, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*
|
||||||
|
* CuSuite
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void CuSuiteInit(CuSuite* testSuite)
|
||||||
|
{
|
||||||
|
testSuite->count = 0;
|
||||||
|
testSuite->failCount = 0;
|
||||||
|
memset(testSuite->list, 0, sizeof(testSuite->list));
|
||||||
|
}
|
||||||
|
|
||||||
|
CuSuite* CuSuiteNew(void)
|
||||||
|
{
|
||||||
|
CuSuite* testSuite = CU_ALLOC(CuSuite);
|
||||||
|
CuSuiteInit(testSuite);
|
||||||
|
return testSuite;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuSuiteDelete(CuSuite *testSuite)
|
||||||
|
{
|
||||||
|
unsigned int n;
|
||||||
|
for (n=0; n < MAX_TEST_CASES; n++)
|
||||||
|
{
|
||||||
|
if (testSuite->list[n])
|
||||||
|
{
|
||||||
|
CuTestDelete(testSuite->list[n]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(testSuite);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase)
|
||||||
|
{
|
||||||
|
assert(testSuite->count < MAX_TEST_CASES);
|
||||||
|
testSuite->list[testSuite->count] = testCase;
|
||||||
|
testSuite->count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i < testSuite2->count ; ++i)
|
||||||
|
{
|
||||||
|
CuTest* testCase = testSuite2->list[i];
|
||||||
|
CuSuiteAdd(testSuite, testCase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuSuiteRun(CuSuite* testSuite)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i < testSuite->count ; ++i)
|
||||||
|
{
|
||||||
|
CuTest* testCase = testSuite->list[i];
|
||||||
|
CuTestRun(testCase);
|
||||||
|
if (testCase->failed) { testSuite->failCount += 1; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuSuiteSummary(CuSuite* testSuite, CuString* summary)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i < testSuite->count ; ++i)
|
||||||
|
{
|
||||||
|
CuTest* testCase = testSuite->list[i];
|
||||||
|
CuStringAppend(summary, testCase->failed ? "F" : ".");
|
||||||
|
}
|
||||||
|
CuStringAppend(summary, "\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CuSuiteDetails(CuSuite* testSuite, CuString* details)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int failCount = 0;
|
||||||
|
|
||||||
|
if (testSuite->failCount == 0)
|
||||||
|
{
|
||||||
|
int passCount = testSuite->count - testSuite->failCount;
|
||||||
|
const char* testWord = passCount == 1 ? "test" : "tests";
|
||||||
|
CuStringAppendFormat(details, "OK (%d %s)\n", passCount, testWord);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (testSuite->failCount == 1)
|
||||||
|
CuStringAppend(details, "There was 1 failure:\n");
|
||||||
|
else
|
||||||
|
CuStringAppendFormat(details, "There were %d failures:\n", testSuite->failCount);
|
||||||
|
|
||||||
|
for (i = 0 ; i < testSuite->count ; ++i)
|
||||||
|
{
|
||||||
|
CuTest* testCase = testSuite->list[i];
|
||||||
|
if (testCase->failed)
|
||||||
|
{
|
||||||
|
failCount++;
|
||||||
|
CuStringAppendFormat(details, "%d) %s: %s\n",
|
||||||
|
failCount, testCase->name, testCase->message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CuStringAppend(details, "\n!!!FAILURES!!!\n");
|
||||||
|
|
||||||
|
CuStringAppendFormat(details, "Runs: %d ", testSuite->count);
|
||||||
|
CuStringAppendFormat(details, "Passes: %d ", testSuite->count - testSuite->failCount);
|
||||||
|
CuStringAppendFormat(details, "Fails: %d\n", testSuite->failCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
139
kernel/libsepol/cil/test/unit/CuTest.h
Normal file
139
kernel/libsepol/cil/test/unit/CuTest.h
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Asim Jalis
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software in
|
||||||
|
* a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not
|
||||||
|
* be misrepresented as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source
|
||||||
|
* distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CU_TEST_H
|
||||||
|
#define CU_TEST_H
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define CUTEST_VERSION "CuTest 1.5"
|
||||||
|
|
||||||
|
/* CuString */
|
||||||
|
|
||||||
|
char* CuStrAlloc(int size);
|
||||||
|
char* CuStrCopy(const char* old);
|
||||||
|
|
||||||
|
#define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE)))
|
||||||
|
|
||||||
|
#define HUGE_STRING_LEN 8192
|
||||||
|
#define STRING_MAX 256
|
||||||
|
#define STRING_INC 256
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
int size;
|
||||||
|
char* buffer;
|
||||||
|
} CuString;
|
||||||
|
|
||||||
|
void CuStringInit(CuString* str);
|
||||||
|
CuString* CuStringNew(void);
|
||||||
|
void CuStringRead(CuString* str, const char* path);
|
||||||
|
void CuStringAppend(CuString* str, const char* text);
|
||||||
|
void CuStringAppendChar(CuString* str, char ch);
|
||||||
|
void CuStringAppendFormat(CuString* str, const char* format, ...);
|
||||||
|
void CuStringInsert(CuString* str, const char* text, int pos);
|
||||||
|
void CuStringResize(CuString* str, int newSize);
|
||||||
|
void CuStringDelete(CuString* str);
|
||||||
|
|
||||||
|
/* CuTest */
|
||||||
|
|
||||||
|
typedef struct CuTest CuTest;
|
||||||
|
|
||||||
|
typedef void (*TestFunction)(CuTest *);
|
||||||
|
|
||||||
|
struct CuTest
|
||||||
|
{
|
||||||
|
char* name;
|
||||||
|
TestFunction function;
|
||||||
|
int failed;
|
||||||
|
int ran;
|
||||||
|
const char* message;
|
||||||
|
jmp_buf *jumpBuf;
|
||||||
|
};
|
||||||
|
|
||||||
|
void CuTestInit(CuTest* t, const char* name, TestFunction function);
|
||||||
|
CuTest* CuTestNew(const char* name, TestFunction function);
|
||||||
|
void CuTestRun(CuTest* tc);
|
||||||
|
void CuTestDelete(CuTest *t);
|
||||||
|
|
||||||
|
/* Internal versions of assert functions -- use the public versions */
|
||||||
|
void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message);
|
||||||
|
void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition);
|
||||||
|
void CuAssertStrEquals_LineMsg(CuTest* tc,
|
||||||
|
const char* file, int line, const char* message,
|
||||||
|
const char* expected, const char* actual);
|
||||||
|
void CuAssertIntEquals_LineMsg(CuTest* tc,
|
||||||
|
const char* file, int line, const char* message,
|
||||||
|
int expected, int actual);
|
||||||
|
void CuAssertDblEquals_LineMsg(CuTest* tc,
|
||||||
|
const char* file, int line, const char* message,
|
||||||
|
double expected, double actual, double delta);
|
||||||
|
void CuAssertPtrEquals_LineMsg(CuTest* tc,
|
||||||
|
const char* file, int line, const char* message,
|
||||||
|
void* expected, void* actual);
|
||||||
|
|
||||||
|
/* public assert functions */
|
||||||
|
|
||||||
|
#define CuFail(tc, ms) CuFail_Line( (tc), __FILE__, __LINE__, NULL, (ms))
|
||||||
|
#define CuAssert(tc, ms, cond) CuAssert_Line((tc), __FILE__, __LINE__, (ms), (cond))
|
||||||
|
#define CuAssertTrue(tc, cond) CuAssert_Line((tc), __FILE__, __LINE__, "assert failed", (cond))
|
||||||
|
|
||||||
|
#define CuAssertStrEquals(tc,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
|
||||||
|
#define CuAssertStrEquals_Msg(tc,ms,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
|
||||||
|
#define CuAssertIntEquals(tc,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
|
||||||
|
#define CuAssertIntEquals_Msg(tc,ms,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
|
||||||
|
#define CuAssertDblEquals(tc,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac),(dl))
|
||||||
|
#define CuAssertDblEquals_Msg(tc,ms,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac),(dl))
|
||||||
|
#define CuAssertPtrEquals(tc,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac))
|
||||||
|
#define CuAssertPtrEquals_Msg(tc,ms,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac))
|
||||||
|
|
||||||
|
#define CuAssertPtrNotNull(tc,p) CuAssert_Line((tc),__FILE__,__LINE__,"null pointer unexpected",(p != NULL))
|
||||||
|
#define CuAssertPtrNotNullMsg(tc,msg,p) CuAssert_Line((tc),__FILE__,__LINE__,(msg),(p != NULL))
|
||||||
|
|
||||||
|
/* CuSuite */
|
||||||
|
|
||||||
|
#define MAX_TEST_CASES 1024
|
||||||
|
|
||||||
|
#define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(#TEST, TEST))
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
CuTest* list[MAX_TEST_CASES];
|
||||||
|
int failCount;
|
||||||
|
|
||||||
|
} CuSuite;
|
||||||
|
|
||||||
|
|
||||||
|
void CuSuiteInit(CuSuite* testSuite);
|
||||||
|
CuSuite* CuSuiteNew(void);
|
||||||
|
void CuSuiteDelete(CuSuite *testSuite);
|
||||||
|
void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase);
|
||||||
|
void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2);
|
||||||
|
void CuSuiteRun(CuSuite* testSuite);
|
||||||
|
void CuSuiteSummary(CuSuite* testSuite, CuString* summary);
|
||||||
|
void CuSuiteDetails(CuSuite* testSuite, CuString* details);
|
||||||
|
|
||||||
|
#endif /* CU_TEST_H */
|
||||||
179
kernel/libsepol/cil/test/unit/test_cil.c
Normal file
179
kernel/libsepol/cil/test/unit/test_cil.c
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "test_cil.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_internal.h"
|
||||||
|
#include "../../src/cil_tree.h"
|
||||||
|
|
||||||
|
void test_cil_symtab_array_init(CuTest *tc) {
|
||||||
|
struct cil_db *test_new_db;
|
||||||
|
test_new_db = malloc(sizeof(*test_new_db));
|
||||||
|
|
||||||
|
cil_symtab_array_init(test_new_db->symtab, cil_sym_sizes[CIL_SYM_ARRAY_ROOT]);
|
||||||
|
CuAssertPtrNotNull(tc, test_new_db->symtab);
|
||||||
|
|
||||||
|
free(test_new_db);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_db_init(CuTest *tc) {
|
||||||
|
struct cil_db *test_db;
|
||||||
|
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
CuAssertPtrNotNull(tc, test_db->ast);
|
||||||
|
CuAssertPtrNotNull(tc, test_db->symtab);
|
||||||
|
CuAssertPtrNotNull(tc, test_db->symtab);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Reach SEPOL_ERR return in cil_db_init ( currently can't produce a method to do so )
|
||||||
|
|
||||||
|
void test_cil_get_symtab_block(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->parent->flavor = CIL_BLOCK;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node->parent, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertPtrNotNull(tc, symtab);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_get_symtab_class(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->parent->flavor = CIL_CLASS;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node->parent, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertPtrNotNull(tc, symtab);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_get_symtab_root(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->parent->flavor = CIL_ROOT;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node->parent, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertPtrNotNull(tc, symtab);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_get_symtab_flavor_neg(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->parent->flavor = 1234567;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node->parent, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
CuAssertPtrEquals(tc, symtab, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_get_symtab_null_neg(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = NULL;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node->parent, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
CuAssertPtrEquals(tc, symtab, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_get_symtab_node_null_neg(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node = NULL;
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
CuAssertPtrEquals(tc, symtab, NULL);
|
||||||
|
CuAssertPtrEquals(tc, test_ast_node, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_get_symtab_parent_null_neg(CuTest *tc) {
|
||||||
|
symtab_t *symtab = NULL;
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = NULL;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
int rc = cil_get_symtab(test_db, test_ast_node->parent, &symtab, CIL_SYM_BLOCKS);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
CuAssertPtrEquals(tc, symtab, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
46
kernel/libsepol/cil/test/unit/test_cil.h
Normal file
46
kernel/libsepol/cil/test/unit/test_cil.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_H_
|
||||||
|
#define TEST_CIL_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_symtab_array_init(CuTest *);
|
||||||
|
void test_cil_symtab_array_init_null_symtab_neg(CuTest *);
|
||||||
|
void test_cil_db_init(CuTest *);
|
||||||
|
void test_cil_get_symtab_block(CuTest *);
|
||||||
|
void test_cil_get_symtab_class(CuTest *);
|
||||||
|
void test_cil_get_symtab_root(CuTest *);
|
||||||
|
void test_cil_get_symtab_flavor_neg(CuTest *);
|
||||||
|
void test_cil_get_symtab_null_neg(CuTest *);
|
||||||
|
void test_cil_get_symtab_node_null_neg(CuTest *);
|
||||||
|
void test_cil_get_symtab_parent_null_neg(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
19179
kernel/libsepol/cil/test/unit/test_cil_build_ast.c
Normal file
19179
kernel/libsepol/cil/test/unit/test_cil_build_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
1198
kernel/libsepol/cil/test/unit/test_cil_build_ast.h
Normal file
1198
kernel/libsepol/cil/test/unit/test_cil_build_ast.h
Normal file
File diff suppressed because it is too large
Load Diff
2571
kernel/libsepol/cil/test/unit/test_cil_copy_ast.c
Normal file
2571
kernel/libsepol/cil/test/unit/test_cil_copy_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
176
kernel/libsepol/cil/test/unit/test_cil_copy_ast.h
Normal file
176
kernel/libsepol/cil/test/unit/test_cil_copy_ast.h
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_COPY_AST_H_
|
||||||
|
#define TEST_CIL_COPY_AST_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_copy_list(CuTest *);
|
||||||
|
void test_cil_copy_list_sublist(CuTest *);
|
||||||
|
void test_cil_copy_list_sublist_extra(CuTest *);
|
||||||
|
void test_cil_copy_list_orignull_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_block(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_block(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_block_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_perm(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_perm(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_perm_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_class(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_class(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_class_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_common(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_common(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_common_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_classcommon(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_classcommon(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_sid(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_sid(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_sid_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_sidcontext(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_sidcontext(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_user(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_user(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_user_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_role(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_role(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_role_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_userrole(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_userrole(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_type(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_type(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_type_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_typeattribute(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_typeattribute(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_typeattribute_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_typealias(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_typealias(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_typealias_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_bool(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_bool(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_bool_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_avrule(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_avrule(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_type_rule(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_type_rule(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_sens(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_sens(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_sens_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_sensalias(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_sensalias(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_sensalias_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_cat(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_cat(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_cat_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_catalias(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_catalias(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_catalias_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_senscat(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_senscat(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_catorder(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_catorder(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_dominance(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_dominance(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_level(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_level(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_level_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_fill_level(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_context(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_context(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_context_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_netifcon(CuTest *);
|
||||||
|
void test_cil_copy_netifcon_nested(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_netifcon(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_netifcon_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_fill_context(CuTest *);
|
||||||
|
void test_cil_copy_fill_context_anonrange(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_call(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_call(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_optional(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_optional(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_optional_merge(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_nodecon(CuTest *);
|
||||||
|
void test_cil_copy_nodecon_anon(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_fill_ipaddr(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_ipaddr(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_ipaddr(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_ipaddr_dup_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_conditional(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_boolif(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_boolif(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_constrain(CuTest *);
|
||||||
|
void test_cil_copy_node_helper_mlsconstrain(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_ast(CuTest *);
|
||||||
|
void test_cil_copy_ast_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_copy_node_helper_orignull_neg(CuTest *tc);
|
||||||
|
void test_cil_copy_node_helper_extraargsnull_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_copy_data_helper(CuTest *tc);
|
||||||
|
void test_cil_copy_data_helper_getparentsymtab_neg(CuTest *tc);
|
||||||
|
void test_cil_copy_data_helper_duplicatedb_neg(CuTest *tc);
|
||||||
|
|
||||||
|
#endif
|
||||||
75
kernel/libsepol/cil/test/unit/test_cil_fqn.c
Normal file
75
kernel/libsepol/cil/test/unit/test_cil_fqn.c
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "CilTest.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_fqn.h"
|
||||||
|
#include "../../src/cil_build_ast.h"
|
||||||
|
|
||||||
|
void test_cil_qualify_name(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "category", "c0", ")",
|
||||||
|
"(", "categoryorder", "(", "c0", ")", ")",
|
||||||
|
"(", "sensitivity", "s0", ")",
|
||||||
|
"(", "sensitivitycategory", "s0", "(", "c0", ")", ")",
|
||||||
|
"(", "type", "blah_t", ")",
|
||||||
|
"(", "role", "blah_r", ")",
|
||||||
|
"(", "user", "blah_u", ")",
|
||||||
|
"(", "context", "con", "(", "blah_u", "blah_r", "blah_t", "(", "s0", "(", "c0", ")", ")", "(", "s0", "(", "c0", ")", ")", ")", ")",
|
||||||
|
"(", "sid", "test", "con", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *tree;
|
||||||
|
gen_test_tree(&tree, line);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
cil_build_ast(test_db, tree->root, test_db->ast->root);
|
||||||
|
|
||||||
|
int rc = cil_fqn_qualify(test_db->ast->root);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_qualify_name_cil_flavor(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "class", "file", "inherits", "file",
|
||||||
|
"(", "open", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *tree;
|
||||||
|
gen_test_tree(&tree, line);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
cil_build_ast(test_db, tree->root, test_db->ast->root);
|
||||||
|
|
||||||
|
int rc = cil_fqn_qualify(test_db->ast->root);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
}
|
||||||
37
kernel/libsepol/cil/test/unit/test_cil_fqn.h
Normal file
37
kernel/libsepol/cil/test/unit/test_cil_fqn.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_FQN_H_
|
||||||
|
#define TEST_CIL_FQN_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_qualify_name(CuTest *);
|
||||||
|
void test_cil_qualify_name_cil_flavor(CuTest *tc);
|
||||||
|
#endif
|
||||||
100
kernel/libsepol/cil/test/unit/test_cil_lexer.c
Normal file
100
kernel/libsepol/cil/test/unit/test_cil_lexer.c
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "test_cil_lexer.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_lexer.h"
|
||||||
|
|
||||||
|
void test_cil_lexer_setup(CuTest *tc) {
|
||||||
|
char *test_str = "(test \"qstring\");comment\n";
|
||||||
|
uint32_t str_size = strlen(test_str);
|
||||||
|
char *buffer = malloc(str_size + 2);
|
||||||
|
|
||||||
|
memset(buffer+str_size, 0, 2);
|
||||||
|
strncpy(buffer, test_str, str_size);
|
||||||
|
|
||||||
|
int rc = cil_lexer_setup(buffer, str_size + 2);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_lexer_next(CuTest *tc) {
|
||||||
|
char *test_str = "(test \"qstring\") ;comment\n";
|
||||||
|
uint32_t str_size = strlen(test_str);
|
||||||
|
char *buffer = malloc(str_size + 2);
|
||||||
|
|
||||||
|
memset(buffer+str_size, 0, 2);
|
||||||
|
strcpy(buffer, test_str);
|
||||||
|
|
||||||
|
cil_lexer_setup(buffer, str_size + 2);
|
||||||
|
|
||||||
|
struct token test_tok;
|
||||||
|
|
||||||
|
int rc = cil_lexer_next(&test_tok);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, OPAREN, test_tok.type);
|
||||||
|
CuAssertStrEquals(tc, "(", test_tok.value);
|
||||||
|
CuAssertIntEquals(tc, 1, test_tok.line);
|
||||||
|
|
||||||
|
rc = cil_lexer_next(&test_tok);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, SYMBOL, test_tok.type);
|
||||||
|
CuAssertStrEquals(tc, "test", test_tok.value);
|
||||||
|
CuAssertIntEquals(tc, 1, test_tok.line);
|
||||||
|
|
||||||
|
rc = cil_lexer_next(&test_tok);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, QSTRING, test_tok.type);
|
||||||
|
CuAssertStrEquals(tc, "\"qstring\"", test_tok.value);
|
||||||
|
CuAssertIntEquals(tc, 1, test_tok.line);
|
||||||
|
|
||||||
|
rc = cil_lexer_next(&test_tok);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, CPAREN, test_tok.type);
|
||||||
|
CuAssertStrEquals(tc, ")", test_tok.value);
|
||||||
|
CuAssertIntEquals(tc, 1, test_tok.line);
|
||||||
|
|
||||||
|
rc = cil_lexer_next(&test_tok);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, COMMENT, test_tok.type);
|
||||||
|
CuAssertStrEquals(tc, ";comment", test_tok.value);
|
||||||
|
CuAssertIntEquals(tc, 1, test_tok.line);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
38
kernel/libsepol/cil/test/unit/test_cil_lexer.h
Normal file
38
kernel/libsepol/cil/test/unit/test_cil_lexer.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_LEXER_H_
|
||||||
|
#define TEST_CIL_LEXER_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_lexer_setup(CuTest *);
|
||||||
|
void test_cil_lexer_next(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
345
kernel/libsepol/cil/test/unit/test_cil_list.c
Normal file
345
kernel/libsepol/cil/test/unit/test_cil_list.c
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "CilTest.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_internal.h"
|
||||||
|
#include "../../src/cil_build_ast.h"
|
||||||
|
|
||||||
|
void test_cil_list_init(CuTest *tc) {
|
||||||
|
struct cil_avrule *test_avrule = malloc(sizeof(*test_avrule));
|
||||||
|
|
||||||
|
cil_classpermset_init(&test_avrule->classpermset);
|
||||||
|
cil_permset_init(&test_avrule->classpermset->permset);
|
||||||
|
|
||||||
|
cil_list_init(&test_avrule->classpermset->permset->perms_list_str);
|
||||||
|
CuAssertPtrNotNull(tc, test_avrule->classpermset->permset->perms_list_str);
|
||||||
|
|
||||||
|
cil_destroy_avrule(test_avrule);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_append_item(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_append_item_append(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next;
|
||||||
|
|
||||||
|
int rc2 = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_append_item_append_extra(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", "process", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next;
|
||||||
|
|
||||||
|
int rc2 = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next->next;
|
||||||
|
|
||||||
|
int rc3 = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc2);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_append_item_listnull_neg(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list = NULL;
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_append_item_itemnull_neg(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item = NULL;
|
||||||
|
|
||||||
|
int rc = cil_list_append_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_prepend_item(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_prepend_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_prepend_item_prepend(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_prepend_item(test_class_list, test_new_item);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_prepend_item_prepend_neg(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", "process", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item_next;
|
||||||
|
cil_list_item_init(&test_new_item_next);
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next;
|
||||||
|
test_new_item->next = test_new_item_next;
|
||||||
|
|
||||||
|
int rc = cil_list_prepend_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_prepend_item_listnull_neg(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list = NULL;
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item;
|
||||||
|
cil_list_item_init(&test_new_item);
|
||||||
|
|
||||||
|
test_new_item->flavor = CIL_CLASS;
|
||||||
|
test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
|
||||||
|
|
||||||
|
int rc = cil_list_prepend_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_list_prepend_item_itemnull_neg(CuTest *tc) {
|
||||||
|
char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
|
||||||
|
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
gen_test_tree(&test_tree, line);
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
struct cil_list *test_class_list;
|
||||||
|
cil_list_init(&test_class_list);
|
||||||
|
|
||||||
|
struct cil_list_item *test_new_item = NULL;
|
||||||
|
|
||||||
|
int rc = cil_list_prepend_item(test_class_list, test_new_item);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_ERR, rc);
|
||||||
|
}
|
||||||
46
kernel/libsepol/cil/test/unit/test_cil_list.h
Normal file
46
kernel/libsepol/cil/test/unit/test_cil_list.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_LIST_H_
|
||||||
|
#define TEST_CIL_LIST_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_list_item_init(CuTest *);
|
||||||
|
void test_cil_list_append_item(CuTest *);
|
||||||
|
void test_cil_list_append_item_append(CuTest *);
|
||||||
|
void test_cil_list_append_item_append_extra(CuTest *);
|
||||||
|
void test_cil_list_append_item_listnull_neg(CuTest *);
|
||||||
|
void test_cil_list_append_item_itemnull_neg(CuTest *);
|
||||||
|
void test_cil_list_prepend_item_prepend(CuTest *);
|
||||||
|
void test_cil_list_prepend_item_prepend_neg(CuTest *);
|
||||||
|
void test_cil_list_prepend_item_listnull_neg(CuTest *);
|
||||||
|
void test_cil_list_prepend_item_itemnull_neg(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
57
kernel/libsepol/cil/test/unit/test_cil_parser.c
Normal file
57
kernel/libsepol/cil/test/unit/test_cil_parser.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "CilTest.h"
|
||||||
|
#include "test_cil_parser.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_parser.h"
|
||||||
|
#include "../../src/cil_internal.h"
|
||||||
|
|
||||||
|
// TODO rewrite to use the gen_tree function
|
||||||
|
void test_cil_parser(CuTest *tc) {
|
||||||
|
int rc = 0;
|
||||||
|
struct cil_file_data *data;
|
||||||
|
|
||||||
|
struct cil_tree *test_parse_root;
|
||||||
|
cil_tree_init(&test_parse_root);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
set_cil_file_data(&data);
|
||||||
|
|
||||||
|
rc = cil_parser("policy.cil", data->buffer, data->file_size + 2, &test_parse_root);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertPtrNotNull(tc, test_parse_root);
|
||||||
|
// TODO add checking of the parse tree that is returned
|
||||||
|
}
|
||||||
|
|
||||||
37
kernel/libsepol/cil/test/unit/test_cil_parser.h
Normal file
37
kernel/libsepol/cil/test/unit/test_cil_parser.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_PARSER_H_
|
||||||
|
#define TEST_CIL_PARSER_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_parser(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
703
kernel/libsepol/cil/test/unit/test_cil_post.c
Normal file
703
kernel/libsepol/cil/test/unit/test_cil_post.c
Normal file
@@ -0,0 +1,703 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "CilTest.h"
|
||||||
|
#include "test_cil_post.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_post.h"
|
||||||
|
#include "../../src/cil_internal.h"
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_meta_a_not_b(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = "ba.r";
|
||||||
|
afilecon->path_str = "foo";
|
||||||
|
|
||||||
|
bfilecon->root_str = "barr";
|
||||||
|
bfilecon->path_str = "foo";
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_meta_b_not_a(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = "bar";
|
||||||
|
afilecon->path_str = "foo";
|
||||||
|
|
||||||
|
bfilecon->root_str = "ba.rr";
|
||||||
|
bfilecon->path_str = "foo";
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_meta_a_and_b_strlen_a_greater_b(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = ".\\$";
|
||||||
|
afilecon->path_str = ".$({";
|
||||||
|
|
||||||
|
bfilecon->root_str = ".?";
|
||||||
|
bfilecon->path_str = ".";
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_type_atype_greater_btype(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = ".\\$";
|
||||||
|
afilecon->path_str = ".$({";
|
||||||
|
afilecon->type = CIL_FILECON_CHAR;
|
||||||
|
|
||||||
|
bfilecon->root_str = ".\\$";
|
||||||
|
bfilecon->path_str = ".$({";
|
||||||
|
bfilecon->type = CIL_FILECON_DIR;
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_type_btype_greater_atype(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = ".\\$";
|
||||||
|
afilecon->path_str = ".$({";
|
||||||
|
afilecon->type = CIL_FILECON_DIR;
|
||||||
|
|
||||||
|
bfilecon->root_str = ".\\$";
|
||||||
|
bfilecon->path_str = ".$({";
|
||||||
|
bfilecon->type = CIL_FILECON_CHAR;
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_meta_a_and_b_strlen_b_greater_a(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = ".";
|
||||||
|
afilecon->path_str = ".";
|
||||||
|
|
||||||
|
bfilecon->root_str = ".*+|[({";
|
||||||
|
bfilecon->path_str = ".";
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_stemlen_a_greater_b(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = "bar";
|
||||||
|
afilecon->path_str = "foo";
|
||||||
|
|
||||||
|
bfilecon->root_str = "barr";
|
||||||
|
bfilecon->path_str = "foo";
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_stemlen_b_greater_a(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = "barre";
|
||||||
|
afilecon->path_str = "foo";
|
||||||
|
|
||||||
|
bfilecon->root_str = "barr";
|
||||||
|
bfilecon->path_str = "foo";
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_equal(CuTest *tc) {
|
||||||
|
struct cil_filecon *afilecon;
|
||||||
|
cil_filecon_init(&afilecon);
|
||||||
|
|
||||||
|
struct cil_filecon *bfilecon;
|
||||||
|
cil_filecon_init(&bfilecon);
|
||||||
|
|
||||||
|
afilecon->root_str = ".\\$";
|
||||||
|
afilecon->path_str = ".$({";
|
||||||
|
afilecon->type = CIL_FILECON_DIR;
|
||||||
|
|
||||||
|
bfilecon->root_str = ".\\$";
|
||||||
|
bfilecon->path_str = ".$({";
|
||||||
|
bfilecon->type = CIL_FILECON_DIR;
|
||||||
|
|
||||||
|
|
||||||
|
int rc = cil_post_filecon_compare(&afilecon, &bfilecon);
|
||||||
|
CuAssertIntEquals(tc, 0, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_portcon_compare_atotal_greater_btotal(CuTest *tc) {
|
||||||
|
struct cil_portcon *aportcon;
|
||||||
|
cil_portcon_init(&aportcon);
|
||||||
|
|
||||||
|
struct cil_portcon *bportcon;
|
||||||
|
cil_portcon_init(&bportcon);
|
||||||
|
|
||||||
|
aportcon->port_low = 15;
|
||||||
|
aportcon->port_high = 30;
|
||||||
|
|
||||||
|
bportcon->port_low = 10;
|
||||||
|
bportcon->port_high = 11;
|
||||||
|
|
||||||
|
int rc = cil_post_portcon_compare(&aportcon, &bportcon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_portcon_compare_btotal_greater_atotal(CuTest *tc) {
|
||||||
|
struct cil_portcon *aportcon;
|
||||||
|
cil_portcon_init(&aportcon);
|
||||||
|
|
||||||
|
struct cil_portcon *bportcon;
|
||||||
|
cil_portcon_init(&bportcon);
|
||||||
|
|
||||||
|
aportcon->port_low = 5;
|
||||||
|
aportcon->port_high = 5;
|
||||||
|
|
||||||
|
bportcon->port_low = 11;
|
||||||
|
bportcon->port_high = 20;
|
||||||
|
|
||||||
|
int rc = cil_post_portcon_compare(&aportcon, &bportcon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_portcon_compare_aportlow_greater_bportlow(CuTest *tc) {
|
||||||
|
struct cil_portcon *aportcon;
|
||||||
|
cil_portcon_init(&aportcon);
|
||||||
|
|
||||||
|
struct cil_portcon *bportcon;
|
||||||
|
cil_portcon_init(&bportcon);
|
||||||
|
|
||||||
|
aportcon->port_low = 30;
|
||||||
|
aportcon->port_high = 33;
|
||||||
|
|
||||||
|
bportcon->port_low = 17;
|
||||||
|
bportcon->port_high = 20;
|
||||||
|
|
||||||
|
int rc = cil_post_portcon_compare(&aportcon, &bportcon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_portcon_compare_bportlow_greater_aportlow(CuTest *tc) {
|
||||||
|
struct cil_portcon *aportcon;
|
||||||
|
cil_portcon_init(&aportcon);
|
||||||
|
|
||||||
|
struct cil_portcon *bportcon;
|
||||||
|
cil_portcon_init(&bportcon);
|
||||||
|
|
||||||
|
aportcon->port_low = 5;
|
||||||
|
aportcon->port_high = 8;
|
||||||
|
|
||||||
|
bportcon->port_low = 17;
|
||||||
|
bportcon->port_high = 20;
|
||||||
|
|
||||||
|
int rc = cil_post_portcon_compare(&aportcon, &bportcon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_portcon_compare_equal(CuTest *tc) {
|
||||||
|
struct cil_portcon *aportcon;
|
||||||
|
cil_portcon_init(&aportcon);
|
||||||
|
|
||||||
|
struct cil_portcon *bportcon;
|
||||||
|
cil_portcon_init(&bportcon);
|
||||||
|
|
||||||
|
aportcon->port_low = 17;
|
||||||
|
aportcon->port_high = 20;
|
||||||
|
|
||||||
|
bportcon->port_low = 17;
|
||||||
|
bportcon->port_high = 20;
|
||||||
|
|
||||||
|
int rc = cil_post_portcon_compare(&aportcon, &bportcon);
|
||||||
|
CuAssertTrue(tc, rc == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_genfscon_compare_atypestr_greater_btypestr(CuTest *tc) {
|
||||||
|
struct cil_genfscon *agenfscon;
|
||||||
|
cil_genfscon_init(&agenfscon);
|
||||||
|
agenfscon->fs_str = "aaaa";
|
||||||
|
|
||||||
|
struct cil_genfscon *bgenfscon;
|
||||||
|
cil_genfscon_init(&bgenfscon);
|
||||||
|
bgenfscon->fs_str = "bbbb";
|
||||||
|
|
||||||
|
int rc = cil_post_genfscon_compare(&agenfscon, &bgenfscon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_genfscon_compare_btypestr_greater_atypestr(CuTest *tc) {
|
||||||
|
struct cil_genfscon *agenfscon;
|
||||||
|
cil_genfscon_init(&agenfscon);
|
||||||
|
agenfscon->fs_str = "bbbb";
|
||||||
|
|
||||||
|
struct cil_genfscon *bgenfscon;
|
||||||
|
cil_genfscon_init(&bgenfscon);
|
||||||
|
bgenfscon->fs_str = "aaaa";
|
||||||
|
|
||||||
|
int rc = cil_post_genfscon_compare(&agenfscon, &bgenfscon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_genfscon_compare_apathstr_greater_bpathstr(CuTest *tc) {
|
||||||
|
struct cil_genfscon *agenfscon;
|
||||||
|
cil_genfscon_init(&agenfscon);
|
||||||
|
agenfscon->fs_str = "aaaa";
|
||||||
|
agenfscon->path_str = "ff";
|
||||||
|
|
||||||
|
struct cil_genfscon *bgenfscon;
|
||||||
|
cil_genfscon_init(&bgenfscon);
|
||||||
|
bgenfscon->fs_str = "aaaa";
|
||||||
|
bgenfscon->path_str = "gg";
|
||||||
|
|
||||||
|
int rc = cil_post_genfscon_compare(&agenfscon, &bgenfscon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_genfscon_compare_bpathstr_greater_apathstr(CuTest *tc) {
|
||||||
|
struct cil_genfscon *agenfscon;
|
||||||
|
cil_genfscon_init(&agenfscon);
|
||||||
|
agenfscon->fs_str = "bbbb";
|
||||||
|
agenfscon->path_str = "cccc";
|
||||||
|
|
||||||
|
struct cil_genfscon *bgenfscon;
|
||||||
|
cil_genfscon_init(&bgenfscon);
|
||||||
|
bgenfscon->fs_str = "bbbb";
|
||||||
|
bgenfscon->path_str = "aaaa";
|
||||||
|
|
||||||
|
int rc = cil_post_genfscon_compare(&agenfscon, &bgenfscon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_genfscon_compare_equal(CuTest *tc) {
|
||||||
|
struct cil_genfscon *agenfscon;
|
||||||
|
cil_genfscon_init(&agenfscon);
|
||||||
|
agenfscon->fs_str = "bbbb";
|
||||||
|
agenfscon->path_str = "cccc";
|
||||||
|
|
||||||
|
struct cil_genfscon *bgenfscon;
|
||||||
|
cil_genfscon_init(&bgenfscon);
|
||||||
|
bgenfscon->fs_str = "bbbb";
|
||||||
|
bgenfscon->path_str = "cccc";
|
||||||
|
|
||||||
|
int rc = cil_post_genfscon_compare(&agenfscon, &bgenfscon);
|
||||||
|
CuAssertIntEquals(tc, 0, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_netifcon_compare_a_greater_b(CuTest *tc) {
|
||||||
|
struct cil_netifcon *anetifcon;
|
||||||
|
cil_netifcon_init(&anetifcon);
|
||||||
|
anetifcon->interface_str = "aaa";
|
||||||
|
|
||||||
|
struct cil_netifcon *bnetifcon;
|
||||||
|
cil_netifcon_init(&bnetifcon);
|
||||||
|
bnetifcon->interface_str = "bbb";
|
||||||
|
|
||||||
|
int rc = cil_post_netifcon_compare(&anetifcon, &bnetifcon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_netifcon_compare_b_greater_a(CuTest *tc) {
|
||||||
|
struct cil_netifcon *anetifcon;
|
||||||
|
cil_netifcon_init(&anetifcon);
|
||||||
|
anetifcon->interface_str = "bbb";
|
||||||
|
|
||||||
|
struct cil_netifcon *bnetifcon;
|
||||||
|
cil_netifcon_init(&bnetifcon);
|
||||||
|
bnetifcon->interface_str = "aaa";
|
||||||
|
|
||||||
|
int rc = cil_post_netifcon_compare(&anetifcon, &bnetifcon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_netifcon_compare_equal(CuTest *tc) {
|
||||||
|
struct cil_netifcon *anetifcon;
|
||||||
|
cil_netifcon_init(&anetifcon);
|
||||||
|
anetifcon->interface_str = "aaa";
|
||||||
|
|
||||||
|
struct cil_netifcon *bnetifcon;
|
||||||
|
cil_netifcon_init(&bnetifcon);
|
||||||
|
bnetifcon->interface_str = "aaa";
|
||||||
|
|
||||||
|
int rc = cil_post_netifcon_compare(&anetifcon, &bnetifcon);
|
||||||
|
CuAssertTrue(tc, rc == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv4_bipv6(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v4.s_addr = 103;
|
||||||
|
anodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
anodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv6_bipv4(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v4.s_addr = 103;
|
||||||
|
anodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
anodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv4_greaterthan_bipv4(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v4.s_addr = 103;
|
||||||
|
anodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
anodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv4_lessthan_bipv4(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v4.s_addr = 99;
|
||||||
|
anodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
anodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv4_greaterthan_bmaskipv4(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v4.s_addr = 103;
|
||||||
|
anodecon->mask->ip.v4.s_addr = 101;
|
||||||
|
anodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv4_lessthan_bmaskipv4(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v4.s_addr = 99;
|
||||||
|
anodecon->mask->ip.v4.s_addr = 99;
|
||||||
|
anodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->mask->ip.v4.s_addr = 100;
|
||||||
|
bnodecon->addr->family = AF_INET;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv6_greaterthan_bipv6(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v6.s6_addr[0] = '5';
|
||||||
|
anodecon->mask->ip.v6.s6_addr[0] = '9';
|
||||||
|
anodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v6.s6_addr[0] = '3';
|
||||||
|
bnodecon->mask->ip.v6.s6_addr[0] = '9';
|
||||||
|
bnodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv6_lessthan_bipv6(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v6.s6_addr[0] = '3';
|
||||||
|
anodecon->mask->ip.v6.s6_addr[0] = '1';
|
||||||
|
anodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v6.s6_addr[0] = '5';
|
||||||
|
bnodecon->mask->ip.v6.s6_addr[0] = '1';
|
||||||
|
bnodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv6_greaterthan_bmaskipv6(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v6.s6_addr[0] = '1';
|
||||||
|
anodecon->mask->ip.v6.s6_addr[0] = '4';
|
||||||
|
anodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v6.s6_addr[0] = '1';
|
||||||
|
bnodecon->mask->ip.v6.s6_addr[0] = '3';
|
||||||
|
bnodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv6_lessthan_bmaskipv6(CuTest *tc) {
|
||||||
|
struct cil_nodecon *anodecon;
|
||||||
|
cil_nodecon_init(&anodecon);
|
||||||
|
cil_ipaddr_init(&anodecon->addr);
|
||||||
|
cil_ipaddr_init(&anodecon->mask);
|
||||||
|
|
||||||
|
struct cil_nodecon *bnodecon;
|
||||||
|
cil_nodecon_init(&bnodecon);
|
||||||
|
cil_ipaddr_init(&bnodecon->addr);
|
||||||
|
cil_ipaddr_init(&bnodecon->mask);
|
||||||
|
|
||||||
|
anodecon->addr->ip.v6.s6_addr[0] = '5';
|
||||||
|
anodecon->mask->ip.v6.s6_addr[0] = '1';
|
||||||
|
anodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
bnodecon->addr->ip.v6.s6_addr[0] = '5';
|
||||||
|
bnodecon->mask->ip.v6.s6_addr[0] = '6';
|
||||||
|
bnodecon->addr->family = AF_INET6;
|
||||||
|
|
||||||
|
int rc = cil_post_nodecon_compare(&anodecon, &bnodecon);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_fsuse_compare_type_a_greater_b(CuTest *tc) {
|
||||||
|
struct cil_fsuse *afsuse;
|
||||||
|
cil_fsuse_init(&afsuse);
|
||||||
|
afsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
|
||||||
|
struct cil_fsuse *bfsuse;
|
||||||
|
cil_fsuse_init(&bfsuse);
|
||||||
|
bfsuse->type = CIL_FSUSE_TASK;
|
||||||
|
|
||||||
|
int rc = cil_post_fsuse_compare(&afsuse, &bfsuse);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_fsuse_compare_type_b_greater_a(CuTest *tc) {
|
||||||
|
struct cil_fsuse *afsuse;
|
||||||
|
cil_fsuse_init(&afsuse);
|
||||||
|
afsuse->type = CIL_FSUSE_TASK;
|
||||||
|
|
||||||
|
struct cil_fsuse *bfsuse;
|
||||||
|
cil_fsuse_init(&bfsuse);
|
||||||
|
bfsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
|
||||||
|
int rc = cil_post_fsuse_compare(&afsuse, &bfsuse);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_fsuse_compare_fsstr_a_greater_b(CuTest *tc) {
|
||||||
|
struct cil_fsuse *afsuse;
|
||||||
|
cil_fsuse_init(&afsuse);
|
||||||
|
afsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
afsuse->fs_str = "aaa";
|
||||||
|
|
||||||
|
struct cil_fsuse *bfsuse;
|
||||||
|
cil_fsuse_init(&bfsuse);
|
||||||
|
bfsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
bfsuse->fs_str = "bbb";
|
||||||
|
|
||||||
|
int rc = cil_post_fsuse_compare(&afsuse, &bfsuse);
|
||||||
|
CuAssertTrue(tc, rc < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_fsuse_compare_fsstr_b_greater_a(CuTest *tc) {
|
||||||
|
struct cil_fsuse *afsuse;
|
||||||
|
cil_fsuse_init(&afsuse);
|
||||||
|
afsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
afsuse->fs_str = "bbb";
|
||||||
|
|
||||||
|
struct cil_fsuse *bfsuse;
|
||||||
|
cil_fsuse_init(&bfsuse);
|
||||||
|
bfsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
bfsuse->fs_str = "aaa";
|
||||||
|
|
||||||
|
int rc = cil_post_fsuse_compare(&afsuse, &bfsuse);
|
||||||
|
CuAssertTrue(tc, rc > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_post_fsuse_compare_equal(CuTest *tc) {
|
||||||
|
struct cil_fsuse *afsuse;
|
||||||
|
cil_fsuse_init(&afsuse);
|
||||||
|
afsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
afsuse->fs_str = "foo";
|
||||||
|
|
||||||
|
struct cil_fsuse *bfsuse;
|
||||||
|
cil_fsuse_init(&bfsuse);
|
||||||
|
bfsuse->type = CIL_FSUSE_XATTR;
|
||||||
|
bfsuse->fs_str = "foo";
|
||||||
|
|
||||||
|
int rc = cil_post_fsuse_compare(&afsuse, &bfsuse);
|
||||||
|
CuAssertTrue(tc, rc == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
79
kernel/libsepol/cil/test/unit/test_cil_post.h
Normal file
79
kernel/libsepol/cil/test/unit/test_cil_post.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_POLICY_H_
|
||||||
|
#define TEST_CIL_POLICY_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_post_filecon_compare_meta_a_not_b(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_meta_b_not_a(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_meta_a_and_b_strlen_a_greater_b(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_meta_a_and_b_strlen_b_greater_a(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_type_atype_greater_btype(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_type_btype_greater_atype(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_stemlen_a_greater_b(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_stemlen_b_greater_a(CuTest *tc);
|
||||||
|
void test_cil_post_filecon_compare_equal(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_post_portcon_compare_atotal_greater_btotal(CuTest *tc);
|
||||||
|
void test_cil_post_portcon_compare_btotal_greater_atotal(CuTest *tc);
|
||||||
|
void test_cil_post_portcon_compare_aportlow_greater_bportlow(CuTest *tc);
|
||||||
|
void test_cil_post_portcon_compare_bportlow_greater_aportlow(CuTest *tc);
|
||||||
|
void test_cil_post_portcon_compare_equal(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_post_genfscon_compare_atypestr_greater_btypestr(CuTest *tc);
|
||||||
|
void test_cil_post_genfscon_compare_btypestr_greater_atypestr(CuTest *tc);
|
||||||
|
void test_cil_post_genfscon_compare_apathstr_greater_bpathstr(CuTest *tc);
|
||||||
|
void test_cil_post_genfscon_compare_bpathstr_greater_apathstr(CuTest *tc);
|
||||||
|
void test_cil_post_genfscon_compare_equal(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_post_netifcon_compare_a_greater_b(CuTest *tc);
|
||||||
|
void test_cil_post_netifcon_compare_b_greater_a(CuTest *tc);
|
||||||
|
void test_cil_post_netifcon_compare_equal(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_post_nodecon_compare_aipv4_bipv6(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_aipv6_bipv4(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_aipv4_greaterthan_bipv4(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_aipv4_lessthan_bipv4(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv4_greaterthan_bmaskipv4(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv4_lessthan_bmaskipv4(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_aipv6_greaterthan_bipv6(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_aipv6_lessthan_bipv6(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv6_greaterthan_bmaskipv6(CuTest *tc);
|
||||||
|
void test_cil_post_nodecon_compare_amaskipv6_lessthan_bmaskipv6(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_post_fsuse_compare_type_a_greater_b(CuTest *tc);
|
||||||
|
void test_cil_post_fsuse_compare_type_b_greater_a(CuTest *tc);
|
||||||
|
void test_cil_post_fsuse_compare_fsstr_a_greater_b(CuTest *tc);
|
||||||
|
void test_cil_post_fsuse_compare_fsstr_b_greater_a(CuTest *tc);
|
||||||
|
void test_cil_post_fsuse_compare_equal(CuTest *tc);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
11319
kernel/libsepol/cil/test/unit/test_cil_resolve_ast.c
Normal file
11319
kernel/libsepol/cil/test/unit/test_cil_resolve_ast.c
Normal file
File diff suppressed because it is too large
Load Diff
578
kernel/libsepol/cil/test/unit/test_cil_resolve_ast.h
Normal file
578
kernel/libsepol/cil/test/unit/test_cil_resolve_ast.h
Normal file
@@ -0,0 +1,578 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_RESOLVE_AST_H_
|
||||||
|
#define TEST_CIL_RESOLVE_AST_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_resolve_name(CuTest *);
|
||||||
|
void test_cil_resolve_name_invalid_type_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_curr_null_neg(CuTest *);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
cil_resolve test cases
|
||||||
|
*/
|
||||||
|
|
||||||
|
void test_cil_resolve_roleallow(CuTest *);
|
||||||
|
void test_cil_resolve_roleallow_srcdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_roleallow_tgtdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_rolebounds(CuTest *tc);
|
||||||
|
void test_cil_resolve_rolebounds_exists_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_rolebounds_role1_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_rolebounds_role2_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_sensalias(CuTest *);
|
||||||
|
void test_cil_resolve_sensalias_sensdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_catalias(CuTest *);
|
||||||
|
void test_cil_resolve_catalias_catdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_catorder(CuTest *);
|
||||||
|
void test_cil_resolve_catorder_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_dominance(CuTest *);
|
||||||
|
void test_cil_resolve_dominance_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_cat_list(CuTest *);
|
||||||
|
void test_cil_resolve_cat_list_catlistnull_neg(CuTest *);
|
||||||
|
void test_cil_resolve_cat_list_rescatlistnull_neg(CuTest *);
|
||||||
|
void test_cil_resolve_cat_list_catrange(CuTest *);
|
||||||
|
void test_cil_resolve_cat_list_catrange_neg(CuTest *);
|
||||||
|
void test_cil_resolve_cat_list_catname_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_catset(CuTest *);
|
||||||
|
void test_cil_resolve_catset_catlist_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_catrange(CuTest *);
|
||||||
|
void test_cil_resolve_catrange_catloworder_neg(CuTest *);
|
||||||
|
void test_cil_resolve_catrange_cathighorder_neg(CuTest *);
|
||||||
|
void test_cil_resolve_catrange_cat1_neg(CuTest *);
|
||||||
|
void test_cil_resolve_catrange_cat2_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_senscat(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_catrange_neg(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_catsetname(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_catsetname_neg(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_sublist(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_missingsens_neg(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_sublist_neg(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_category_neg(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_currrangecat(CuTest *);
|
||||||
|
void test_cil_resolve_senscat_currrangecat_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_level(CuTest *);
|
||||||
|
void test_cil_resolve_level_catlist(CuTest *);
|
||||||
|
void test_cil_resolve_level_catset(CuTest *);
|
||||||
|
void test_cil_resolve_level_catset_name_neg(CuTest *);
|
||||||
|
void test_cil_resolve_level_sens_neg(CuTest *);
|
||||||
|
void test_cil_resolve_level_cat_neg(CuTest *);
|
||||||
|
void test_cil_resolve_level_senscat_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_levelrange_namedlvl(CuTest *);
|
||||||
|
void test_cil_resolve_levelrange_namedlvl_low_neg(CuTest *);
|
||||||
|
void test_cil_resolve_levelrange_namedlvl_high_neg(CuTest *);
|
||||||
|
void test_cil_resolve_levelrange_anonlvl(CuTest *);
|
||||||
|
void test_cil_resolve_levelrange_anonlvl_low_neg(CuTest *);
|
||||||
|
void test_cil_resolve_levelrange_anonlvl_high_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_constrain(CuTest *);
|
||||||
|
void test_cil_resolve_constrain_class_neg(CuTest *);
|
||||||
|
void test_cil_resolve_constrain_perm_neg(CuTest *);
|
||||||
|
void test_cil_resolve_constrain_perm_resolve_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_context(CuTest *);
|
||||||
|
void test_cil_resolve_context_macro(CuTest *);
|
||||||
|
void test_cil_resolve_context_macro_neg(CuTest *);
|
||||||
|
void test_cil_resolve_context_namedrange(CuTest *);
|
||||||
|
void test_cil_resolve_context_namedrange_neg(CuTest *);
|
||||||
|
void test_cil_resolve_context_macro_namedrange_anon(CuTest *);
|
||||||
|
void test_cil_resolve_context_user_neg(CuTest *);
|
||||||
|
void test_cil_resolve_context_role_neg(CuTest *);
|
||||||
|
void test_cil_resolve_context_type_neg(CuTest *);
|
||||||
|
void test_cil_resolve_context_anon_level_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_roletransition(CuTest *);
|
||||||
|
void test_cil_resolve_roletransition_srcdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_roletransition_tgtdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_roletransition_resultdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_typeattributeset_type_in_multiple_attrs(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_multiple_excludes_with_not(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_multiple_types_with_and(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_using_attr(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_name_neg(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_undef_type_neg(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_not(CuTest *);
|
||||||
|
void test_cil_resolve_typeattributeset_undef_type_not_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_typealias(CuTest *);
|
||||||
|
void test_cil_resolve_typealias_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_typebounds(CuTest *);
|
||||||
|
void test_cil_resolve_typebounds_repeatbind_neg(CuTest *);
|
||||||
|
void test_cil_resolve_typebounds_type1_neg(CuTest *);
|
||||||
|
void test_cil_resolve_typebounds_type2_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_typepermissive(CuTest *);
|
||||||
|
void test_cil_resolve_typepermissive_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_nametypetransition(CuTest *);
|
||||||
|
void test_cil_resolve_nametypetransition_src_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nametypetransition_tgt_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nametypetransition_class_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nametypetransition_dest_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_rangetransition(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_namedrange(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_namedrange_anon(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_namedrange_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_namedrange_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_type1_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_type2_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_class_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_call_level_l_anon(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_call_level_l_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_call_level_h_anon(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_call_level_h_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_level_l_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_level_h_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_anon_level_l(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_anon_level_l_neg(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_anon_level_h(CuTest *);
|
||||||
|
void test_cil_resolve_rangetransition_anon_level_h_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_classcommon(CuTest *);
|
||||||
|
void test_cil_resolve_classcommon_no_class_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classcommon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classcommon_no_common_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_classmapping_named(CuTest *);
|
||||||
|
void test_cil_resolve_classmapping_anon(CuTest *);
|
||||||
|
void test_cil_resolve_classmapping_anon_inmacro(CuTest *);
|
||||||
|
void test_cil_resolve_classmapping_anon_inmacro_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classmapping_named_classmapname_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classmapping_anon_classmapname_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classmapping_anon_permset_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_classpermset_named(CuTest *);
|
||||||
|
void test_cil_resolve_classpermset_named_namedpermlist(CuTest *);
|
||||||
|
void test_cil_resolve_classpermset_named_permlist_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classpermset_named_unnamedcps_neg(CuTest *);
|
||||||
|
void test_cil_resolve_classpermset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_classpermset_anon_namedpermlist(CuTest *);
|
||||||
|
void test_cil_resolve_classpermset_anon_permlist_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_avrule(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_permset(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_permset_neg(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_permset_permdne_neg(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_firsttype_neg(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_secondtype_neg(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_class_neg(CuTest *);
|
||||||
|
void test_cil_resolve_avrule_perm_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_type_rule_transition(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_transition_srcdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_transition_tgtdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_transition_objdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_transition_resultdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_type_rule_change(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_change_srcdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_change_tgtdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_change_objdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_change_resultdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_type_rule_member(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_member_srcdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_member_tgtdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_member_objdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_type_rule_member_resultdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_filecon(CuTest *);
|
||||||
|
void test_cil_resolve_filecon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_filecon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_filecon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_filecon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_filecon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_portcon(CuTest *);
|
||||||
|
void test_cil_resolve_portcon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_portcon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_portcon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_portcon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_portcon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_genfscon(CuTest *);
|
||||||
|
void test_cil_resolve_genfscon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_genfscon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_genfscon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_genfscon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_genfscon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_nodecon_ipv4(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_ipv6(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_anonipaddr_ipv4(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_anonnetmask_ipv4(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_anonipaddr_ipv6(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_anonnetmask_ipv6(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_diffipfam_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_ipaddr_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_netmask_neg(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_nodecon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_nodecon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_nodecon_ipaddr_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_nodecon_netmask_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_netifcon(CuTest *);
|
||||||
|
void test_cil_resolve_netifcon_otf_neg(CuTest *);
|
||||||
|
void test_cil_resolve_netifcon_interface_neg(CuTest *);
|
||||||
|
void test_cil_resolve_netifcon_unnamed(CuTest *);
|
||||||
|
void test_cil_resolve_netifcon_unnamed_packet_neg(CuTest *);
|
||||||
|
void test_cil_resolve_netifcon_unnamed_otf_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_netifcon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_netifcon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_pirqcon(CuTest *);
|
||||||
|
void test_cil_resolve_pirqcon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_pirqcon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_pirqcon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_pirqcon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_pirqcon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_iomemcon(CuTest *);
|
||||||
|
void test_cil_resolve_iomemcon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_iomemcon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_iomemcon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_iomemcon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_iomemcon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ioportcon(CuTest *);
|
||||||
|
void test_cil_resolve_ioportcon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ioportcon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_ioportcon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_ioportcon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_ioportcon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_pcidevicecon(CuTest *);
|
||||||
|
void test_cil_resolve_pcidevicecon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_pcidevicecon_anon_context(CuTest *);
|
||||||
|
void test_cil_resolve_pcidevicecon_anon_context_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_pcidevicecon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_pcidevicecon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_fsuse(CuTest *);
|
||||||
|
void test_cil_resolve_fsuse_neg(CuTest *);
|
||||||
|
void test_cil_resolve_fsuse_anon(CuTest *);
|
||||||
|
void test_cil_resolve_fsuse_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_fsuse(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_fsuse_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_sidcontext(CuTest *);
|
||||||
|
void test_cil_resolve_sidcontext_named_levels(CuTest *);
|
||||||
|
void test_cil_resolve_sidcontext_named_context(CuTest *);
|
||||||
|
void test_cil_resolve_sidcontext_named_context_wrongname_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_sidcontext_named_context_invaliduser_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_sidcontext_named_context_sidcontextnull_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_sidcontext(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_sidcontext_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_blockinherit(CuTest *);
|
||||||
|
void test_cil_resolve_blockinherit_blockstrdne_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_blockinherit(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_in_block(CuTest *);
|
||||||
|
void test_cil_resolve_in_blockstrdne_neg(CuTest *);
|
||||||
|
void test_cil_resolve_in_macro(CuTest *);
|
||||||
|
void test_cil_resolve_in_optional(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_call1_noparam(CuTest *);
|
||||||
|
void test_cil_resolve_call1_type(CuTest *);
|
||||||
|
void test_cil_resolve_call1_role(CuTest *);
|
||||||
|
void test_cil_resolve_call1_user(CuTest *);
|
||||||
|
void test_cil_resolve_call1_sens(CuTest *);
|
||||||
|
void test_cil_resolve_call1_cat(CuTest *);
|
||||||
|
void test_cil_resolve_call1_catset(CuTest *);
|
||||||
|
void test_cil_resolve_call1_catset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call1_catset_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_level(CuTest *);
|
||||||
|
void test_cil_resolve_call1_class(CuTest *);
|
||||||
|
void test_cil_resolve_call1_classmap(CuTest *);
|
||||||
|
void test_cil_resolve_call1_permset(CuTest *);
|
||||||
|
void test_cil_resolve_call1_permset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call1_classpermset_named(CuTest *);
|
||||||
|
void test_cil_resolve_call1_classpermset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call1_classpermset_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_level(CuTest *);
|
||||||
|
void test_cil_resolve_call1_level_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call1_level_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_ipaddr(CuTest *);
|
||||||
|
void test_cil_resolve_call1_ipaddr_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call1_ipaddr_anon_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_unknown_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_unknowncall_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_extraargs_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_copy_dup(CuTest *);
|
||||||
|
void test_cil_resolve_call1_missing_arg_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_paramsflavor_neg(CuTest *);
|
||||||
|
void test_cil_resolve_call1_unknownflavor_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_call2_type(CuTest *);
|
||||||
|
void test_cil_resolve_call2_role(CuTest *);
|
||||||
|
void test_cil_resolve_call2_user(CuTest *);
|
||||||
|
void test_cil_resolve_call2_sens(CuTest *);
|
||||||
|
void test_cil_resolve_call2_cat(CuTest *);
|
||||||
|
void test_cil_resolve_call2_catset(CuTest *);
|
||||||
|
void test_cil_resolve_call2_catset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call2_permset(CuTest *);
|
||||||
|
void test_cil_resolve_call2_permset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call2_classpermset_named(CuTest *);
|
||||||
|
void test_cil_resolve_call2_classpermset_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call2_class(CuTest *);
|
||||||
|
void test_cil_resolve_call2_classmap(CuTest *);
|
||||||
|
void test_cil_resolve_call2_level(CuTest *);
|
||||||
|
void test_cil_resolve_call2_level_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call2_ipaddr(CuTest *);
|
||||||
|
void test_cil_resolve_call2_ipaddr_anon(CuTest *);
|
||||||
|
void test_cil_resolve_call2_unknown_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_name_call_args(CuTest *);
|
||||||
|
void test_cil_resolve_name_call_args_multipleparams(CuTest *);
|
||||||
|
void test_cil_resolve_name_call_args_diffflavor(CuTest *);
|
||||||
|
void test_cil_resolve_name_call_args_callnull_neg(CuTest *);
|
||||||
|
void test_cil_resolve_name_call_args_namenull_neg(CuTest *);
|
||||||
|
void test_cil_resolve_name_call_args_callargsnull_neg(CuTest *);
|
||||||
|
void test_cil_resolve_name_call_args_name_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_expr_stack_bools(CuTest *);
|
||||||
|
void test_cil_resolve_expr_stack_tunables(CuTest *);
|
||||||
|
void test_cil_resolve_expr_stack_type(CuTest *);
|
||||||
|
void test_cil_resolve_expr_stack_role(CuTest *);
|
||||||
|
void test_cil_resolve_expr_stack_user(CuTest *);
|
||||||
|
void test_cil_resolve_expr_stack_neg(CuTest *);
|
||||||
|
void test_cil_resolve_expr_stack_emptystr_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_boolif(CuTest *);
|
||||||
|
void test_cil_resolve_boolif_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_evaluate_expr_stack_and(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_not(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_or(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_xor(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_eq(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_neq(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_oper1(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_oper2(CuTest *);
|
||||||
|
void test_cil_evaluate_expr_stack_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_tunif_false(CuTest *);
|
||||||
|
void test_cil_resolve_tunif_true(CuTest *);
|
||||||
|
void test_cil_resolve_tunif_resolveexpr_neg(CuTest *);
|
||||||
|
void test_cil_resolve_tunif_evaluateexpr_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_userbounds(CuTest *tc);
|
||||||
|
void test_cil_resolve_userbounds_exists_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userbounds_user1_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userbounds_user2_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_roletype(CuTest *tc);
|
||||||
|
void test_cil_resolve_roletype_type_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_roletype_role_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_userrole(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrole_user_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrole_role_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_userlevel(CuTest *tc);
|
||||||
|
void test_cil_resolve_userlevel_macro(CuTest *tc);
|
||||||
|
void test_cil_resolve_userlevel_macro_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userlevel_level_anon(CuTest *tc);
|
||||||
|
void test_cil_resolve_userlevel_level_anon_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userlevel_user_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userlevel_level_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_userrange(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrange_macro(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrange_macro_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrange_range_anon(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrange_range_anon_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrange_user_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_userrange_range_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_disable_children_helper_optional_enabled(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_optional_disabled(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_block(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_user(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_role(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_type(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_typealias(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_common(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_class(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_bool(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_sens(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_cat(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_catset(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_sid(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_macro(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_context(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_level(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_policycap(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_perm(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_catalias(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_sensalias(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_tunable(CuTest *tc);
|
||||||
|
void test_cil_disable_children_helper_unknown(CuTest *tc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
__cil_resolve_ast_node_helper test cases
|
||||||
|
*/
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_call1(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_call1_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_call2(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_call2_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_boolif(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_boolif_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_tunif(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_tunif_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_catorder(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_catorder_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_dominance(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_dominance_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_roleallow(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_roleallow_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_rolebounds(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_rolebounds_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_sensalias(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_sensalias_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_catalias(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_catalias_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_catset(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_catset_catlist_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_level(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_level_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_levelrange(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_levelrange_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_constrain(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_constrain_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_mlsconstrain(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_mlsconstrain_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_context(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_context_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_catrange(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_catrange_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_senscat(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_senscat_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_roletransition(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_roletransition_srcdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_roletransition_tgtdecl_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_roletransition_resultdecl_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_typeattributeset(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_typeattributeset_undef_type_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_typealias(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_typealias_notype_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_typebounds(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_typebounds_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_typepermissive(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_typepermissive_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_nametypetransition(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_nametypetransition_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_rangetransition(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_rangetransition_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_avrule(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_avrule_src_nores_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_avrule_tgt_nores_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_avrule_class_nores_neg(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_avrule_datum_null_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_type_rule_transition(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_type_rule_transition_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_type_rule_change(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_type_rule_change_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_type_rule_member(CuTest *);
|
||||||
|
void test_cil_resolve_ast_node_helper_type_rule_member_neg(CuTest *);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_userbounds(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_userbounds_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_roletype(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_roletype_role_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_roletype_type_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_userrole(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_userrole_user_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_userrole_role_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_userlevel(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_userlevel_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_userlevel(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_userlevel_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_userrange(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_userrange_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_classcommon(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_classcommon_neg(CuTest *tc);
|
||||||
|
|
||||||
|
void test_cil_resolve_ast_node_helper_callstack(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_call(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_optional(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_macro(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_optstack(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_optstack_tunable_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_optstack_macro_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_nodenull_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_extraargsnull_neg(CuTest *tc);
|
||||||
|
void test_cil_resolve_ast_node_helper_optfailedtoresolve(CuTest *tc);
|
||||||
|
#endif
|
||||||
61
kernel/libsepol/cil/test/unit/test_cil_symtab.c
Normal file
61
kernel/libsepol/cil/test/unit/test_cil_symtab.c
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "test_cil_symtab.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_tree.h"
|
||||||
|
#include "../../src/cil_symtab.h"
|
||||||
|
#include "../../src/cil_internal.h"
|
||||||
|
|
||||||
|
void test_cil_symtab_insert(CuTest *tc) {
|
||||||
|
symtab_t *test_symtab = NULL;
|
||||||
|
char* test_name = "test";
|
||||||
|
struct cil_block *test_block = malloc(sizeof(*test_block));
|
||||||
|
|
||||||
|
struct cil_tree_node *test_ast_node;
|
||||||
|
cil_tree_node_init(&test_ast_node);
|
||||||
|
|
||||||
|
struct cil_db *test_db;
|
||||||
|
cil_db_init(&test_db);
|
||||||
|
|
||||||
|
test_ast_node->parent = test_db->ast->root;
|
||||||
|
test_ast_node->line = 1;
|
||||||
|
|
||||||
|
cil_symtab_array_init(test_block->symtab, cil_sym_sizes[CIL_SYM_ARRAY_BLOCK]);
|
||||||
|
|
||||||
|
test_block->is_abstract = 0;
|
||||||
|
|
||||||
|
cil_get_symtab(test_db, test_ast_node->parent, &test_symtab, CIL_SYM_BLOCKS);
|
||||||
|
|
||||||
|
int rc = cil_symtab_insert(test_symtab, (hashtab_key_t)test_name, (struct cil_symtab_datum*)test_block, test_ast_node);
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
}
|
||||||
37
kernel/libsepol/cil/test/unit/test_cil_symtab.h
Normal file
37
kernel/libsepol/cil/test/unit/test_cil_symtab.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_SYMTAB_H_
|
||||||
|
#define TEST_CIL_SYMTAB_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_symtab_insert(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
71
kernel/libsepol/cil/test/unit/test_cil_tree.c
Normal file
71
kernel/libsepol/cil/test/unit/test_cil_tree.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "test_cil_tree.h"
|
||||||
|
|
||||||
|
#include "../../src/cil_tree.h"
|
||||||
|
|
||||||
|
void test_cil_tree_node_init(CuTest *tc) {
|
||||||
|
struct cil_tree_node *test_node;
|
||||||
|
|
||||||
|
cil_tree_node_init(&test_node);
|
||||||
|
|
||||||
|
CuAssertPtrNotNull(tc, test_node);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_node->cl_head);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_node->cl_tail);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_node->parent);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_node->data);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_node->next);
|
||||||
|
CuAssertIntEquals(tc, 0, test_node->flavor);
|
||||||
|
CuAssertIntEquals(tc, 0, test_node->line);
|
||||||
|
|
||||||
|
free(test_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_cil_tree_init(CuTest *tc) {
|
||||||
|
struct cil_tree *test_tree;
|
||||||
|
|
||||||
|
int rc = cil_tree_init(&test_tree);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, SEPOL_OK, rc);
|
||||||
|
CuAssertPtrNotNull(tc, test_tree);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_tree->root->cl_head);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_tree->root->cl_tail);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_tree->root->parent);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_tree->root->data);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_tree->root->next);
|
||||||
|
CuAssertIntEquals(tc, 0, test_tree->root->flavor);
|
||||||
|
CuAssertIntEquals(tc, 0, test_tree->root->line);
|
||||||
|
|
||||||
|
free(test_tree);
|
||||||
|
}
|
||||||
|
|
||||||
38
kernel/libsepol/cil/test/unit/test_cil_tree.h
Normal file
38
kernel/libsepol/cil/test/unit/test_cil_tree.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_CIL_TREE_H_
|
||||||
|
#define TEST_CIL_TREE_H_
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_cil_tree_node_init(CuTest *);
|
||||||
|
void test_cil_tree_init(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
76
kernel/libsepol/cil/test/unit/test_integration.c
Normal file
76
kernel/libsepol/cil/test/unit/test_integration.c
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
#include "test_integration.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
void test_integration(CuTest *tc) {
|
||||||
|
int status = 0, status1 = 0, status2 = 0;
|
||||||
|
|
||||||
|
status = system("./secilc -M -c 24 test/integration.cil &> /dev/null");
|
||||||
|
|
||||||
|
if (WIFSIGNALED(status) && (WTERMSIG(status) == SIGINT || WTERMSIG(status) == SIGQUIT))
|
||||||
|
printf("Call to system for secilc failed.\n");
|
||||||
|
|
||||||
|
status1 = system("checkpolicy -M -c 24 -o policy.conf.24 test/policy.conf &> /dev/null");
|
||||||
|
|
||||||
|
if (WIFSIGNALED(status1) && (WTERMSIG(status1) == SIGINT || WTERMSIG(status1) == SIGQUIT))
|
||||||
|
printf("Call to checkpolicy failed.\n");
|
||||||
|
|
||||||
|
status2 = system("sediff -q policy.24 \\; policy.conf.24 &> /dev/null");
|
||||||
|
|
||||||
|
if (WIFSIGNALED(status2) && (WTERMSIG(status2) == SIGINT || WTERMSIG(status2) == SIGQUIT))
|
||||||
|
printf("Call to sediff for secilc failed.\n");
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, 1, WIFEXITED(status));
|
||||||
|
CuAssertIntEquals(tc, 0, WEXITSTATUS(status));
|
||||||
|
CuAssertIntEquals(tc, 1, WIFEXITED(status1));
|
||||||
|
CuAssertIntEquals(tc, 0, WEXITSTATUS(status1));
|
||||||
|
CuAssertIntEquals(tc, 1, WIFEXITED(status2));
|
||||||
|
CuAssertIntEquals(tc, 0, WEXITSTATUS(status2));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_min_policy(CuTest *tc) {
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
status = system("./secilc -M -c 24 test/policy.cil &> /dev/null");
|
||||||
|
|
||||||
|
if (WIFSIGNALED(status) && (WTERMSIG(status) == SIGINT || WTERMSIG(status) == SIGQUIT))
|
||||||
|
printf("Call to system for secilc failed.\n");
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, 1, WIFEXITED(status));
|
||||||
|
CuAssertIntEquals(tc, 0, WEXITSTATUS(status));
|
||||||
|
}
|
||||||
38
kernel/libsepol/cil/test/unit/test_integration.h
Normal file
38
kernel/libsepol/cil/test/unit/test_integration.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 Tresys Technology, LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are those
|
||||||
|
* of the authors and should not be interpreted as representing official policies,
|
||||||
|
* either expressed or implied, of Tresys Technology, LLC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_INTEGRATION_H
|
||||||
|
#define TEST_INTEGRATION_H
|
||||||
|
|
||||||
|
#include "CuTest.h"
|
||||||
|
|
||||||
|
void test_min_policy(CuTest *);
|
||||||
|
void test_integration(CuTest *);
|
||||||
|
|
||||||
|
#endif
|
||||||
63
kernel/libsepol/fuzz/binpolicy-fuzzer.c
Normal file
63
kernel/libsepol/fuzz/binpolicy-fuzzer.c
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#include <sepol/debug.h>
|
||||||
|
#include <sepol/kernel_to_cil.h>
|
||||||
|
#include <sepol/kernel_to_conf.h>
|
||||||
|
#include <sepol/policydb/policydb.h>
|
||||||
|
|
||||||
|
extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
|
||||||
|
|
||||||
|
static int write_binary_policy(policydb_t *p, FILE *outfp)
|
||||||
|
{
|
||||||
|
struct policy_file pf;
|
||||||
|
|
||||||
|
policy_file_init(&pf);
|
||||||
|
pf.type = PF_USE_STDIO;
|
||||||
|
pf.fp = outfp;
|
||||||
|
return ksu_policydb_write(p, &pf);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
policydb_t policydb = {};
|
||||||
|
sidtab_t sidtab = {};
|
||||||
|
struct policy_file pf;
|
||||||
|
FILE *devnull = NULL;
|
||||||
|
|
||||||
|
sepol_debug(0);
|
||||||
|
|
||||||
|
policy_file_init(&pf);
|
||||||
|
pf.type = PF_USE_MEMORY;
|
||||||
|
pf.data = (char *) data;
|
||||||
|
pf.len = size;
|
||||||
|
|
||||||
|
if (policydb_init(&policydb))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (ksu_policydb_read(&policydb, &pf, /*verbose=*/0))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (ksu_policydb_load_isids(&policydb, &sidtab))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (policydb.policy_type == POLICY_KERN)
|
||||||
|
(void) policydb_optimize(&policydb);
|
||||||
|
|
||||||
|
devnull = fopen("/dev/null", "w");
|
||||||
|
if (!devnull)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
(void) write_binary_policy(&policydb, devnull);
|
||||||
|
|
||||||
|
(void) sepol_kernel_policydb_to_conf(devnull, &policydb);
|
||||||
|
|
||||||
|
(void) sepol_kernel_policydb_to_cil(devnull, &policydb);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (devnull != NULL)
|
||||||
|
fclose(devnull);
|
||||||
|
|
||||||
|
ksu_policydb_destroy(&policydb);
|
||||||
|
sepol_sidtab_destroy(&sidtab);
|
||||||
|
|
||||||
|
/* Non-zero return values are reserved for future use. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
kernel/libsepol/fuzz/policy.bin
Normal file
BIN
kernel/libsepol/fuzz/policy.bin
Normal file
Binary file not shown.
74
kernel/libsepol/fuzz/secilc-fuzzer.c
Normal file
74
kernel/libsepol/fuzz/secilc-fuzzer.c
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <sepol/cil/cil.h>
|
||||||
|
#include <sepol/policydb.h>
|
||||||
|
|
||||||
|
static void log_handler(__attribute__((unused)) int lvl, __attribute__((unused)) const char *msg) {
|
||||||
|
/* be quiet */
|
||||||
|
}
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||||
|
enum cil_log_level log_level = CIL_ERR;
|
||||||
|
struct sepol_policy_file *pf = NULL;
|
||||||
|
FILE *dev_null = NULL;
|
||||||
|
int target = SEPOL_TARGET_SELINUX;
|
||||||
|
int disable_dontaudit = 0;
|
||||||
|
int multiple_decls = 0;
|
||||||
|
int disable_neverallow = 0;
|
||||||
|
int preserve_tunables = 0;
|
||||||
|
int policyvers = POLICYDB_VERSION_MAX;
|
||||||
|
int mls = -1;
|
||||||
|
int attrs_expand_generated = 0;
|
||||||
|
struct cil_db *db = NULL;
|
||||||
|
sepol_policydb_t *pdb = NULL;
|
||||||
|
|
||||||
|
cil_set_log_level(log_level);
|
||||||
|
cil_set_log_handler(log_handler);
|
||||||
|
|
||||||
|
cil_db_init(&db);
|
||||||
|
cil_set_disable_dontaudit(db, disable_dontaudit);
|
||||||
|
cil_set_multiple_decls(db, multiple_decls);
|
||||||
|
cil_set_disable_neverallow(db, disable_neverallow);
|
||||||
|
cil_set_preserve_tunables(db, preserve_tunables);
|
||||||
|
cil_set_mls(db, mls);
|
||||||
|
cil_set_target_platform(db, target);
|
||||||
|
cil_set_policy_version(db, policyvers);
|
||||||
|
cil_set_attrs_expand_generated(db, attrs_expand_generated);
|
||||||
|
|
||||||
|
if (cil_add_file(db, "fuzz", (const char *)data, size) != SEPOL_OK)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (cil_compile(db) != SEPOL_OK)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (cil_build_policydb(db, &pdb) != SEPOL_OK)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (sepol_policydb_optimize(pdb) != SEPOL_OK)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
dev_null = fopen("/dev/null", "w");
|
||||||
|
if (dev_null == NULL)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (sepol_policy_file_create(&pf) != 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
sepol_policy_file_set_fp(pf, dev_null);
|
||||||
|
|
||||||
|
if (sepol_policydb_write(pdb, pf) != 0)
|
||||||
|
goto exit;
|
||||||
|
exit:
|
||||||
|
if (dev_null != NULL)
|
||||||
|
fclose(dev_null);
|
||||||
|
|
||||||
|
cil_db_destroy(&db);
|
||||||
|
sepol_policydb_free(pdb);
|
||||||
|
sepol_policy_file_free(pf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
17
kernel/libsepol/include/Makefile
Normal file
17
kernel/libsepol/include/Makefile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Installation directories.
|
||||||
|
PREFIX ?= /usr
|
||||||
|
INCDIR = $(PREFIX)/include/sepol
|
||||||
|
CILDIR ?= ../cil
|
||||||
|
|
||||||
|
all:
|
||||||
|
|
||||||
|
install: all
|
||||||
|
test -d $(DESTDIR)$(INCDIR) || install -m 755 -d $(DESTDIR)$(INCDIR)
|
||||||
|
test -d $(DESTDIR)$(INCDIR)/policydb || install -m 755 -d $(DESTDIR)$(INCDIR)/policydb
|
||||||
|
test -d $(DESTDIR)$(INCDIR)/cil || install -m 755 -d $(DESTDIR)$(INCDIR)/cil
|
||||||
|
install -m 644 $(wildcard sepol/*.h) $(DESTDIR)$(INCDIR)
|
||||||
|
install -m 644 $(wildcard sepol/policydb/*.h) $(DESTDIR)$(INCDIR)/policydb
|
||||||
|
install -m 644 $(wildcard $(CILDIR)/include/cil/*.h) $(DESTDIR)$(INCDIR)/cil
|
||||||
|
|
||||||
|
indent:
|
||||||
|
../../scripts/Lindent $(wildcard sepol/*.h)
|
||||||
59
kernel/libsepol/include/sepol/boolean_record.h
Normal file
59
kernel/libsepol/include/sepol/boolean_record.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#ifndef _SEPOL_BOOLEAN_RECORD_H_
|
||||||
|
#define _SEPOL_BOOLEAN_RECORD_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <sepol/handle.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sepol_bool;
|
||||||
|
struct sepol_bool_key;
|
||||||
|
typedef struct sepol_bool sepol_bool_t;
|
||||||
|
typedef struct sepol_bool_key sepol_bool_key_t;
|
||||||
|
|
||||||
|
/* Key */
|
||||||
|
extern int sepol_bool_key_create(sepol_handle_t * handle,
|
||||||
|
const char *name, sepol_bool_key_t ** key);
|
||||||
|
|
||||||
|
extern void sepol_bool_key_unpack(const sepol_bool_key_t * key,
|
||||||
|
const char **name);
|
||||||
|
|
||||||
|
extern int sepol_bool_key_extract(sepol_handle_t * handle,
|
||||||
|
const sepol_bool_t * boolean,
|
||||||
|
sepol_bool_key_t ** key_ptr);
|
||||||
|
|
||||||
|
extern void sepol_bool_key_free(sepol_bool_key_t * key);
|
||||||
|
|
||||||
|
extern int sepol_bool_compare(const sepol_bool_t * boolean,
|
||||||
|
const sepol_bool_key_t * key);
|
||||||
|
|
||||||
|
extern int sepol_bool_compare2(const sepol_bool_t * boolean,
|
||||||
|
const sepol_bool_t * boolean2);
|
||||||
|
|
||||||
|
/* Name */
|
||||||
|
extern const char *sepol_bool_get_name(const sepol_bool_t * boolean);
|
||||||
|
|
||||||
|
extern int sepol_bool_set_name(sepol_handle_t * handle,
|
||||||
|
sepol_bool_t * boolean, const char *name);
|
||||||
|
|
||||||
|
/* Value */
|
||||||
|
extern int sepol_bool_get_value(const sepol_bool_t * boolean);
|
||||||
|
|
||||||
|
extern void sepol_bool_set_value(sepol_bool_t * boolean, int value);
|
||||||
|
|
||||||
|
/* Create/Clone/Destroy */
|
||||||
|
extern int sepol_bool_create(sepol_handle_t * handle, sepol_bool_t ** bool_ptr);
|
||||||
|
|
||||||
|
extern int sepol_bool_clone(sepol_handle_t * handle,
|
||||||
|
const sepol_bool_t * boolean,
|
||||||
|
sepol_bool_t ** bool_ptr);
|
||||||
|
|
||||||
|
extern void sepol_bool_free(sepol_bool_t * boolean);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
49
kernel/libsepol/include/sepol/booleans.h
Normal file
49
kernel/libsepol/include/sepol/booleans.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#ifndef _SEPOL_BOOLEANS_H_
|
||||||
|
#define _SEPOL_BOOLEANS_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <sepol/policydb.h>
|
||||||
|
#include <sepol/boolean_record.h>
|
||||||
|
#include <sepol/handle.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set the specified boolean */
|
||||||
|
extern int sepol_bool_set(sepol_handle_t * handle,
|
||||||
|
sepol_policydb_t * policydb,
|
||||||
|
const sepol_bool_key_t * key,
|
||||||
|
const sepol_bool_t * data);
|
||||||
|
|
||||||
|
/* Return the number of booleans */
|
||||||
|
extern int sepol_bool_count(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * p, unsigned int *response);
|
||||||
|
|
||||||
|
/* Check if the specified boolean exists */
|
||||||
|
extern int sepol_bool_exists(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * policydb,
|
||||||
|
const sepol_bool_key_t * key, int *response);
|
||||||
|
|
||||||
|
/* Query a boolean - returns the boolean, or NULL if not found */
|
||||||
|
extern int sepol_bool_query(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * p,
|
||||||
|
const sepol_bool_key_t * key,
|
||||||
|
sepol_bool_t ** response);
|
||||||
|
|
||||||
|
/* Iterate the booleans
|
||||||
|
* The handler may return:
|
||||||
|
* -1 to signal an error condition,
|
||||||
|
* 1 to signal successful exit
|
||||||
|
* 0 to signal continue */
|
||||||
|
|
||||||
|
extern int sepol_bool_iterate(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * policydb,
|
||||||
|
int (*fn) (const sepol_bool_t * boolean,
|
||||||
|
void *fn_arg), void *arg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
34
kernel/libsepol/include/sepol/context.h
Normal file
34
kernel/libsepol/include/sepol/context.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef _SEPOL_CONTEXT_H_
|
||||||
|
#define _SEPOL_CONTEXT_H_
|
||||||
|
|
||||||
|
#include <sepol/context_record.h>
|
||||||
|
#include <sepol/policydb.h>
|
||||||
|
#include <sepol/handle.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -- Deprecated -- */
|
||||||
|
|
||||||
|
extern int sepol_check_context(const char *context);
|
||||||
|
|
||||||
|
/* -- End deprecated -- */
|
||||||
|
|
||||||
|
extern int sepol_context_check(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * policydb,
|
||||||
|
const sepol_context_t * context);
|
||||||
|
|
||||||
|
extern int sepol_mls_contains(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * policydb,
|
||||||
|
const char *mls1,
|
||||||
|
const char *mls2, int *response);
|
||||||
|
|
||||||
|
extern int sepol_mls_check(sepol_handle_t * handle,
|
||||||
|
const sepol_policydb_t * policydb, const char *mls);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
61
kernel/libsepol/include/sepol/context_record.h
Normal file
61
kernel/libsepol/include/sepol/context_record.h
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
#ifndef _SEPOL_CONTEXT_RECORD_H_
|
||||||
|
#define _SEPOL_CONTEXT_RECORD_H_
|
||||||
|
|
||||||
|
#include <sepol/handle.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sepol_context;
|
||||||
|
typedef struct sepol_context sepol_context_t;
|
||||||
|
|
||||||
|
/* We don't need a key, because the context is never stored
|
||||||
|
* in a data collection by itself */
|
||||||
|
|
||||||
|
/* User */
|
||||||
|
extern const char *sepol_context_get_user(const sepol_context_t * con);
|
||||||
|
|
||||||
|
extern int sepol_context_set_user(sepol_handle_t * handle,
|
||||||
|
sepol_context_t * con, const char *user);
|
||||||
|
|
||||||
|
/* Role */
|
||||||
|
extern const char *sepol_context_get_role(const sepol_context_t * con);
|
||||||
|
|
||||||
|
extern int sepol_context_set_role(sepol_handle_t * handle,
|
||||||
|
sepol_context_t * con, const char *role);
|
||||||
|
|
||||||
|
/* Type */
|
||||||
|
extern const char *sepol_context_get_type(const sepol_context_t * con);
|
||||||
|
|
||||||
|
extern int sepol_context_set_type(sepol_handle_t * handle,
|
||||||
|
sepol_context_t * con, const char *type);
|
||||||
|
|
||||||
|
/* MLS */
|
||||||
|
extern const char *sepol_context_get_mls(const sepol_context_t * con);
|
||||||
|
|
||||||
|
extern int sepol_context_set_mls(sepol_handle_t * handle,
|
||||||
|
sepol_context_t * con, const char *mls_range);
|
||||||
|
|
||||||
|
/* Create/Clone/Destroy */
|
||||||
|
extern int sepol_context_create(sepol_handle_t * handle,
|
||||||
|
sepol_context_t ** con_ptr);
|
||||||
|
|
||||||
|
extern int sepol_context_clone(sepol_handle_t * handle,
|
||||||
|
const sepol_context_t * con,
|
||||||
|
sepol_context_t ** con_ptr);
|
||||||
|
|
||||||
|
extern void sepol_context_free(sepol_context_t * con);
|
||||||
|
|
||||||
|
/* Parse to/from string */
|
||||||
|
extern int sepol_context_from_string(sepol_handle_t * handle,
|
||||||
|
const char *str, sepol_context_t ** con);
|
||||||
|
|
||||||
|
extern int sepol_context_to_string(sepol_handle_t * handle,
|
||||||
|
const sepol_context_t * con, char **str_ptr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
43
kernel/libsepol/include/sepol/debug.h
Normal file
43
kernel/libsepol/include/sepol/debug.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#ifndef _SEPOL_DEBUG_H_
|
||||||
|
#define _SEPOL_DEBUG_H_
|
||||||
|
|
||||||
|
#include <sepol/handle.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
extern void sepol_debug(int on);
|
||||||
|
/* End deprecated */
|
||||||
|
|
||||||
|
#define SEPOL_MSG_ERR 1
|
||||||
|
#define SEPOL_MSG_WARN 2
|
||||||
|
#define SEPOL_MSG_INFO 3
|
||||||
|
|
||||||
|
extern int sepol_msg_get_level(sepol_handle_t * handle);
|
||||||
|
|
||||||
|
extern const char *sepol_msg_get_channel(sepol_handle_t * handle);
|
||||||
|
|
||||||
|
extern const char *sepol_msg_get_fname(sepol_handle_t * handle);
|
||||||
|
|
||||||
|
/* Set the messaging callback.
|
||||||
|
* By the default, the callback will print
|
||||||
|
* the message on standard output, in a
|
||||||
|
* particular format. Passing NULL here
|
||||||
|
* indicates that messaging should be suppressed */
|
||||||
|
extern void sepol_msg_set_callback(sepol_handle_t * handle,
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__ ((format(printf, 3, 4)))
|
||||||
|
#endif
|
||||||
|
void (*msg_callback) (void *varg,
|
||||||
|
sepol_handle_t *
|
||||||
|
handle,
|
||||||
|
const char *fmt, ...),
|
||||||
|
void *msg_callback_arg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
34
kernel/libsepol/include/sepol/errcodes.h
Normal file
34
kernel/libsepol/include/sepol/errcodes.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/* Author: Karl MacMillan <kmacmillan@mentalrootkit.com> */
|
||||||
|
|
||||||
|
#ifndef __sepol_errno_h__
|
||||||
|
#define __sepol_errno_h__
|
||||||
|
|
||||||
|
// #include <errno.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SEPOL_OK 0
|
||||||
|
|
||||||
|
/* These first error codes are defined for compatibility with
|
||||||
|
* previous version of libsepol. In the future, custom error
|
||||||
|
* codes that don't map to system error codes should be defined
|
||||||
|
* outside of the range of system error codes.
|
||||||
|
*/
|
||||||
|
#define SEPOL_ERR -1
|
||||||
|
#define SEPOL_ENOTSUP -2 /* feature not supported in module language */
|
||||||
|
#define SEPOL_EREQ -3 /* requirements not met */
|
||||||
|
|
||||||
|
/* Error codes that map to system error codes */
|
||||||
|
#define SEPOL_ENOMEM -ENOMEM
|
||||||
|
#define SEPOL_ERANGE -ERANGE
|
||||||
|
#define SEPOL_EEXIST -EEXIST
|
||||||
|
#define SEPOL_ENOENT -ENOENT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user