Unified · Split
| @@ -431,15 +431,20 @@ int · 430 unmodified lines | ||
| 431 | 431 | _9pdirread(int fd, FFid *f, Dir **d) |
| 432 | 432 | { |
| 433 | 433 | FDir *fdir; |
| 434 | − uchar buf[DIRMAX]; | |
| 434 | + uchar buf[DIRMAX], *b; | |
| 435 | 435 | u32int ts, n; |
| 436 | 436 | |
| 437 | 437 | dprint("_9pdirread\n"); |
| 438 | 438 | n = f->iounit; |
| 439 | − ts = _9pread(fd, f, buf, n); | |
| 440 | − if(ts <= 0) | |
| 439 | + b = buf; | |
| 440 | + while((ts = _9pread(fd, f, b, n)) > 0){ | |
| 441 | + b += ts; | |
| 442 | + if(b - buf > DIRMAX - n) | |
| 443 | + break; | |
| 444 | + } | |
| 445 | + if(ts < 0) | |
| 441 | 446 | return ts; |
| 442 | − ts = dirpackage(buf, ts, d); | |
| 447 | + ts = dirpackage(buf, b - buf, d); | |
| 443 | 448 | dprint("_9pdirread about to lookupdir with path %s\n", f->path); |
| 444 | 449 | if((fdir = lookupdir(f->path, PUT)) != NULL){ |
| 445 | 450 | fdir->dirs = *d; |
| @@ -330,7 +330,8 @@ fsreaddir(const char *path, void *data, fuse_fill_dir_t ffd, · 329 unmodified lines | ||
| 330 | 330 | |
| 331 | 331 | ffd(data, ".", NULL, 0); |
| 332 | 332 | ffd(data, "..", NULL, 0); |
| 333 | − n = _9pdirread(srvfd, (FFid*)ffi->fh, &d); | |
| 333 | + if((n = _9pdirread(srvfd, (FFid*)ffi->fh, &d)) < 0) | |
| 334 | + return -EIO; | |
| 334 | 335 | dprint("fsreaddir returned from _9pdirread ndirs is %d\n", n); |
| 335 | 336 | for(e = d; e < d + n; e++){ |
| 336 | 337 | s.st_ino = e->qid.path; |