[PATCH] Remove duplicate slashes in paths in selabel_lookup

This patch simply removes duplicate slashes (meaning "//") from
pathnames passed into selabel_lookup. It does not do a full
realpath() calculation (e.g. following symlinks, etc.), as the
client should really do that before calling into libselinux.

Signed-off-by: Chad Sellers <csellers@tresys.com>
This commit is contained in:
Chad Sellers 2010-06-02 14:39:36 -04:00
parent edf1df5429
commit 8f007923dd
1 changed files with 31 additions and 6 deletions

View File

@ -584,13 +584,34 @@ static struct selabel_lookup_rec *lookup(struct selabel_handle *rec,
spec_t *spec_arr = data->spec_arr;
int i, rc, file_stem;
mode_t mode = (mode_t)type;
const char *buf = key;
const char *buf;
struct selabel_lookup_rec *ret = NULL;
char *clean_key = NULL;
const char *prev_slash, *next_slash;
unsigned int sofar = 0;
if (!data->nspec) {
errno = ENOENT;
return NULL;
goto finish;
}
/* Remove duplicate slashes */
if ((next_slash = strstr(key, "//"))) {
clean_key = malloc(strlen(key) + 1);
if (!clean_key)
goto finish;
prev_slash = key;
while (next_slash) {
memcpy(clean_key + sofar, prev_slash, next_slash - prev_slash);
sofar += next_slash - prev_slash;
prev_slash = next_slash + 1;
next_slash = strstr(prev_slash, "//");
}
strcpy(clean_key + sofar, prev_slash);
key = clean_key;
}
buf = key;
file_stem = find_stem_from_file(data, &buf);
mode &= S_IFMT;
@ -608,7 +629,7 @@ static struct selabel_lookup_rec *lookup(struct selabel_handle *rec,
&& (!mode || !spec_arr[i].mode
|| mode == spec_arr[i].mode)) {
if (compile_regex(data, &spec_arr[i], NULL) < 0)
return NULL;
goto finish;
if (spec_arr[i].stem_id == -1)
rc = regexec(&spec_arr[i].regex, key, 0, 0, 0);
else
@ -621,17 +642,21 @@ static struct selabel_lookup_rec *lookup(struct selabel_handle *rec,
if (rc == REG_NOMATCH)
continue;
/* else it's an error */
return NULL;
goto finish;
}
}
if (i < 0 || strcmp(spec_arr[i].lr.ctx_raw, "<<none>>") == 0) {
/* No matching specification. */
errno = ENOENT;
return NULL;
goto finish;
}
return &spec_arr[i].lr;
ret = &spec_arr[i].lr;
finish:
free(clean_key);
return ret;
}
static void stats(struct selabel_handle *rec)