Interesting issue with NDR_NOALIGN and nbt encoding.
Andrew Bartlett
abartlet at samba.org
Wed May 23 23:52:25 MDT 2012
On Wed, 2012-05-23 at 22:32 -0700, Jeremy Allison wrote:
> On Thu, May 24, 2012 at 03:23:36PM +1000, Andrew Bartlett wrote:
> >
> > That commit was in 2008, when we first got the WSPP docs, and I started
> > to properly handle these structures. I may not have filed a
> > release-critical bug to move the comment, but I assure you, the rest of
> > this code is very old indeed.
> >
> > What is much more relevant is the work I did (including testing) on
> > WinXP failing to join 3.6 RC:
> > https://bugzilla.samba.org/show_bug.cgi?id=8326
> >
> > Also for background see the change Volker made in commit
> > 2642f385887fbd3aecd4286a4d6223a21d981714
> > Author: Volker Lendecke <vl at samba.org>
> > Date: Thu Nov 17 22:36:22 2011 +0100
> >
> > s3: Fix bug 8371
> >
> > ndr_set_flag or's in the given flag (ALIGN4). At this point,
> > ndr->flags
> > contains NOALIGN, which will persist. In ndr_push_DATA_BLOB NOALIGN
> > overrides
> > everything else, so that the ALIGN4 is not respected.
> >
> > Autobuild-User: Volker Lendecke <vlendec at samba.org>
> > Autobuild-Date: Fri Nov 18 09:33:37 CET 2011 on sn-devel-104
> >
> > Metze:
> > The patch from metze on the bug
> > https://bugzilla.samba.org/show_bug.cgi?id=8371
> > https://attachments.samba.org/attachment.cgi?id=7118 does not seem to
> > have made it into master, but also seems relevant.
>
> No worries - I wasn't blaming you, just trying
> to understand the history of the code here. It's
> really interesting stuff and you seemed to be the
> last one touching it - and you know how that looks :-).
I do appreciate you pinging me about this, as with my work in 2008 and
the WinXP domain join bug I found just before the 3.6 release, I have
had a good deal to do with this code.
> > I doubt it will allow us not to hand-generate to code you originally
> > mentioned. Certainly for the response 'netlogon'
> > packets, the issue is that the only way to parse them is to first read
> > the last bytes, and then work forward.
>
> Can you explain more there ? Why is this the case ?
In netlogon_samlogon_response the union is switched on the value 8 bytes
in from the end of the packet! In nbt_netlogon_response it is similar,
the last 4 bytes.
> > > So attached is a patch to do just that. I'm testing
> > > it currently in master, but I'd really like to get
> > > feedback if I've missed something as to why it is
> > > allowed to set any of LIBNDR_FLAG_ALIGN2|LIBNDR_FLAG_ALIGN4|LIBNDR_FLAG_ALIGN8
> > > concurrently with LIBNDR_FLAG_NOALIGN.
> >
> > What is the point of LIBNDR_FLAG_NOALIGN then if all the alignment flags
> > override it?
>
> Ah - they're *SUPPOSED* to override it - that's the point.
> But they do so temporarily.
>
> Whenever you set a [flag(NDR_ALIGNXXX)] on a field
> you're saying that field (and everything it contains)
> need to be aligned on that boundary. But it's only
> for that field.
>
> So the code generated looks like :
>
> uint32_t _flags_save_xxx = ndr->flags;
> ndr_set_flags(&ndr->flags, LIBNDR_FLAG_ALIGNY);
> NDR_CHECK(ndr_push_XXX(ndr, NDR_SCALARS, r->xxx));
> ndr->flags = _flags_save_xxx;
>
> Note we save off the containing ndr->flags and restore
> after dealing with the sub-field.
>
> So I think the correct fix here is to treat NDR_NOALIGN
> in *exactly* the same way as the other NDR_ALIGNX types,
> and when any of them is set it overrides any of the others
> previously set.
I guess that seems reasonable. It does seem to prevent noalign from
overriding those however. Effectively it means 'no default alignment',
rather than 'no alignment'. We use it in a lot of places - fixing this
for NBT could expose an assumption somewhere else.
> I think the small patch I just posted (and am attaching
> again to this email) does just that.
>
> > I'm not totally sure here either, except to say that we need more
> > known-correct blobs and tests for them, and that a good number of us
> > have been stumbling though different parts of this puzzle over the past
> > year, and at least we should connect the dots. It may be that some of
> > the top level NOALIGN flags are simply wrong.
>
> More testing gratefully received :-). I'm going to see
> what feedback my change gets from the testers of that
> 3.6.x bug.
Have we worked out what would go wrong if we simply dropped the NOALIGN
totally? Either that, or make a new flags NDR_NO_DEFAULT_ALIGN to have
it align these strings (marked with their alignment), but not a uint32?
Andrew Bartlett
--
Andrew Bartlett http://samba.org/~abartlet/
Authentication Developer, Samba Team http://samba.org
More information about the samba-technical
mailing list