diff --git a/WINGs/proplist.c b/WINGs/proplist.c index 54099991..e7a764df 100644 --- a/WINGs/proplist.c +++ b/WINGs/proplist.c @@ -1824,7 +1824,7 @@ static int wrmdirhier_fn(const char *path, const struct stat *st, /* * remove a directory hierarchy * - * refuses to remove anything outside $WMAKER_USER_ROOT + * refuses to remove anything outside $WMAKER_USER_ROOT/Defaults or $WMAKER_USER_ROOT/Library * * returns 1 on success, 0 on failure * @@ -1834,15 +1834,27 @@ static int wrmdirhier_fn(const char *path, const struct stat *st, */ int wrmdirhier(const char *path) { + const char *libpath; + char *udefpath = NULL; struct stat st; int error; - const char *t; - /* Only remove directories under $WMAKER_USER_ROOT */ - if ((t = wusergnusteppath()) == NULL) - return EPERM; - if (strncmp(path, t, strlen(t)) != 0) - return EPERM; + /* Only remove directories under $WMAKER_USER_ROOT/Defaults or $WMAKER_USER_ROOT/Library */ + libpath = wuserdatapath(); + if (strncmp(path, libpath, strlen(libpath)) == 0) + if (path[strlen(libpath)] == '/') + goto path_in_valid_tree; + + udefpath = wdefaultspathfordomain(""); + if (strncmp(path, udefpath, strlen(udefpath)) == 0) + /* Note: by side effect, 'udefpath' already contains a final '/' */ + goto path_in_valid_tree; + + wfree(udefpath); + return EPERM; + + path_in_valid_tree: + wfree(udefpath); /* Shortcut if it doesn't exist to begin with */ if (stat(path, &st) == -1)