Description: Support wildcard source (EG /lib/*) in file_contexts.subs_dist Index: libselinux-2.8/src/label_file.c =================================================================== --- libselinux-2.8.orig/src/label_file.c +++ libselinux-2.8/src/label_file.c @@ -581,6 +581,25 @@ static char *selabel_sub(struct selabel_ while (ptr) { if (strncmp(src, ptr->src, ptr->slen) == 0 ) { + if (ptr->wildcard) + { + if ( src[ptr->slen] == 0 || !strchr(src+ptr->slen, '/') ) + { + ptr = ptr->next; + continue; + } + for(len = ptr->slen + 1 ; src[len] && src[len] != '/' ; len++) + ; + if(!src[len]) + { + ptr = ptr->next; + continue; + } + len++; + if (asprintf(&dst, "%s%s", ptr->dst, &src[len]) < 0) + return NULL; + return dst; + } if (src[ptr->slen] == '/' || src[ptr->slen] == 0) { if ((src[ptr->slen] == '/') && @@ -606,6 +625,7 @@ static int selabel_subs_init(const char struct selabel_sub *list = NULL, *sub = NULL; struct stat sb; int status = -1; + int len; *out_subs = NULL; if (!cfg) { @@ -630,6 +650,8 @@ static int selabel_subs_init(const char *ptr++ = '\0'; if (! *src) continue; + if(!strcmp("/*", src)) continue; + dst = ptr; while (*dst && isspace(*dst)) dst++; @@ -645,6 +667,16 @@ static int selabel_subs_init(const char goto err; memset(sub, 0, sizeof(*sub)); + len = strlen(src); + if(len < 2) continue; + if(src[len - 1] == '*') + { + sub->wildcard = 1; + src[len - 1] = 0; + len--; + } + else + sub->wildcard = 0; sub->src=strdup(src); if (! sub->src) goto err; Index: libselinux-2.8/src/label_file.h =================================================================== --- libselinux-2.8.orig/src/label_file.h +++ libselinux-2.8/src/label_file.h @@ -35,6 +35,7 @@ struct selabel_sub { char *src; int slen; char *dst; + int wildcard; struct selabel_sub *next; };