I *think* this is a bug (or at least an unfortunate effect)
but I'll post here first for a sanity check.

I'm looking at Windows security: descriptors, ACLs, etc. The
conventional wisdom is that a DACL (or an SACL but less commonly)
can be one of three things within a security descriptor:

1) Not there
2) There but NULL
3) There and a (possibly empty) list of ACEs

When calling the GetSecurityDescriptorDacl Win32 API, the first
and second situations are distinguished by the lpbDaclPresent
parameter which receives 0 or 1. From that result, the pDacl
parameter is either meaningless or NULL/pointer to a list.

Within the win32security module, the GetSecurityDescriptorDacl
method of the PySECURITY_DESCRIPTOR object returns None in
both of the first two cases and I can't see any other way to
distinguish the cases without dropping down to ctypes or a
hand-built extension.

The offending code is in PySECURITY_DESCRIPTOR.cpp:

<snippet>
        // get Dacl from SD
        if (!::GetSecurityDescriptorDacl(psd, &bDaclPresent, &pdacl, 
&bDaclDefaulted))
                return PyWin_SetAPIError("GetSecurityDescriptorDacl");

        if (!bDaclPresent || pdacl == NULL)
        {
                Py_INCREF(Py_None);
                return Py_None;
        }

        return new PyACL(pdacl);

</snippet>

which returns None, as you see, in either case. The equivalent code
for SACL does the same thing.


I've not got an easy workaround. In general, it's very unlikely that
a DACL isn't present at all; and it's equally unlikely (I'm not sure
it's even meaningful) to have a NULL SACL. So I can fudge around things
a bit. But I'd prefer something more robust. However, it's difficult to
see what change to suggest without breaking the interface. The only
possibility I could come up with would be a separate pair of functions
whose only job would be to report the presence of the ACL in the SD.

Have I missed anything?

TJG
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to