r18845: Fix a type-punned warning that turned out to be a real bug: The secdesc
authorVolker Lendecke <vlendec@samba.org>
Sat, 23 Sep 2006 17:59:52 +0000 (17:59 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:01:04 +0000 (12:01 -0500)
revision is now an enum that might be represented as anything, in particular
as an int. It's definitely not a uint16 :-)

Volker

source/rpc_parse/parse_sec.c

index 32a8a8cd3291026994a957e0edddadced2f550ae..be789b2ef5680d0851fc36e11b9f08f399079d0b 100644 (file)
@@ -128,6 +128,7 @@ BOOL sec_io_acl(const char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth)
        uint32 old_offset;
        uint32 offset_acl_size;
        SEC_ACL *psa;
+       uint16 revision;
 
        /*
         * Note that the size is always a multiple of 4 bytes due to the
@@ -155,9 +156,17 @@ BOOL sec_io_acl(const char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth)
        
        old_offset = prs_offset(ps);
 
-       if(!prs_uint16("revision", ps, depth, (uint16 *)&psa->revision))
+       if (MARSHALLING(ps)) {
+               revision = (uint16)psa->revision;
+       }
+
+       if(!prs_uint16("revision", ps, depth, &revision))
                return False;
 
+       if (UNMARSHALLING(ps)) {
+               psa->revision = (enum security_acl_revision)revision;
+       }
+
        if(!prs_uint16_pre("size     ", ps, depth, &psa->size, &offset_acl_size))
                return False;
 
@@ -212,6 +221,7 @@ BOOL sec_io_desc(const char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
        uint32 max_offset = 0; /* after we're done, move offset to end */
        uint32 tmp_offset = 0;
        uint32 off_sacl, off_dacl, off_owner_sid, off_grp_sid;
+       uint16 revision;
 
        SEC_DESC *psd;
 
@@ -237,9 +247,17 @@ BOOL sec_io_desc(const char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
        /* start of security descriptor stored for back-calc offset purposes */
        old_offset = prs_offset(ps);
 
-       if(!prs_uint16("revision ", ps, depth, (uint16*)&psd->revision))
+       if (MARSHALLING(ps)) {
+               revision = (uint16)psd->revision;
+       }
+
+       if(!prs_uint16("revision", ps, depth, &revision))
                return False;
 
+       if (UNMARSHALLING(ps)) {
+               psd->revision = (enum security_acl_revision)revision;
+       }
+
        if(!prs_uint16("type     ", ps, depth, &psd->type))
                return False;