Beispiel #1
0
char *
canonicalize_path(const char *path)
{
    char *canonical;
    char *p;

    if (path == NULL)
        return NULL;

    canonical = malloc(PATH_MAX+2);
    if (!canonical)
        return NULL;
    if (!myrealpath(path, canonical, PATH_MAX+1))
    {
        free(canonical);
        return strdup(path);
    }


    p = strrchr(canonical, '/');
    if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4)))
    {
        p = canonicalize_dm_name(p+1);
        if (p)
        {
            free(canonical);
            return p;
        }
    }

    return canonical;
}
Beispiel #2
0
char *
canonicalize_path(const char *path)
{
	char canonical[PATH_MAX+2];
	char *p;

	if (path == NULL)
		return NULL;

	if (!myrealpath(path, canonical, PATH_MAX+1)) {
		char *res = strdup(path);
		if (res) {
			p = strrchr(res, '/');
			/* delete trailing slash */
			if (p && p > res && *(p + 1) == '\0')
				*p = '\0';
		}
		return res;
	}

	p = strrchr(canonical, '/');
	if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
		p = canonicalize_dm_name(p+1);
		if (p)
			return p;
	}

	return strdup(canonical);
}
Beispiel #3
0
char *ntfs_realpath_canonicalize(const char *path, char *canonical)
{
	char *p;

	if (path == NULL)
		return NULL;

	if (!ntfs_realpath(path, canonical))
		return NULL;

	p = strrchr(canonical, '/');
	if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
		p = canonicalize_dm_name(p+1, canonical);
		if (p)
			return p;
	}

	return canonical;
}
Beispiel #4
0
char *canonicalize_path_restricted(const char *path)
{
	char *canonical, *p = NULL;
	int errsv;
	uid_t euid;
	gid_t egid;

	if (!path || !*path)
		return NULL;

	euid = geteuid();
	egid = getegid();

	/* drop permissions */
	if (setegid(getgid()) < 0 || seteuid(getuid()) < 0)
		return NULL;

	errsv = errno = 0;

	canonical = realpath(path, NULL);
	if (canonical) {
		p = strrchr(canonical, '/');
		if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
			char *dm = canonicalize_dm_name(p + 1);
			if (dm) {
				free(canonical);
				canonical = dm;
			}
		}
	} else
		errsv = errno;

	/* restore */
	if (setegid(egid) < 0 || seteuid(euid) < 0) {
		free(canonical);
		return NULL;
	}

	errno = errsv;
	return canonical;
}
Beispiel #5
0
char *canonicalize_path(const char *path)
{
	char canonical[PATH_MAX+2];
	char *p;

	if (path == NULL)
		return NULL;

	if (!myrealpath(path, canonical, PATH_MAX+1))
		return strdup(path);


	p = strrchr(canonical, '/');
	if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
		p = canonicalize_dm_name(p+1);
		if (p)
			return p;
	}

	return strdup(canonical);
}
char *canonicalize_path(const char *path)
{
	char *canonical, *dmname;

	if (!path || !*path)
		return NULL;

	canonical = realpath(path, NULL);
	if (!canonical)
		return strdup(path);

	if (is_dm_devname(canonical, &dmname)) {
		char *dm = canonicalize_dm_name(dmname);
		if (dm) {
			free(canonical);
			return dm;
		}
	}

	return canonical;
}
char *canonicalize_path_restricted(const char *path)
{
	char *canonical, *dmname;
	int errsv;
	uid_t euid;
	gid_t egid;

	if (!path || !*path)
		return NULL;

	euid = geteuid();
	egid = getegid();

	/* drop permissions */
	if (setegid(getgid()) < 0 || seteuid(getuid()) < 0)
		return NULL;

	errsv = errno = 0;

	canonical = realpath(path, NULL);
	if (!canonical)
		errsv = errno;
	else if (is_dm_devname(canonical, &dmname)) {
		char *dm = canonicalize_dm_name(dmname);
		if (dm) {
			free(canonical);
			canonical = dm;
		}
	}

	/* restore */
	if (setegid(egid) < 0 || seteuid(euid) < 0) {
		free(canonical);
		return NULL;
	}

	errno = errsv;
	return canonical;
}
Beispiel #8
0
char *canonicalize_path(const char *path)
{
	char *canonical, *p;

	if (!path || !*path)
		return NULL;

	canonical = realpath(path, NULL);
	if (!canonical)
		return strdup(path);

	p = strrchr(canonical, '/');
	if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
		char *dm = canonicalize_dm_name(p + 1);
		if (dm) {
			free(canonical);
			return dm;
		}
	}

	return canonical;
}