|
|
Message-ID: <aad2942dedb6797db72ec0f0ae3319e6@smtp.hushmail.com>
Date: Wed, 17 Apr 2013 01:08:01 +0200
From: magnum <john.magnum@...hmail.com>
To: john-dev@...ts.openwall.com
Subject: Re: Segfaults probably caused by DEBUG code in memory.c
On 17 Apr, 2013, at 0:23 , Frank Dittrich <frank_dittrich@...mail.com> wrote:
> On 04/17/2013 12:14 AM, magnum wrote:
>> On 16 Apr, 2013, at 23:37 , Frank Dittrich <frank_dittrich@...mail.com> wrote:
>>> On 04/16/2013 09:56 PM, jfoug wrote:
>>>> In hindsight, in debug mode, you might have gotten the same results by doing
>>>> this:
>>>>
>>>> #if DEBUG
>>>> #undef MEM_ALLOC_SIZE
>>>> #define MEM_ALLOC_SIZE 0
>>>> #endif
>>>
>>> I really like this solution, because it leaves mem_alloc_tiny (which is
>>> complex enough as it is) unchanged.
>>>
>>> May be even better is to do this in memory.h directly:
>>>
>>> #if DEBUG
>>> /* turn mem_alloc_tiny() into a normal alloc,
>>> * to better track problems.
>>> */
>>> #define MEM_ALLOC_SIZE 0
>>> #else
>>> #define MEM_ALLOC_SIZE 0x10000
>>
>> I bought your arguments and did this, even commited it without testing (silly me). But it segfaults for me in unstable, and hangs in bleeding, both in dynamic_1.
>>
>> I reverted it. You can try for yourself, unstable is 3b53da3 and bleeding is 83a9e10.
>
> My fault:
>
> dynamic_fmt.c:1800: pSaltDataBuf = pNextSaltDataBuf =
> mem_alloc_tiny(MEM_ALLOC_SIZE*6, MEM_ALIGN_NON
> dynamic_fmt.c:1801: nSaltDataBuf = MEM_ALLOC_SIZE*6;
>
> I should have checked the usage of MEM_ALLOC_SIZE before suggesting the
> change.
Aha... I thought it was some worse issue within mem_alloc_tiny and the remainder of last alloc. In bleeding (they do differ) it really is. Here's the bleeding version (actually the bleeding core version):
31 void *mem_alloc_tiny(size_t size, size_t align)
32 {
33 static char *buffer = NULL;
34 static size_t bufree = 0;
35 size_t mask;
36 char *p;
37
38 #if ARCH_ALLOWS_UNALIGNED
39 if (mem_saving_level > 2)
40 align = MEM_ALIGN_NONE;
41 #endif
42
43 mask = align - 1;
44
45 do {
46 if (buffer) {
47 size_t need =
48 size + mask - (((size_t)buffer + mask) & mask);
49 if (bufree >= need) {
50 p = buffer;
51 p += mask;
52 p -= (size_t)p & mask;
53 bufree -= need;
54 buffer = p + size;
55 return p;
56 }
57 }
58
59 if (size + mask > MEM_ALLOC_SIZE ||
60 bufree > MEM_ALLOC_MAX_WASTE)
61 break;
62
63 buffer = mem_alloc(MEM_ALLOC_SIZE);
64 bufree = MEM_ALLOC_SIZE;
65 } while (1);
66
67 p = mem_alloc(size + mask);
68 p += mask;
69 p -= (size_t)p & mask;
70 return p;
71 }
Now, if MEM_ALLOC_SIZE is 0 we will allocate 0 bytes in line 63, and never get out of that loop.
In unstable this does not happen but there is another problem (even if not doing the #ifdef in memory.h): If we allocate something with a large alignment like 64 but malloc() happens to return an already aligned buffer, we'll end up having bufree==64. At next call and providing we ask for <= 64 bytes we will get memory from that. This contradicts the point with my -DDEBUG behaviour.
I suggest we keep the current -DDEBUG code as-is for now.
magnum
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.