Blob Blame History Raw
From cb0e784d90b06998ad0a00b17b610a0c922f3380 Mon Sep 17 00:00:00 2001
From: Xavier Hernandez <xhernandez@datalab.es>
Date: Thu, 9 Mar 2017 09:29:49 +0100
Subject: [PATCH 619/620] features/locks: Fix leak of posix_lock_t's client_uid

 >Change-Id: I3bc14998ed6a8841f77a004c24a456331048a521
 >BUG: 1428510
 >Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
 >Reviewed-on: https://review.gluster.org/16838
 >Smoke: Gluster Build System <jenkins@build.gluster.org>
 >NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
 >CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
 >Reviewed-by: Amar Tumballi <amarts@gmail.com>
 >Reviewed-by: Jeff Darcy <jdarcy@redhat.com>

BUG: 1411338
Change-Id: Id3bbd7997e4ebee0b7cf2e61483343af7cd75018
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/119039
Tested-by: RHGS Build Bot <nigelb@redhat.com>
---
 xlators/features/locks/src/common.c    | 92 ++++++++++++++++------------------
 xlators/features/locks/src/posix.c     |  6 +--
 xlators/features/locks/src/reservelk.c | 18 ++-----
 3 files changed, 47 insertions(+), 69 deletions(-)

diff --git a/xlators/features/locks/src/common.c b/xlators/features/locks/src/common.c
index d56a7ac..68904f6 100644
--- a/xlators/features/locks/src/common.c
+++ b/xlators/features/locks/src/common.c
@@ -433,7 +433,7 @@ pl_inode_get (xlator_t *this, inode_t *inode)
                 INIT_LIST_HEAD (&pl_inode->blocked_reservelks);
                 INIT_LIST_HEAD (&pl_inode->blocked_calls);
                 INIT_LIST_HEAD (&pl_inode->metalk_list);
-		INIT_LIST_HEAD (&pl_inode->queued_locks);
+                INIT_LIST_HEAD (&pl_inode->queued_locks);
                 gf_uuid_copy (pl_inode->gfid, inode->gfid);
 
                 __inode_ctx_put (inode, this, (uint64_t)(long)(pl_inode));
@@ -505,9 +505,27 @@ __delete_lock (posix_lock_t *lock)
 void
 __destroy_lock (posix_lock_t *lock)
 {
+        GF_FREE (lock->client_uid);
         GF_FREE (lock);
 }
 
+static posix_lock_t *
+__copy_lock(posix_lock_t *src)
+{
+        posix_lock_t *dst;
+
+        dst = GF_CALLOC(1, sizeof(posix_lock_t), gf_locks_mt_posix_lock_t);
+        if (dst != NULL) {
+                memcpy (dst, src, sizeof(posix_lock_t));
+                dst->client_uid = gf_strdup(src->client_uid);
+                if (dst->client_uid == NULL) {
+                        GF_FREE(dst);
+                        dst = NULL;
+                }
+        }
+
+        return dst;
+}
 
 /* Convert a posix_lock to a struct gf_flock */
 void
@@ -613,11 +631,11 @@ subtract_locks (posix_lock_t *big, posix_lock_t *small)
         if ((big->fl_start == small->fl_start) &&
             (big->fl_end   == small->fl_end)) {
                 /* both edges coincide with big */
-                v.locks[0] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[0])
+                v.locks[0] = __copy_lock(big);
+                if (!v.locks[0]) {
                         goto out;
-                memcpy (v.locks[0], big, sizeof (posix_lock_t));
+                }
+
                 v.locks[0]->fl_type = small->fl_type;
                 goto done;
         }
@@ -625,27 +643,15 @@ subtract_locks (posix_lock_t *big, posix_lock_t *small)
         if ((small->fl_start > big->fl_start) &&
             (small->fl_end   < big->fl_end)) {
                 /* both edges lie inside big */
-                v.locks[0] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[0])
-                        goto out;
-
-                v.locks[1] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[1])
-                        goto out;
-
-                v.locks[2] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[1])
+                v.locks[0] = __copy_lock(big);
+                v.locks[1] = __copy_lock(small);
+                v.locks[2] = __copy_lock(big);
+                if ((v.locks[0] == NULL) || (v.locks[1] == NULL) ||
+                    (v.locks[2] == NULL)) {
                         goto out;
+                }
 
-                memcpy (v.locks[0], big, sizeof (posix_lock_t));
                 v.locks[0]->fl_end = small->fl_start - 1;
-
-                memcpy (v.locks[1], small, sizeof (posix_lock_t));
-
-                memcpy (v.locks[2], big, sizeof (posix_lock_t));
                 v.locks[2]->fl_start = small->fl_end + 1;
                 goto done;
 
@@ -653,38 +659,24 @@ subtract_locks (posix_lock_t *big, posix_lock_t *small)
 
         /* one edge coincides with big */
         if (small->fl_start == big->fl_start) {
-                v.locks[0] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[0])
-                        goto out;
-
-                v.locks[1] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[1])
+                v.locks[0] = __copy_lock(big);
+                v.locks[1] = __copy_lock(small);
+                if ((v.locks[0] == NULL) || (v.locks[1] == NULL)) {
                         goto out;
+                }
 
