Rebase on upstream commit 32611aea6543
See
    $ cd SELinuxProject/selinux
    $ git log --pretty=oneline libsepol-3.2..32611aea6543 -- libsepol
		
	
			
		
			
				
	
	
		
			56 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From ac8b35d910750b56d38d54f312a712a73c95749c Mon Sep 17 00:00:00 2001
 | |
| From: James Carter <jwcart2@gmail.com>
 | |
| Date: Mon, 21 Jun 2021 10:34:33 -0400
 | |
| Subject: [PATCH] libsepol/cil: Fix syntax checking of defaultrange rule
 | |
| 
 | |
| When "glblub" was added as a default for the defaultrange rule, the
 | |
| syntax array was updated because the "glblub" default does not need
 | |
| to specify a range of "low", "high", or "low-high". Unfortunately,
 | |
| additional checking was not added for the "source" and "target"
 | |
| defaults to make sure they specified a range. This means that using
 | |
| the "source" or "target" defaults without specifying the range will
 | |
| result in a segfault.
 | |
| 
 | |
| When the "source" or "target" defaults are used, check that the rule
 | |
| specifies a range as well.
 | |
| 
 | |
| This bug was found by the secilc-fuzzer.
 | |
| 
 | |
| Signed-off-by: James Carter <jwcart2@gmail.com>
 | |
| Acked-by: Nicolas Iooss <nicolas.iooss@m4x.org>
 | |
| ---
 | |
|  libsepol/cil/src/cil_build_ast.c | 10 ++++++++++
 | |
|  1 file changed, 10 insertions(+)
 | |
| 
 | |
| diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
 | |
| index ea665a323f78..baed3e581be4 100644
 | |
| --- a/libsepol/cil/src/cil_build_ast.c
 | |
| +++ b/libsepol/cil/src/cil_build_ast.c
 | |
| @@ -5886,6 +5886,11 @@ int cil_gen_defaultrange(struct cil_tree_node *parse_current, struct cil_tree_no
 | |
|  
 | |
|  	object = parse_current->next->next->data;
 | |
|  	if (object == CIL_KEY_SOURCE) {
 | |
| +		if (!parse_current->next->next->next) {
 | |
| +			cil_log(CIL_ERR, "Missing 'low', 'high', or 'low-high'\n");
 | |
| +			rc = SEPOL_ERR;
 | |
| +			goto exit;
 | |
| +		}
 | |
|  		range = parse_current->next->next->next->data;
 | |
|  		if (range == CIL_KEY_LOW) {
 | |
|  			def->object_range = CIL_DEFAULT_SOURCE_LOW;
 | |
| @@ -5899,6 +5904,11 @@ int cil_gen_defaultrange(struct cil_tree_node *parse_current, struct cil_tree_no
 | |
|  			goto exit;
 | |
|  		}
 | |
|  	} else if (object == CIL_KEY_TARGET) {
 | |
| +		if (!parse_current->next->next->next) {
 | |
| +			cil_log(CIL_ERR, "Missing 'low', 'high', or 'low-high'\n");
 | |
| +			rc = SEPOL_ERR;
 | |
| +			goto exit;
 | |
| +		}
 | |
|  		range = parse_current->next->next->next->data;
 | |
|  		if (range == CIL_KEY_LOW) {
 | |
|  			def->object_range = CIL_DEFAULT_TARGET_LOW;
 | |
| -- 
 | |
| 2.32.0
 | |
| 
 |