Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Nov 2012 09:46:27 +0100
From:      Stefan Farfeleder <stefanf@FreeBSD.org>
To:        Andriy Gapon <avg@FreeBSD.org>
Cc:        freebsd-acpi@FreeBSD.org
Subject:   Re: ACPI panic
Message-ID:  <20121129084627.GA1450@mole.fafoe.narf.at>
In-Reply-To: <50B34EEA.4000209@FreeBSD.org>
References:  <50ADFFB2.1000108@FreeBSD.org> <50AE057D.8060808@FreeBSD.org> <20121125140008.GA1497@mole.fafoe.narf.at> <50B244A1.1040800@FreeBSD.org> <20121126091101.GA1469@mole.fafoe.narf.at> <50B33693.2060000@FreeBSD.org> <20121126093704.GB1469@mole.fafoe.narf.at> <50B34484.1090807@FreeBSD.org> <20121126104737.GC1469@mole.fafoe.narf.at> <50B34EEA.4000209@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Nov 26, 2012 at 01:13:46PM +0200, Andriy Gapon wrote:
> 
> Also, I've just realized that the check is racy...
> Could you please move the whole check block (between and excluding
> AcpiUtAcquireMutex and AcpiUtReleaseMutex) down right below the following lines:
> 
>         Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
>         if (ACPI_FAILURE (Status))
>         {
>             return (Status);
>         }

Sorry for the delay. I'm now running the patch below. I still got the
cycle panic, this time with a 4-objects cycle. It looks like an object
gets released twice but I don't understand why the "freeing a free
object" check fails to trigger.

Stefan

Index: components/utilities/utcache.c
===================================================================
--- components/utilities/utcache.c	(revision 243234)
+++ components/utilities/utcache.c	(working copy)
@@ -244,6 +244,28 @@
             return (Status);
         }
 
+        char                    *Curr;
+        char                    *Next;
+        int                     Depth;
+        Depth = Cache->CurrentDepth;
+        Next = Cache->ListHead;
+        while (Next)
+        {
+            Curr = Next;
+            Next = *(ACPI_CAST_INDIRECT_PTR (char,
+                        &(((char *) Curr)[Cache->LinkOffset])));
+            if (*(const unsigned char *) Curr != 0xCA) {
+                panic("detected use after free %p\n", Curr);
+            }
+            if (Object == Curr) {
+                panic("freeing a free object %p", Object);
+            }
+            Depth--;
+            if (Depth < 0) {
+                panic("cycle in a cache list");
+            }
+        }
+
         /* Mark the object as cached */
 
         ACPI_MEMSET (Object, 0xCA, Cache->ObjectSize);
@@ -312,6 +334,10 @@
 
         Cache->CurrentDepth--;
 
+        if (*(const unsigned char *) Object != 0xCA) {
+            panic("detected use after free %p\n", Object);
+        }
+
         ACPI_MEM_TRACKING (Cache->Hits++);
         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
             "Object %p from %s cache\n", Object, Cache->ListName));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121129084627.GA1450>