From 797efbc15b1993abdf459de22da5bf01e6040805 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 22 Sep 2014 17:48:22 +0200 Subject: [PATCH] Fix Ref self-assignment. --- kernel/include/sortix/kernel/refcount.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/kernel/include/sortix/kernel/refcount.h b/kernel/include/sortix/kernel/refcount.h index 61fb7060..97a5df4e 100644 --- a/kernel/include/sortix/kernel/refcount.h +++ b/kernel/include/sortix/kernel/refcount.h @@ -64,16 +64,30 @@ public: Ref& operator=(const Ref r) { - if ( obj ) { obj->Unref_Renamed(); obj = NULL; } - if ( (obj = r.Get()) ) obj->Refer_Renamed(); + if ( obj == r.Get() ) + return *this; + if ( obj ) + { + obj->Unref_Renamed(); + obj = NULL; + } + if ( (obj = r.Get()) ) + obj->Refer_Renamed(); return *this; } template Ref operator=(const Ref r) { - if ( obj ) { obj->Unref_Renamed(); obj = NULL; } - if ( (obj = r.Get()) ) obj->Refer_Renamed(); + if ( obj == r.Get() ) + return *this; + if ( obj ) + { + obj->Unref_Renamed(); + obj = NULL; + } + if ( (obj = r.Get()) ) + obj->Refer_Renamed(); return *this; }