[Openswan dev] [Commits] [OPENSWAN.git] Changes to ref refs/heads/master

David McCullough david_mccullough at mcafee.com
Tue May 4 20:56:53 EDT 2010


Jivin Paul Wouters lays it down ...
...
> >> Is that not sufficient to disable NETKEY?
> >>
> >>>>> This was running on the head of git master completely unmodified.
> >>>>>
> >>>>> Obviously somewhere else in pluto is using kern_interface to make
> >>>>> decisions and getting it wrong when kern_interface==AUTO_PICK.  I
> >>>>> didn't go looking for the offender.  I actually found this use 'git
> >>>>> bisect',  decided that there was no way that
> >>>>> fdfb59b413eec432969014762ceb847ef7e5e9a4 could be the cause and then
> >>>>> went through it all by hand again,  and still didn't believe it ;-)
> >>>>
> >>>> At least one case (I had problems with) is the function delete_ipsec_sa()
> >>>> in kernel.c.
> >>>
> >>> What problem are you seeing there ?
> >>
> >> This is just one case that goes wrong if kern_interface==AUTO_PICK.
> >> The SA will not be deleted, you just get the log
> >> "Unknown kernel stack in delete_ipsec_sa".
> >>
> >> For now it works with Pauls (and your) fixes.
> >
> > Oh,  good,  I thought something was still broken :-)
> 
> There is. The new code does nothing. So I do not believe whatever crasher
> is gone. It just cannot be. I bet gcc even optimised those lines out :P

I will bet you are wrong ;-) ;-)

> Either my patch worked and testing it was done wrong. Or something fishy
> is still broken.

I couldn't believe it either,  and it took a while to see the code problem.
I also did far more testing and reviewing than the problem deserved.

Follow through the "init_kernel" function with kern_interface = AUTO_PICK,
both NETKEY_SUPPORT and KLIPS defined in the build, but no netkey support in
the runtime kernel.  Cut down,  it looks like this:

	...
	if(kern_interface == AUTO_PICK) {
		...
		// ok we go in here
		...
    #if defined(NETKEY_SUPPORT)
        if (stat("/proc/net/pfkey", &buf) == 0) // this fails, no kernel support
        {
            kern_interface = USE_NETKEY;
        }
    # elif defined(KLIPS)
		// this code will not be compiled in due to #elif
        if (stat("/proc/net/pf_key", &buf) == 0)
        {
            kern_interface = USE_KLIPS;
        }
    #endif
	}

Note the "# elif defined(KLIPS)",  this means that the code to check for
klips is not compilied in for this case, so we drop out with
kern_interface = AUTO_PICK.

I figured since none of the other cases were dealt with,  I would like to
ensure that kern_interface was always guaranteed to be set to something on
exit (ie., BSD_KAME, KLIPS_MAST, ...)

I am more than happy to rejig the code to be more obvious.  Have a look at
the attached patch (untested) and see how that grabs you.  You probably need
to apply it to see how the resulting init_kernel looks,  I think it's
better, but I'm not attached to it.  A table of interfaces with a "check"
method may be more appropriate for readability.

Cheers,
Davidm

-- 
David McCullough,      david_mccullough at mcafee.com,  Ph:+61 734352815
McAfee - SnapGear      http://www.mcafee.com         http://www.uCdot.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: init_kernel.diff
Type: text/x-diff
Size: 3862 bytes
Desc: not available
Url : http://lists.openswan.org/pipermail/dev/attachments/20100505/fcf378c6/attachment.bin 


More information about the Dev mailing list