Check for and reject invalid account flags.
authorAndrew Bartlett <abartlet@samba.org>
Wed, 27 Feb 2008 23:05:32 +0000 (10:05 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 27 Feb 2008 23:05:32 +0000 (10:05 +1100)
(lest we have an account set with 0 flags)

Andrew Bartlett
(This used to be commit 7a46e72f8dbb191ac8a811eb4cd95210fab7dc7b)

source4/rpc_server/samr/dcesrv_samr.c

index 2ad35e0eb3c60820480a914cf138e5c0a089e1cd..8193e0a882abc5bb3234bb7d39100b10c1de9b31 100644 (file)
         set_el = ldb_msg_find_element(msg, attr);                      \
        set_el->flags = LDB_FLAG_MOD_REPLACE;                           \
 } while (0)                                                            
+
+#define CHECK_FOR_MULTIPLES(value, flag, poss_flags)   \
+       do { \
+               if ((value & flag) && ((value & flag) != (value & (poss_flags)))) { \
+                       return NT_STATUS_INVALID_PARAMETER;             \
+               }                                                       \
+       } while (0)                                                     \
        
 /* Set account flags, discarding flags that cannot be set with SAMR */                                                         
 #define SET_AFLAGS(msg, field, attr) do {                              \
        struct ldb_message_element *set_el;                             \
+       if ((r->in.info->field & (ACB_NORMAL | ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST)) == 0) { \
+               return NT_STATUS_INVALID_PARAMETER; \
+       }                                                               \
+       CHECK_FOR_MULTIPLES(r->in.info->field, ACB_NORMAL, ACB_NORMAL | ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST); \
+       CHECK_FOR_MULTIPLES(r->in.info->field, ACB_DOMTRUST, ACB_NORMAL | ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST); \
+       CHECK_FOR_MULTIPLES(r->in.info->field, ACB_WSTRUST, ACB_NORMAL | ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST); \
+       CHECK_FOR_MULTIPLES(r->in.info->field, ACB_SVRTRUST, ACB_NORMAL | ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST); \
        if (samdb_msg_add_acct_flags(sam_ctx, mem_ctx, msg, attr, (r->in.info->field & ~(ACB_AUTOLOCK|ACB_PW_EXPIRED))) != 0) { \
                return NT_STATUS_NO_MEMORY;                             \
        }                                                               \