Skip to content

Commit

Permalink
libsepol: make scope_index_destroy() more robust
Browse files Browse the repository at this point in the history
When scope_index_read() fails while attempting to allocate memory for
scope_index->class_perms_map, scope_index_destroy() gets called with
scope->class_perms_len != 0 and scope->class_perms_map == NULL. This
triggers the following segmentation fault (in semodule_package):

    Program received signal SIGSEGV, Segmentation fault.
    ebitmap_destroy (e=0x10) at ebitmap.c:362
    362     n = e->node;
    => 0x00007ffff79ff7f6 <ebitmap_destroy+134>:    48 8b 3f    mov
    (%rdi),%rdi

    (gdb) bt
    #0  ebitmap_destroy (e=0x10) at ebitmap.c:362
    #1  0x00007ffff79e2c37 in scope_index_destroy (scope=0x608860) at
    avrule_block.c:87
    #2  avrule_decl_destroy (x=0x608830) at avrule_block.c:103
    #3  0x00007ffff7aae99c in avrule_block_read (fp=0x605090,
    num_scope_syms=8, block=0x6054e8, p=0x605360) at policydb.c:3598
    #4  policydb_read (p=0x605360, fp=fp@entry=0x605090,
    verbose=verbose@entry=0) at policydb.c:3946
    #5  0x00007ffff7ab4ab4 in sepol_policydb_read (p=<optimized out>,
    pf=pf@entry=0x605090) at policydb_public.c:174
    #6  0x0000000000401d33 in main (argc=<optimized out>,
    argv=0x7fffffffdc88) at semodule_package.c:220

    (gdb) f 1

    (gdb) p *scope
    $1 = {scope = {{node = 0x0, highbit = 0}, {node = 0x0, highbit = 0},
    {node = 0x0, highbit = 0}, {node = 0x0, highbit = 0}, {node = 0x0,
    highbit = 0}, {node = 0x0, highbit = 0}, {node = 0x0, highbit = 0},
    {node = 0x0, highbit = 0}}, class_perms_map = 0x0, class_perms_len =
    4294934272}

Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
  • Loading branch information
fishilico authored and stephensmalley committed Nov 23, 2016
1 parent 8d31f80 commit d107256
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions libsepol/src/avrule_block.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,10 @@ static void scope_index_destroy(scope_index_t * scope)
for (i = 0; i < SYM_NUM; i++) {
ebitmap_destroy(scope->scope + i);
}
for (i = 0; i < scope->class_perms_len; i++) {
ebitmap_destroy(scope->class_perms_map + i);
if (scope->class_perms_map) {
for (i = 0; i < scope->class_perms_len; i++) {
ebitmap_destroy(scope->class_perms_map + i);
}
}
free(scope->class_perms_map);
}
Expand Down

0 comments on commit d107256

Please sign in to comment.