From e1d9895ba6f7763ba4602094f6516a6ab4a054d4 Mon Sep 17 00:00:00 2001 From: Krutika Dhananjay Date: Mon, 1 Jun 2015 11:55:29 +0530 Subject: libglusterfs: Copy d_len and dict as well into dst dirent Also, added memory allocation failure checks in light of the comments received @ http://review.gluster.org/#/c/10809/2/libglusterfs/src/gf-dirent.c, and http://review.gluster.org/#/c/10809/1/xlators/features/shard/src/shard.c Change-Id: Ie4092218545c8f4f8a0e6cc1fec6ba37bbbf2620 BUG: 1226551 Signed-off-by: Krutika Dhananjay Reviewed-on: http://review.gluster.org/11026 Tested-by: Gluster Build System Tested-by: NetBSD Build System Reviewed-by: Pranith Kumar Karampuri --- libglusterfs/src/gf-dirent.c | 8 +++++++- libglusterfs/src/syncop.c | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'libglusterfs') diff --git a/libglusterfs/src/gf-dirent.c b/libglusterfs/src/gf-dirent.c index c602d08b278..3cbef6605db 100644 --- a/libglusterfs/src/gf-dirent.c +++ b/libglusterfs/src/gf-dirent.c @@ -177,7 +177,7 @@ gf_dirent_entry_free (gf_dirent_t *entry) if (entry->inode) inode_unref (entry->inode); - list_del (&entry->list); + list_del_init (&entry->list); GF_FREE (entry); } @@ -204,14 +204,20 @@ entry_copy (gf_dirent_t *source) gf_dirent_t *sink = NULL; sink = gf_dirent_for_name (source->d_name); + if (!sink) + return NULL; sink->d_off = source->d_off; sink->d_ino = source->d_ino; sink->d_type = source->d_type; sink->d_stat = source->d_stat; + sink->d_len = source->d_len; if (source->inode) sink->inode = inode_ref (source->inode); + + if (source->dict) + sink->dict = dict_ref (source->dict); return sink; } diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index a4e39702b70..efcf2fcfb52 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -1239,6 +1239,12 @@ syncop_readdirp_cbk (call_frame_t *frame, if (op_ret >= 0) { list_for_each_entry (entry, &entries->list, list) { tmp = entry_copy (entry); + if (!tmp) { + args->op_ret = -1; + args->op_errno = ENOMEM; + gf_dirent_free (&(args->entries)); + break; + } gf_log (this->name, GF_LOG_TRACE, "adding entry=%s, count=%d", tmp->d_name, count); @@ -1269,7 +1275,8 @@ syncop_readdirp (xlator_t *subvol, if (entries) list_splice_init (&args.entries.list, &entries->list); - /* TODO: need to free all the 'args.entries' in 'else' case */ + else + gf_dirent_free (&args.entries); if (xdata_out) *xdata_out = args.xdata; @@ -1308,6 +1315,12 @@ syncop_readdir_cbk (call_frame_t *frame, if (op_ret >= 0) { list_for_each_entry (entry, &entries->list, list) { tmp = entry_copy (entry); + if (!tmp) { + args->op_ret = -1; + args->op_errno = ENOMEM; + gf_dirent_free (&(args->entries)); + break; + } gf_log (this->name, GF_LOG_TRACE, "adding entry=%s, count=%d", tmp->d_name, count); @@ -1338,7 +1351,8 @@ syncop_readdir (xlator_t *subvol, if (entries) list_splice_init (&args.entries.list, &entries->list); - /* TODO: need to free all the 'args.entries' in 'else' case */ + else + gf_dirent_free (&args.entries); if (xdata_out) *xdata_out = args.xdata; -- cgit