|
|
7f4c2a |
From 732680245cf72caa23b3f66da0960920d5c7027e Mon Sep 17 00:00:00 2001
|
|
|
7f4c2a |
From: vmallika <vmallika@redhat.com>
|
|
|
7f4c2a |
Date: Sun, 12 Jul 2015 21:03:54 +0530
|
|
|
7f4c2a |
Subject: [PATCH 239/244] quota/marker: fix mem-leak in marker
|
|
|
7f4c2a |
|
|
|
7f4c2a |
This is a backport of http://review.gluster.org/#/c/11617/
|
|
|
7f4c2a |
|
|
|
7f4c2a |
Free local in error paths
|
|
|
7f4c2a |
|
|
|
7f4c2a |
> Change-Id: I76f69e7d746af8eedea34354ff5a6bf50234e50e
|
|
|
7f4c2a |
> BUG: 1207735
|
|
|
7f4c2a |
> Signed-off-by: vmallika <vmallika@redhat.com>
|
|
|
7f4c2a |
|
|
|
7f4c2a |
Change-Id: Ic2d3aefe2e090ecfad87747a90c7d95eff968d42
|
|
|
7f4c2a |
BUG: 1224177
|
|
|
7f4c2a |
Signed-off-by: vmallika <vmallika@redhat.com>
|
|
|
7f4c2a |
Reviewed-on: https://code.engineering.redhat.com/gerrit/52779
|
|
|
7f4c2a |
Reviewed-by: Raghavendra Gowdappa <rgowdapp@redhat.com>
|
|
|
7f4c2a |
Tested-by: Raghavendra Gowdappa <rgowdapp@redhat.com>
|
|
|
7f4c2a |
---
|
|
|
7f4c2a |
xlators/features/marker/src/marker.c | 81 +++++++++++++--------------------
|
|
|
7f4c2a |
xlators/features/marker/src/marker.h | 12 +++++
|
|
|
7f4c2a |
2 files changed, 44 insertions(+), 49 deletions(-)
|
|
|
7f4c2a |
|
|
|
7f4c2a |
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c
|
|
|
7f4c2a |
index db6943c..ba599da 100644
|
|
|
7f4c2a |
--- a/xlators/features/marker/src/marker.c
|
|
|
7f4c2a |
+++ b/xlators/features/marker/src/marker.c
|
|
|
7f4c2a |
@@ -343,10 +343,6 @@ marker_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
|
|
7f4c2a |
int32_t op_ret, int32_t op_errno, dict_t *dict,
|
|
|
7f4c2a |
dict_t *xdata)
|
|
|
7f4c2a |
{
|
|
|
7f4c2a |
- marker_local_t *local = NULL;
|
|
|
7f4c2a |
- local = frame->local;
|
|
|
7f4c2a |
-
|
|
|
7f4c2a |
-
|
|
|
7f4c2a |
if (cookie) {
|
|
|
7f4c2a |
gf_log (this->name, GF_LOG_DEBUG,
|
|
|
7f4c2a |
"Filtering the quota extended attributes");
|
|
|
7f4c2a |
@@ -372,9 +368,7 @@ marker_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
|
|
7f4c2a |
marker_filter_internal_xattrs (frame->this, dict);
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
- frame->local = NULL;
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict, xdata);
|
|
|
7f4c2a |
- marker_local_unref (local);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -422,9 +416,7 @@ marker_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
out:
|
|
|
7f4c2a |
- frame->local = NULL;
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (getxattr, frame, -1, ENOMEM, NULL, NULL);
|
|
|
7f4c2a |
- marker_local_unref (local);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (getxattr, frame, -1, ENOMEM, NULL, NULL);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -661,8 +653,9 @@ wind:
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (mkdir, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (mkdir, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
NULL, NULL, NULL, NULL);
|
|
|
7f4c2a |
+
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -735,7 +728,7 @@ wind:
|
|
|
7f4c2a |
fd, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (create, frame, -1, ENOMEM, NULL, NULL, NULL, NULL,
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (create, frame, -1, ENOMEM, NULL, NULL, NULL, NULL,
|
|
|
7f4c2a |
NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
@@ -811,7 +804,7 @@ wind:
|
|
|
7f4c2a |
flags, iobref, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (writev, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (writev, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -879,7 +872,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->rmdir, loc, flags, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (rmdir, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (rmdir, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -958,9 +951,7 @@ unlink_wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->unlink, loc, xflag, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- frame->local = NULL;
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (unlink, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
- marker_local_unref (local);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (unlink, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -1034,7 +1025,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->link, oldloc, newloc, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (link, frame, -1, ENOMEM, NULL, NULL, NULL, NULL,
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (link, frame, -1, ENOMEM, NULL, NULL, NULL, NULL,
|
|
|
7f4c2a |
NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
@@ -1616,8 +1607,9 @@ rename_wind:
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (rename, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (rename, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
NULL, NULL, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ marker_local_unref (oplocal);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -1686,7 +1678,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->truncate, loc, offset, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (truncate, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (truncate, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -1754,7 +1746,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->ftruncate, fd, offset, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (ftruncate, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (ftruncate, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -1828,8 +1820,9 @@ wind:
|
|
|
7f4c2a |
xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (symlink, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (symlink, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
NULL, NULL, NULL, NULL);
|
|
|
7f4c2a |
+
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -1904,8 +1897,9 @@ wind:
|
|
|
7f4c2a |
xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (mknod, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (mknod, frame, -1, ENOMEM, NULL,
|
|
|
7f4c2a |
NULL, NULL, NULL, NULL);
|
|
|
7f4c2a |
+
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -1973,7 +1967,7 @@ wind:
|
|
|
7f4c2a |
xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (fallocate, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (fallocate, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2041,7 +2035,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->discard, fd, offset, len, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (discard, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (discard, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2108,7 +2102,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->zerofill, fd, offset, len, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (zerofill, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (zerofill, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2229,16 +2223,11 @@ quota_xattr_cleaner_cbk (int ret, call_frame_t *frame, void *args)
|
|
|
7f4c2a |
dict_t *xdata = args;
|
|
|
7f4c2a |
int op_ret = -1;
|
|
|
7f4c2a |
int op_errno = 0;
|
|
|
7f4c2a |
- marker_local_t *local = NULL;
|
|
|
7f4c2a |
-
|
|
|
7f4c2a |
- local = frame->local;
|
|
|
7f4c2a |
- frame->local = NULL;
|
|
|
7f4c2a |
|
|
|
7f4c2a |
op_ret = (ret < 0)? -1: 0;
|
|
|
7f4c2a |
op_errno = -ret;
|
|
|
7f4c2a |
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (setxattr, frame, op_ret, op_errno, xdata);
|
|
|
7f4c2a |
- marker_local_unref (local);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (setxattr, frame, op_ret, op_errno, xdata);
|
|
|
7f4c2a |
return ret;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -2312,11 +2301,9 @@ marker_do_xattr_cleanup (call_frame_t *frame, xlator_t *this, dict_t *xdata,
|
|
|
7f4c2a |
|
|
|
7f4c2a |
ret = 0;
|
|
|
7f4c2a |
out:
|
|
|
7f4c2a |
- if (ret) {
|
|
|
7f4c2a |
- frame->local = NULL;
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (setxattr, frame, -1, ENOMEM, xdata);
|
|
|
7f4c2a |
- marker_local_unref (local);
|
|
|
7f4c2a |
- }
|
|
|
7f4c2a |
+ if (ret)
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (setxattr, frame, -1, ENOMEM, xdata);
|
|
|
7f4c2a |
+
|
|
|
7f4c2a |
return ret;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
@@ -2371,7 +2358,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->setxattr, loc, dict, flags, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (setxattr, frame, -1, op_errno, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (setxattr, frame, -1, op_errno, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2438,7 +2425,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->fsetxattr, fd, dict, flags, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (fsetxattr, frame, -1, ENOMEM, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (fsetxattr, frame, -1, ENOMEM, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2504,7 +2491,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD (this)->fops->fsetattr, fd, stbuf, valid, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (fsetattr, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (fsetattr, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2571,7 +2558,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD (this)->fops->setattr, loc, stbuf, valid, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (setattr, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (setattr, frame, -1, ENOMEM, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2636,7 +2623,7 @@ wind:
|
|
|
7f4c2a |
FIRST_CHILD(this)->fops->removexattr, loc, name, xdata);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (removexattr, frame, -1, ENOMEM, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (removexattr, frame, -1, ENOMEM, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2746,7 +2733,7 @@ wind:
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
err:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (lookup, frame, -1, ENOMEM, NULL, NULL, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (lookup, frame, -1, ENOMEM, NULL, NULL, NULL, NULL);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
if (xattr_req)
|
|
|
7f4c2a |
dict_unref (xattr_req);
|
|
|
7f4c2a |
@@ -2858,11 +2845,7 @@ marker_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
unwind:
|
|
|
7f4c2a |
- local = frame->local;
|
|
|
7f4c2a |
- frame->local = NULL;
|
|
|
7f4c2a |
-
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (readdirp, frame, op_ret, op_errno, entries, xdata);
|
|
|
7f4c2a |
- marker_local_unref (local);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (readdirp, frame, op_ret, op_errno, entries, xdata);
|
|
|
7f4c2a |
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
@@ -2906,7 +2889,7 @@ marker_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
|
|
|
7f4c2a |
dict_unref (dict);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
unwind:
|
|
|
7f4c2a |
- STACK_UNWIND_STRICT (readdirp, frame, -1, ENOMEM, NULL, NULL);
|
|
|
7f4c2a |
+ MARKER_STACK_UNWIND (readdirp, frame, -1, ENOMEM, NULL, NULL);
|
|
|
7f4c2a |
return 0;
|
|
|
7f4c2a |
}
|
|
|
7f4c2a |
|
|
|
7f4c2a |
diff --git a/xlators/features/marker/src/marker.h b/xlators/features/marker/src/marker.h
|
|
|
7f4c2a |
index aadd877..f198859 100644
|
|
|
7f4c2a |
--- a/xlators/features/marker/src/marker.h
|
|
|
7f4c2a |
+++ b/xlators/features/marker/src/marker.h
|
|
|
7f4c2a |
@@ -80,6 +80,18 @@ enum {
|
|
|
7f4c2a |
frame->cookie = NULL; \
|
|
|
7f4c2a |
} while (0)
|
|
|
7f4c2a |
|
|
|
7f4c2a |
+#define MARKER_STACK_UNWIND(fop, frame, params...) \
|
|
|
7f4c2a |
+ do { \
|
|
|
7f4c2a |
+ quota_local_t *_local = NULL; \
|
|
|
7f4c2a |
+ if (frame) { \
|
|
|
7f4c2a |
+ _local = frame->local; \
|
|
|
7f4c2a |
+ frame->local = NULL; \
|
|
|
7f4c2a |
+ } \
|
|
|
7f4c2a |
+ STACK_UNWIND_STRICT (fop, frame, params); \
|
|
|
7f4c2a |
+ if (_local) \
|
|
|
7f4c2a |
+ marker_local_unref (_local); \
|
|
|
7f4c2a |
+ } while (0)
|
|
|
7f4c2a |
+
|
|
|
7f4c2a |
struct marker_local{
|
|
|
7f4c2a |
uint32_t timebuf[2];
|
|
|
7f4c2a |
pid_t pid;
|
|
|
7f4c2a |
--
|
|
|
7f4c2a |
1.7.1
|
|
|
7f4c2a |
|