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; }
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); }
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; }
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; }
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; }
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; }