struct dir *dir; /* Structure describing this directory */
int pidx; /* Parent's dsitem structure index. */
int checked; /* Have we checked this directory ? */
+ int path_len;
char *path; /* absolute UNIX path to this directory */
};
static int addstack(char *uname, struct dir *dir, int pidx)
{
struct dsitem *ds;
- int l;
+ size_t l, u;
/* check if we have some space on stack... */
if (dsidx >= dssize) {
ds = dstack + dsidx++;
ds->dir = dir;
ds->pidx = pidx;
+ ds->checked = 0;
if (pidx >= 0) {
- l = strlen(dstack[pidx].path);
- if (!(ds->path = malloc(l + strlen(uname) + 2) ))
+ l = dstack[pidx].path_len;
+ u = strlen(uname) +1;
+ if (!(ds->path = malloc(l + u + 1) ))
return -1;
- strcpy(ds->path, dstack[pidx].path);
- strcat(ds->path, "/");
- strcat(ds->path, uname);
+ memcpy(ds->path, dstack[pidx].path, l);
+ ds->path[l] = '/';
+ memcpy(&ds->path[l+1], uname, u);
+ ds->path_len = l +u;
+ }
+ else {
+ ds->path = strdup(uname);
+ ds->path_len = strlen(uname);
}
-
- ds->checked = 0;
-
return 0;
}
* rbuf - output buffer
* rbuflen - output buffer length
*/
-#define NUM_ROUNDS 100
+#define NUM_ROUNDS 200
static int catsearch(struct vol *vol, struct dir *dir,
int rmatches, u_int32_t *pos, char *rbuf, u_int32_t *nrecs, int *rsize, int ext)
{
dirpos = NULL;
}
- if (addstack("", dir, -1) == -1) {
+ if (addstack(vpath, dir, -1) == -1) {
result = AFPERR_MISC;
goto catsearch_end;
}
- dstack[0].path = strdup(vpath);
/* FIXME: Sometimes DID is given by client ! (correct this one above !) */
}