Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Nov 2012 23:43:51 +0200
From:      Andriy Gapon <avg@FreeBSD.org>
To:        Stefan Farfeleder <stefanf@FreeBSD.org>
Cc:        freebsd-acpi@FreeBSD.org
Subject:   Re: ACPI panic
Message-ID:  <50B7D717.4030402@FreeBSD.org>
In-Reply-To: <20121129084627.GA1450@mole.fafoe.narf.at>
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> <20121129084627.GA1450@mole.fafoe.narf.at>

next in thread | previous in thread | raw e-mail | index | archive | help
on 29/11/2012 10:46 Stefan Farfeleder said the following:
> 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.

Hmmm...
Another bug-catching patch before I start questioning my ability to understand
the code.

index 59ecf21..1687c75b 100644
--- a/sys/contrib/dev/acpica/components/utilities/utcache.c
+++ b/sys/contrib/dev/acpica/components/utilities/utcache.c
@@ -238,6 +238,8 @@ AcpiOsReleaseObject (

     else
     {
+        if (AcpiGbl_MutexInfo[ACPI_MTX_CACHES].ThreadId == AcpiOsGetThreadId ())
+            panic("ACPI_MTX_CACHES acquired recursively");
         Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
         if (ACPI_FAILURE (Status))
         {
@@ -311,6 +313,8 @@ AcpiOsAcquireObject (
         return (NULL);
     }

+    if (AcpiGbl_MutexInfo[ACPI_MTX_CACHES].ThreadId == AcpiOsGetThreadId ())
+        panic("ACPI_MTX_CACHES acquired recursively");
     Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
     if (ACPI_FAILURE (Status))
     {

> 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));
> 

Just in case: this is exactly what I had in mind.

-- 
Andriy Gapon



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