diff options
Diffstat (limited to 'xlators/cluster/ec/src/ec-dir-read.c')
-rw-r--r-- | xlators/cluster/ec/src/ec-dir-read.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/xlators/cluster/ec/src/ec-dir-read.c b/xlators/cluster/ec/src/ec-dir-read.c index c705b80fe82..17e1a3d124e 100644 --- a/xlators/cluster/ec/src/ec-dir-read.c +++ b/xlators/cluster/ec/src/ec-dir-read.c @@ -304,8 +304,6 @@ void ec_adjust_readdir(ec_t * ec, int32_t idx, gf_dirent_t * entries) list_for_each_entry(entry, &entries->list, list) { - entry->d_off = ec_itransform(ec, idx, entry->d_off); - if (entry->d_stat.ia_type == IA_IFREG) { if ((entry->dict == NULL) || @@ -413,10 +411,20 @@ int32_t ec_manager_readdir(ec_fop_data_t * fop, int32_t state) if (fop->offset != 0) { - int32_t idx; + int32_t idx = -1; + ec_t *ec = fop->xl->private; + + idx = gf_deitransform(fop->xl, fop->offset); + + if ((idx < 0) || (idx >= ec->nodes)) { - fop->offset = ec_deitransform(fop->xl->private, &idx, - fop->offset); + gf_log(fop->xl->name, GF_LOG_ERROR, + "Invalid index %d in readdirp request", idx); + + fop->error = EIO; + + return EC_STATE_REPORT; + } fop->mask &= 1ULL << idx; } |