diff options
author | Soumya Koduri <skoduri@redhat.com> | 2016-07-21 12:14:27 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2016-08-03 02:26:33 -0700 |
commit | d64347d286b256e631b34b77c82216c0f122da42 (patch) | |
tree | b0d2433ee26a1af90347a0bc569984a27618312f | |
parent | 7c90608bd89c2186774cdb9131a4f6297b7cbcc0 (diff) |
glfs/upcall: entries should be removed under mutex lock
During poll, upcall entries should be removed from the
upcall_list only under upcall_list_mutex lock. Otherwise
it could result in the list corruption if there are entries
being added during poll resulting in memory leak.
Also addressed a probable leak during any failures with upcall
entry addition.
This is backport of below master patch -
http://review.gluster.org/14972
>Change-Id: I468183f961eb6faed9a0a1bcb783705f711641fc
>BUG: 1358608
>Signed-off-by: Soumya Koduri <skoduri@redhat.com>
>Reviewed-on: http://review.gluster.org/14972
>Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
>Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
>(cherry picked from commit 89dee8b46e126bc1d7541da90fa60844aa83451e)
Change-Id: I8f83175c7b550d8674dda5030168d5b94ccdd04c
BUG: 1361665
Signed-off-by: Soumya Koduri <skoduri@redhat.com>
Reviewed-on: http://review.gluster.org/15048
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: jiffin tony Thottan <jthottan@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
-rw-r--r-- | api/src/glfs-fops.c | 4 | ||||
-rw-r--r-- | api/src/glfs-handleops.c | 2 |
2 files changed, 4 insertions, 2 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index cf809705c8a..a1858b17b8b 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -4339,8 +4339,10 @@ priv_glfs_process_upcall_event (struct glfs *fs, void *data) ret = 0; out: - if (ret && u_list) + if (ret && u_list) { + GF_FREE (u_list->upcall_data.data); GF_FREE(u_list); + } return; } diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c index 2b436f9bc4d..d09e81ddb1a 100644 --- a/api/src/glfs-handleops.c +++ b/api/src/glfs-handleops.c @@ -2037,6 +2037,7 @@ pub_glfs_h_poll_upcall (struct glfs *fs, struct callback_arg *up_arg) &fs->upcall_list, upcall_list) { found = 1; + list_del_init (&u_list->upcall_list); break; } } @@ -2073,7 +2074,6 @@ pub_glfs_h_poll_upcall (struct glfs *fs, struct callback_arg *up_arg) up_arg->reason = reason; - list_del_init (&u_list->upcall_list); GF_FREE (u_list->upcall_data.data); GF_FREE (u_list); } |