diff options
| author | Anand V. Avati <avati@gluster.com> | 2009-03-26 17:29:52 +0530 | 
|---|---|---|
| committer | Anand V. Avati <avati@amp.gluster.com> | 2009-03-26 23:40:36 +0530 | 
| commit | 6c28cb81b2a326a416968932919ea9d19f3b56ab (patch) | |
| tree | 5372159ae39ac1d2cd4a88a7de3caf1217d2a7fd | |
| parent | 675e8b4a1f07668a6145c16283b68daa165a7a0c (diff) | |
fix duplicate setting of values in inode->ctx and fd->ctx
this patch avoids setting of duplicate key/value pairs in the context.
note that consumers have to explicitly check for previous existance of key
to avoid any kind of resource leak resulting from this overwrite.
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
| -rw-r--r-- | libglusterfs/src/fd.c | 18 | ||||
| -rw-r--r-- | libglusterfs/src/inode.c | 18 | 
2 files changed, 26 insertions, 10 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 44149246ba9..918b6c14dcc 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -548,6 +548,7 @@ fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)  {  	int index = 0;          int ret = 0; +        int set_idx = -1;  	if (!fd || !xlator)  		return -1; @@ -555,18 +556,25 @@ fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)          LOCK (&fd->lock);          {                  for (index = 0; index < xlator->ctx->xl_count; index++) { -                        if (!fd->_ctx[index].key ||  -                            (fd->_ctx[index].key == (uint64_t)(long)xlator)) +                        if (!fd->_ctx[index].key) { +                                if (set_idx == -1) +                                        set_idx = index; +                                /* dont break, to check if key already exists +                                   further on */ +                        } +                        if (fd->_ctx[index].key == (uint64_t)(long) xlator) { +                                set_idx = index;                                  break; +                        }                  } -                if (index == xlator->ctx->xl_count) { +                if (set_idx == -1) {                          ret = -1;                          goto unlock;                  } -                fd->_ctx[index].key   = (uint64_t)(long) xlator; -                fd->_ctx[index].value = value; +                fd->_ctx[set_idx].key   = (uint64_t)(long) xlator; +                fd->_ctx[set_idx].value = value;          }  unlock:          UNLOCK (&fd->lock); diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index c62d7ca9e7c..90a84f95561 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -1109,20 +1109,28 @@ __inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value)  {          int ret = 0;          int index = 0; +        int put_idx = -1;          for (index = 0; index < xlator->ctx->xl_count; index++) { -                if (!inode->_ctx[index].key ||  -                    (inode->_ctx[index].key == (uint64_t)(long)xlator)) +                if (!inode->_ctx[index].key) { +                        if (put_idx == -1) +                                put_idx = index; +                        /* dont break, to check if key already exists +                           further on */ +                } +                if (inode->_ctx[index].key == (uint64_t)(long) xlator) { +                        put_idx = index;                          break; +                }          } -        if (index == xlator->ctx->xl_count) { +        if (put_idx == -1) {                  ret = -1;                  goto out;;          } -        inode->_ctx[index].key   = (uint64_t)(long) xlator; -        inode->_ctx[index].value = value; +        inode->_ctx[put_idx].key   = (uint64_t)(long) xlator; +        inode->_ctx[put_idx].value = value;  out:          return ret;  }  | 
