summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
d542c20)
server's config-specified exclude list. This prevents the user from
going around directory exclusions. Fixed push_dir() to not append
"/." onto the end of the current path if it is called with "." as the
"dir" arg. Made curr_dir[] exported so the exclude code can use it
(for the daemon-config absolute-path excludes).
counter = 1;
} while (((rc = access(path, 0)) == 0) && (counter != start));
counter = 1;
} while (((rc = access(path, 0)) == 0) && (counter != start));
rprintf(FINFO,"renaming %s to %s because of text busy\n",
rprintf(FINFO,"renaming %s to %s because of text busy\n",
/* maybe we should return rename()'s exit status? Nah. */
if (do_rename(fname, path) != 0) {
/* maybe we should return rename()'s exit status? Nah. */
if (do_rename(fname, path) != 0) {
return fcntl(fd,F_SETLK,&lock) == 0;
}
return fcntl(fd,F_SETLK,&lock) == 0;
}
+static int exclude_server_path(char *arg)
+{
+ char *s;
+ extern struct exclude_struct **server_exclude_list;
+
+ if (server_exclude_list) {
+ for (s = arg; (s = strchr(s, '/')) != NULL; ) {
+ *s = '\0';
+ if (check_exclude(server_exclude_list, arg, 1)) {
+ /* We must leave arg truncated! */
+ return 1;
+ }
+ *s++ = '/';
+ }
+ }
+ return 0;
+}
static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
{
#if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H))
if (!*s) s = ".";
static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
{
#if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H))
if (!*s) s = ".";
- argv[*argc] = strdup(s);
+ s = argv[*argc] = strdup(s);
+ exclude_server_path(s);
#else
extern int sanitize_paths;
glob_t globbuf;
#else
extern int sanitize_paths;
glob_t globbuf;
- argv[*argc] = strdup(s);
+ s = argv[*argc] = strdup(s);
- sanitize_path(argv[*argc], NULL);
+ sanitize_path(s, NULL);
}
memset(&globbuf, 0, sizeof(globbuf));
}
memset(&globbuf, 0, sizeof(globbuf));
- glob(argv[*argc], 0, NULL, &globbuf);
+ if (!exclude_server_path(s))
+ glob(s, 0, NULL, &globbuf);
if (globbuf.gl_pathc == 0) {
(*argc)++;
globfree(&globbuf);
return;
}
for (i=0; i<(maxargs - (*argc)) && i < (int) globbuf.gl_pathc;i++) {
if (globbuf.gl_pathc == 0) {
(*argc)++;
globfree(&globbuf);
return;
}
for (i=0; i<(maxargs - (*argc)) && i < (int) globbuf.gl_pathc;i++) {
- if (i == 0) free(argv[*argc]);
argv[(*argc) + i] = strdup(globbuf.gl_pathv[i]);
if (!argv[(*argc) + i]) out_of_memory("glob_expand");
}
argv[(*argc) + i] = strdup(globbuf.gl_pathv[i]);
if (!argv[(*argc) + i]) out_of_memory("glob_expand");
}
+/* This routine is only used in daemon mode. */
void glob_expand(char *base1, char **argv, int *argc, int maxargs)
{
char *s = argv[*argc];
char *p, *q;
char *base = base1;
void glob_expand(char *base1, char **argv, int *argc, int maxargs)
{
char *s = argv[*argc];
char *p, *q;
char *base = base1;
+ int base_len = strlen(base);
- if (strncmp(s, base, strlen(base)) == 0) {
- s += strlen(base);
- }
+ if (strncmp(s, base, base_len) == 0)
+ s += base_len;
s = strdup(s);
if (!s) out_of_memory("glob_expand");
if (asprintf(&base," %s/", base1) <= 0) out_of_memory("glob_expand");
s = strdup(s);
if (!s) out_of_memory("glob_expand");
if (asprintf(&base," %s/", base1) <= 0) out_of_memory("glob_expand");
q = s;
while ((p = strstr(q,base)) && ((*argc) < maxargs)) {
/* split it at this point */
*p = 0;
glob_expand_one(q, argv, argc, maxargs);
q = s;
while ((p = strstr(q,base)) && ((*argc) < maxargs)) {
/* split it at this point */
*p = 0;
glob_expand_one(q, argv, argc, maxargs);
}
if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs);
}
if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs);
}
allowdotdot = 0;
if ((*p == '.') && (*(p+1) == '.') &&
}
allowdotdot = 0;
if ((*p == '.') && (*(p+1) == '.') &&
- ((*(p+2) == '/') || (*(p+2) == '\0'))) {
+ ((*(p+2) == '/') || (*(p+2) == '\0'))) {
/* ".." component followed by slash or end */
if ((depth > 0) && (sanp == start)) {
/* allow depth levels of .. at the beginning */
/* ".." component followed by slash or end */
if ((depth > 0) && (sanp == start)) {
/* allow depth levels of .. at the beginning */
-static char curr_dir[MAXPATHLEN];
+char curr_dir[MAXPATHLEN];
/**
* Like chdir() but can be reversed with pop_dir() if @p save is set.
/**
* Like chdir() but can be reversed with pop_dir() if @p save is set.
if (*dir == '/') {
strlcpy(curr_dir, dir, sizeof(curr_dir));
if (*dir == '/') {
strlcpy(curr_dir, dir, sizeof(curr_dir));
+ } else if (dir[0] != '.' || dir[1] != '\0') {
strlcat(curr_dir,"/", sizeof(curr_dir));
strlcat(curr_dir,dir, sizeof(curr_dir));
}
strlcat(curr_dir,"/", sizeof(curr_dir));
strlcat(curr_dir,dir, sizeof(curr_dir));
}