[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#4111) upgrading from 2.2.19 -> 2.3.11: crash loading cn



OK, fixed in HEAD, see slapd/config.c rev 1.423

Howard Chu wrote:
> Forest Hill wrote:
>> At this point, ct[i] looks like this:
>>
>> (gdb) p ct[i]
>> $7 = {
>>   name = 0x17ed80 "loglevel",
>>   what = 0x17e680 "level",
>>   min_args = 2,
>>   max_args = 0,
>>   length = 0,
>>   arg_type = 2147483648,
>>   arg_item = 0x7060,
>>   attribute = 0x17ed8c "( OLcfgGlAt:28 NAME 'olcLogLevel' SYNTAX 
>> OMsDirectoryString )",
>>   ad = 0x2f8f1a0,
>>   notify = 0x0
>> }
>>
>>
>> At 4:08 PM -0700 10/27/05, Howard Chu wrote:
>>> c->rvalue_vals should not be NULL of course. What is ct[i] ? 
>>> config_get_vals zeroes out c->rvalue_* and then retrieves the 
>>> values. attr_merge should only be called if config_get_vals 
>>> succeeded. That's in the logic of config_build_attrs in bconfig.c.
>>>
>>> Forest Hill wrote:
>>>> Sorry for the delay. I had to deal with some other stuff for a bit. 
>>>> So, I turned off compiler optimizations this time to get a clearer 
>>>> view, and here's the immediate problem.  On line 78 of 
>>>> servers/slapd/values.c:
>>>>
>>>>         for ( ; !BER_BVISNULL( addvals ); v2++, addvals++ ) {
>>>> BER_BVISNULL is defined as
>>>>
>>>>         #define BER_BVISNULL(bv)        ((bv)->bv_val == NULL)
>>>>
>>>> And in the code in question, addvals is in fact NULL, so we're 
>>>> deref'ing NULL.
>>>>
>>>> Following this up the stack, in attr_merge_normalize(), on line 
>>>> 261, attr_merge() is being called with vals = NULL and nvals == NULL.
>>>>
>>>> Up in frame 3 in config_build_attrs() we do:
>>>>
>>>>         attr_merge_normalize(e, ct[i].ad,
>>>>                 c->rvalue_vals, NULL);
>>>>
>>>> in this case c->rvalue_vals is NULL, which is what's getting this 
>>>> all started, I guess.
>>>>
>>>> I guess the simple hack fix would be to be to change BER_BVISNULL 
>>>> to be
>>>>
>>>> #define BER_BVISNULL(bv)        ( (bv) == NULL || (bv)->bv_val == 
>>>> NULL)
>>>>
>>>> to avoid the NULL deref.  However this macro had the same 
>>>> definition in 2.2.19, so I'm guessing that this is more a question 
>>>> of improper us of said macro, rather than needing to change the 
>>>> macro itself.
>>>>
>>>> Looking at frame 5 in config_back_db_open(), the ConfigArgs (named 
>>>> just "c") that eventually gets passed in there is never fully 
>>>> initialized (it's created on the stack). Specifically, the 
>>>> rvalue_vals field is never initialized. When I'm running on a fully 
>>>> un-optimized build it does end up being NULL, but I see no reason 
>>>> that this would necessarily be the case when it's fully optimized.
>>>>
>>>> So, one possible peripheral problem could be solved by initializing 
>>>> c to zeros on the stack.
>>>>
>>>> However, that doesn't answer the question I have, which is, how is 
>>>> c.ravalue_vals ever going to get set to anything before it's passed 
>>>> into config_build_attrs and eventually has c.ravalue_vals dereffed 
>>>> when it's NULL?
>>>>
>>>>
>>>> At 6:42 PM -0700 10/25/05, Forest Hill wrote:
>>>>> I'm going to stick some diagnostic code in there and see if I can 
>>>>> figure out where it's getting munged.
>>>>>
>>>>> At 6:34 PM -0700 10/25/05, Forest Hill wrote:
>>>>>> Will get you the full printout in a second when my machine 
>>>>>> unhangs itself *sigh*
>>>>>>
>>>>>> But it looks like i in frame 3 is way messed up. it's got a value 
>>>>>> of 12678480. So, I'm guessing that something else is writing over 
>>>>>> that value somewhere...
>>>>>>
>>>>>> At 6:10 PM -0700 10/25/05, Howard Chu wrote:
>>>>>>> Forest Hill wrote:
>>>>>>>> Yeah, absolutely. any vars in particular that you'd lke?
>>>>>>>
>>>>>>> In frame 3, the call to attr_merge_normalize, print i, ct[i], 
>>>>>>> and *c. That should be a good start. Then in frame 1 print a, 
>>>>>>> *a, vals.
>>>>>>>>
>>>>>>>> At 5:59 PM -0700 10/25/05, Howard Chu wrote:
>>>>>>>>> Well, I see where, but I don't see why. Any chance you can run 
>>>>>>>>> this under a debugger and print some of the local variables 
>>>>>>>>> near the crash?
>>>>>>>>>
>>>>>>>>> forest@apple.com wrote:
>>>>>>>>>> Whoops. Yeah. Here's one from a build with symbols in it:
>>>>>>>>>>
>>>>>>>>>> Date/Time:      2005-10-25 17:13:01.109 -0700
>>>>>>>>>> OS Version:     10.4.3 (Build 8F46)
>>>>>>>>>> Report Version: 3
>>>>>>>>>>
>>>>>>>>>> Command: slapd
>>>>>>>>>> Path:    ./slapd
>>>>>>>>>> Parent:  sh [4799]
>>>>>>>>>>
>>>>>>>>>> Version: ??? (???)
>>>>>>>>>>
>>>>>>>>>> PID:    9690
>>>>>>>>>> Thread: 0
>>>>>>>>>>
>>>>>>>>>> Exception:  EXC_BAD_ACCESS (0x0001)
>>>>>>>>>> Codes:      KERN_PROTECTION_FAILURE (0x0002) at 0x00000004
>>>>>>>>>>
>>>>>>>>>> Thread 0 Crashed:
>>>>>>>>>> 0   slapd    0x0002bc70 value_add + 276 (value.c:78)
>>>>>>>>>> 1   slapd    0x0001bdcc attr_merge + 192 (attr.c:216)
>>>>>>>>>> 2   slapd    0x0001bf28 attr_merge_normalize + 276 (attr.c:261)
>>>>>>>>>> 3   slapd    0x0000abb4 config_build_attrs + 184 
>>>>>>>>>> (bconfig.c:3871)
>>>>>>>>>> 4   slapd    0x0000ade0 config_build_entry + 484 
>>>>>>>>>> (bconfig.c:3940)
>>>>>>>>>> 5   slapd    0x0000b1e8 config_back_db_open + 272 
>>>>>>>>>> (bconfig.c:4086)
>>>>>>>>>> 6   slapd    0x0001e504 backend_startup_one + 276 
>>>>>>>>>> (backend.c:213)
>>>>>>>>>> 7   slapd    0x0001e8cc backend_startup + 828 (backend.c:303)
>>>>>>>>>> 8   slapd    0x00003ea0 main + 3184 (main.c:727)
>>>>>>>>>> 9   slapd    0x00002944 _start + 348 (crt.c:272)
>>>>>>>>>> 10  slapd    0x000027e4 start + 60


-- 
  -- Howard Chu
  Chief Architect, Symas Corp.  http://www.symas.com
  Director, Highland Sun        http://highlandsun.com/hyc
  OpenLDAP Core Team            http://www.openldap.org/project/