-                memcpy (v.locks[0], big, sizeof (posix_lock_t));
                 v.locks[0]->fl_start = small->fl_end + 1;
-
-                memcpy (v.locks[1], small, sizeof (posix_lock_t));
                 goto done;
         }
 
         if (small->fl_end  == big->fl_end) {
-                v.locks[0] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[0])
-                        goto out;
-
-                v.locks[1] = GF_CALLOC (1, sizeof (posix_lock_t),
-                                        gf_locks_mt_posix_lock_t);
-                if (!v.locks[1])
+                v.locks[0] = __copy_lock(big);
+                v.locks[1] = __copy_lock(small);
+                if ((v.locks[0] == NULL) || (v.locks[1] == NULL)) {
                         goto out;
+                }
 
-                memcpy (v.locks[0], big, sizeof (posix_lock_t));
                 v.locks[0]->fl_end = small->fl_start - 1;
-
-                memcpy (v.locks[1], small, sizeof (posix_lock_t));
                 goto done;
         }
 
@@ -693,15 +685,15 @@ subtract_locks (posix_lock_t *big, posix_lock_t *small)
 
 out:
         if (v.locks[0]) {
-                GF_FREE (v.locks[0]);
+                __destroy_lock(v.locks[0]);
                 v.locks[0] = NULL;
         }
         if (v.locks[1]) {
-                GF_FREE (v.locks[1]);
+                __destroy_lock(v.locks[1]);
                 v.locks[1] = NULL;
         }
         if (v.locks[2]) {
-                GF_FREE (v.locks[2]);
+                __destroy_lock(v.locks[2]);
                 v.locks[2] = NULL;
         }
 
@@ -967,7 +959,7 @@ grant_blocked_locks (xlator_t *this, pl_inode_t *pl_inode)
                 STACK_UNWIND_STRICT (lk, lock->frame, 0, 0,
                                      &lock->user_flock, NULL);
 
-                GF_FREE (lock);
+                __destroy_lock(lock);
         }
 
         return;
@@ -1013,7 +1005,7 @@ pl_send_prelock_unlock (xlator_t *this, pl_inode_t *pl_inode,
                 STACK_UNWIND_STRICT (lk, lock->frame, 0, 0,
                                      &lock->user_flock, NULL);
 
-                GF_FREE (lock);
+                __destroy_lock(lock);
         }
 
 out:
diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c
index 9ad90e9..c9b3f82 100644
--- a/xlators/features/locks/src/posix.c
+++ b/xlators/features/locks/src/posix.c
@@ -3077,8 +3077,7 @@ out:
                 STACK_UNWIND_STRICT (lk, posix_lock->frame, -1, EREMOTE,
                                      &posix_lock->user_flock, NULL);
 
-                GF_FREE (posix_lock->client_uid);
-                GF_FREE (posix_lock);
+                __destroy_lock(posix_lock);
         }
 
         return ret;
@@ -3572,8 +3571,7 @@ unlock:
                 STACK_UNWIND_STRICT (lk, posix_lock->frame, -1, EREMOTE,
                                      &posix_lock->user_flock, NULL);
 
-                GF_FREE (posix_lock->client_uid);
-                GF_FREE (posix_lock);
+                __destroy_lock(posix_lock);
         }
         return 0;
 }
diff --git a/xlators/features/locks/src/reservelk.c b/xlators/features/locks/src/reservelk.c
index 8eb08d0..13b23f9 100644
--- a/xlators/features/locks/src/reservelk.c
+++ b/xlators/features/locks/src/reservelk.c
@@ -18,18 +18,6 @@
 #include "locks.h"
 #include "common.h"
 
-void
-__delete_reserve_lock (posix_lock_t *lock)
-{
-        list_del (&lock->list);
-}
-
-void
-__destroy_reserve_lock (posix_lock_t *lock)
-{
-        GF_FREE (lock);
-}
-
 /* Return true if the two reservelks have exactly same lock boundaries */
 int
 reservelks_equal (posix_lock_t *l1, posix_lock_t *l2)
@@ -110,7 +98,7 @@ __reservelk_conflict (xlator_t *this, pl_inode_t *pl_inode,
                         list_del_init (&conf->list);
                         gf_log (this->name, GF_LOG_TRACE,
                                 "Removing the matching reservelk for setlk to progress");
-                        GF_FREE (conf);
+                        __destroy_lock(conf);
                         ret = 0;
                 } else {
                         gf_log (this->name, GF_LOG_TRACE,
@@ -217,7 +205,7 @@ __reserve_unlock_lock (xlator_t *this, posix_lock_t *lock, pl_inode_t *pl_inode)
                         " Matching lock not found for unlock");
                 goto out;
         }
-        __delete_reserve_lock (conf);
+        __delete_lock(conf);
         gf_log (this->name, GF_LOG_DEBUG,
                 " Matching lock found for unlock");
 
@@ -392,7 +380,7 @@ pl_reserve_unlock (xlator_t *this, pl_inode_t *pl_inode, posix_lock_t *lock)
 
                 gf_log (this->name, GF_LOG_TRACE,
                         "Reservelk Unlock successful");
-                __destroy_reserve_lock (retlock);
+                __destroy_lock(retlock);
                 ret = 0;
         }
 out:
-- 
1.8.3.1