Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06dfa963 authored by Elena Reshetova's avatar Elena Reshetova Committed by Ilya Dryomov
Browse files

libceph: convert ceph_snap_context.nref from atomic_t to refcount_t



refcount_t type and corresponding API should be
used instead of atomic_t when the variable is used as
a reference counter. This allows to avoid accidental
refcounter overflows that might lead to use-after-free
situations.

Signed-off-by: default avatarElena Reshetova <elena.reshetova@intel.com>
Signed-off-by: default avatarHans Liljestrand <ishkamiel@gmail.com>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarDavid Windsor <dwindsor@gmail.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 805692d0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/wait.h>
#include <linux/writeback.h>
#include <linux/slab.h>
#include <linux/refcount.h>

#include <linux/ceph/types.h>
#include <linux/ceph/messenger.h>
@@ -161,7 +162,7 @@ struct ceph_client {
 * dirtied.
 */
struct ceph_snap_context {
	atomic_t nref;
	refcount_t nref;
	u64 seq;
	u32 num_snaps;
	u64 snaps[];
+3 −3
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ struct ceph_snap_context *ceph_create_snap_context(u32 snap_count,
	if (!snapc)
		return NULL;

	atomic_set(&snapc->nref, 1);
	refcount_set(&snapc->nref, 1);
	snapc->num_snaps = snap_count;

	return snapc;
@@ -59,7 +59,7 @@ EXPORT_SYMBOL(ceph_create_snap_context);
struct ceph_snap_context *ceph_get_snap_context(struct ceph_snap_context *sc)
{
	if (sc)
		atomic_inc(&sc->nref);
		refcount_inc(&sc->nref);
	return sc;
}
EXPORT_SYMBOL(ceph_get_snap_context);
@@ -68,7 +68,7 @@ void ceph_put_snap_context(struct ceph_snap_context *sc)
{
	if (!sc)
		return;
	if (atomic_dec_and_test(&sc->nref)) {
	if (refcount_dec_and_test(&sc->nref)) {
		/*printk(" deleting snap_context %p\n", sc);*/
		kfree(sc);
	}