diff options
-rw-r--r-- | source4/lib/replace/repdir_getdents.c | 12 | ||||
-rw-r--r-- | source4/lib/replace/repdir_getdirentries.c | 12 |
2 files changed, 24 insertions, 0 deletions
diff --git a/source4/lib/replace/repdir_getdents.c b/source4/lib/replace/repdir_getdents.c index 07b9568dc1..6b115c4c4f 100644 --- a/source4/lib/replace/repdir_getdents.c +++ b/source4/lib/replace/repdir_getdents.c @@ -68,6 +68,7 @@ struct dir_buf { DIR *opendir(const char *dname) { struct dir_buf *d; + struct stat sb; d = malloc(sizeof(*d)); if (d == NULL) { errno = ENOMEM; @@ -78,6 +79,17 @@ DIR *opendir(const char *dname) free(d); return NULL; } + if (fstat(d->fd, &sb) < 0) { + close(d->fd); + free(d); + return NULL; + } + if (!S_ISDIR(sb.st_mode)) { + close(d->fd); + free(d); + errno = ENOTDIR; + return NULL; + } d->ofs = 0; d->seekpos = 0; d->nbytes = 0; diff --git a/source4/lib/replace/repdir_getdirentries.c b/source4/lib/replace/repdir_getdirentries.c index 9e4b63145c..a6026dfb5d 100644 --- a/source4/lib/replace/repdir_getdirentries.c +++ b/source4/lib/replace/repdir_getdirentries.c @@ -70,6 +70,7 @@ struct dir_buf { DIR *opendir(const char *dname) { struct dir_buf *d; + struct stat sb; d = malloc(sizeof(*d)); if (d == NULL) { errno = ENOMEM; @@ -80,6 +81,17 @@ DIR *opendir(const char *dname) free(d); return NULL; } + if (fstat(d->fd, &sb) < 0) { + close(d->fd); + free(d); + return NULL; + } + if (!S_ISDIR(sb.st_mode)) { + close(d->fd); + free(d); + errno = ENOTDIR; + return NULL; + } d->ofs = 0; d->seekpos = 0; d->nbytes = 0; |