Changeset 147 for trunk/lib/winsec.c
- Timestamp:
- 02/22/09 14:31:52 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/winsec.c
r134 r147 24 24 */ 25 25 26 #include "../include/winsec.h" 27 26 #include "winsec.h" 27 28 29 /****************************************************************************** 30 * Non-talloc() interface for parsing a descriptor. 31 ******************************************************************************/ 32 WINSEC_DESC* winsec_parse_descriptor(const uint8_t* buf, uint32_t buf_len) 33 { 34 return winsec_parse_desc(NULL, buf, buf_len); 35 } 36 37 38 /****************************************************************************** 39 * Free a descriptor. Not needed if using talloc and a parent context is freed. 40 ******************************************************************************/ 41 void winsec_free_descriptor(WINSEC_DESC* desc) 42 { 43 talloc_free(desc); 44 } 28 45 29 46 … … 31 48 * Parses a WINSEC_DESC structure and substructures. 32 49 ******************************************************************************/ 33 WINSEC_DESC* winsec_parse_desc(const uint8_t* buf, uint32_t buf_len) 50 WINSEC_DESC* winsec_parse_desc(void* talloc_ctx, 51 const uint8_t* buf, uint32_t buf_len) 34 52 { 35 53 WINSEC_DESC* ret_val; … … 37 55 if (buf == NULL || buf_len < WINSEC_DESC_HEADER_SIZE) 38 56 return NULL; 39 57 /* 40 58 if((ret_val = (WINSEC_DESC*)zalloc(sizeof(WINSEC_DESC))) == NULL) 59 return NULL; 60 */ 61 if((ret_val = talloc(talloc_ctx, WINSEC_DESC)) == NULL) 41 62 return NULL; 42 63 … … 61 82 || (ret_val->off_dacl >= buf_len)) 62 83 { 63 free(ret_val);84 talloc_free(ret_val); 64 85 return NULL; 65 86 } … … 67 88 if(ret_val->off_owner_sid != 0) 68 89 { 69 ret_val->owner_sid = winsec_parse_dom_sid(buf + ret_val->off_owner_sid, 90 ret_val->owner_sid = winsec_parse_dom_sid(ret_val, 91 buf + ret_val->off_owner_sid, 70 92 buf_len - ret_val->off_owner_sid); 71 93 if(ret_val->owner_sid == NULL) 72 94 { 73 free(ret_val);95 talloc_free(ret_val); 74 96 return NULL; 75 97 } … … 78 100 if (ret_val->off_grp_sid != 0) 79 101 { 80 ret_val->grp_sid = winsec_parse_dom_sid( buf + ret_val->off_grp_sid,102 ret_val->grp_sid = winsec_parse_dom_sid(ret_val, buf + ret_val->off_grp_sid, 81 103 buf_len - ret_val->off_grp_sid); 82 104 if(ret_val->grp_sid == NULL) 83 105 { 84 if(ret_val->owner_sid != NULL) 85 free(ret_val->owner_sid); 86 free(ret_val); 106 talloc_free(ret_val); 87 107 return NULL; 88 108 } … … 91 111 if ((ret_val->control & WINSEC_DESC_SACL_PRESENT) && ret_val->off_sacl) 92 112 { 93 ret_val->sacl = winsec_parse_acl( buf + ret_val->off_sacl,113 ret_val->sacl = winsec_parse_acl(ret_val, buf + ret_val->off_sacl, 94 114 buf_len - ret_val->off_sacl); 95 115 if(ret_val->sacl == NULL) 96 116 { 97 if(ret_val->owner_sid != NULL) 98 free(ret_val->owner_sid); 99 if(ret_val->grp_sid != NULL) 100 free(ret_val->grp_sid); 101 free(ret_val); 117 talloc_free(ret_val); 102 118 return NULL; 103 119 } … … 106 122 if ((ret_val->control & WINSEC_DESC_DACL_PRESENT) && ret_val->off_dacl != 0) 107 123 { 108 ret_val->dacl = winsec_parse_acl( buf + ret_val->off_dacl,124 ret_val->dacl = winsec_parse_acl(ret_val, buf + ret_val->off_dacl, 109 125 buf_len - ret_val->off_dacl); 110 126 if(ret_val->dacl == NULL) 111 127 { 112 if(ret_val->owner_sid != NULL) 113 free(ret_val->owner_sid); 114 if(ret_val->grp_sid != NULL) 115 free(ret_val->grp_sid); 116 if(ret_val->sacl != NULL) 117 free(ret_val->sacl); 118 free(ret_val); 128 talloc_free(ret_val); 119 129 return NULL; 120 130 } … … 128 138 * Parses a WINSEC_ACL structure and all substructures. 129 139 ******************************************************************************/ 130 WINSEC_ACL* winsec_parse_acl(const uint8_t* buf, uint32_t buf_len) 140 WINSEC_ACL* winsec_parse_acl(void* talloc_ctx, 141 const uint8_t* buf, uint32_t buf_len) 131 142 { 132 143 uint32_t i, offset; … … 139 150 if (buf == NULL || buf_len < 8) 140 151 return NULL; 141 152 /* 142 153 if((ret_val = (WINSEC_ACL*)zalloc(sizeof(WINSEC_ACL))) == NULL) 154 return NULL; 155 */ 156 if((ret_val = talloc(talloc_ctx, WINSEC_ACL)) == NULL) 143 157 return NULL; 144 158 … … 153 167 if((ret_val->size > buf_len) || (ret_val->num_aces > 4095)) 154 168 { 155 free(ret_val);169 talloc_free(ret_val); 156 170 return NULL; 157 171 } … … 161 175 * (allow no access). 162 176 */ 163 if((ret_val->aces = (WINSEC_ACE**)zcalloc(sizeof(WINSEC_ACE*),177 /* if((ret_val->aces = (WINSEC_ACE**)zcalloc(sizeof(WINSEC_ACE*), 164 178 ret_val->num_aces+1)) == NULL) 165 { 166 free(ret_val); 179 */ 180 if((ret_val->aces = talloc_array(ret_val, WINSEC_ACE*, 181 ret_val->num_aces+1)) == NULL) 182 { 183 talloc_free(ret_val); 167 184 return NULL; 168 185 } … … 171 188 for(i=0; i < ret_val->num_aces; i++) 172 189 { 173 ret_val->aces[i] = winsec_parse_ace(buf+offset, buf_len-offset); 190 ret_val->aces[i] = winsec_parse_ace(ret_val->aces, 191 buf+offset, buf_len-offset); 174 192 if(ret_val->aces[i] == NULL) 175 193 { 176 free(ret_val->aces); 177 free(ret_val); 194 talloc_free(ret_val); 178 195 return NULL; 179 196 } … … 182 199 if(offset > buf_len) 183 200 { 184 free(ret_val->aces); 185 free(ret_val); 201 talloc_free(ret_val); 186 202 return NULL; 187 203 } … … 195 211 * Parses a WINSEC_ACE structure and all substructures. 196 212 ******************************************************************************/ 197 WINSEC_ACE* winsec_parse_ace(const uint8_t* buf, uint32_t buf_len) 213 WINSEC_ACE* winsec_parse_ace(void* talloc_ctx, 214 const uint8_t* buf, uint32_t buf_len) 198 215 { 199 216 uint32_t offset; … … 203 220 return NULL; 204 221 205 if((ret_val = (WINSEC_ACE*)zalloc(sizeof(WINSEC_ACE))) == NULL) 222 /* if((ret_val = (WINSEC_ACE*)zalloc(sizeof(WINSEC_ACE))) == NULL)*/ 223 224 if((ret_val = talloc(talloc_ctx, WINSEC_ACE)) == NULL) 206 225 return NULL; 207 226 … … 221 240 if(ret_val->obj_flags & WINSEC_ACE_OBJECT_PRESENT) 222 241 { 223 ret_val->obj_guid = winsec_parse_uuid(buf+offset, buf_len-offset); 242 ret_val->obj_guid = winsec_parse_uuid(ret_val, 243 buf+offset, buf_len-offset); 224 244 if(ret_val->obj_guid == NULL) 225 245 { 226 free(ret_val);246 talloc_free(ret_val); 227 247 return NULL; 228 248 } … … 232 252 if(ret_val->obj_flags & WINSEC_ACE_OBJECT_INHERITED_PRESENT) 233 253 { 234 ret_val->inh_guid = winsec_parse_uuid(buf+offset, buf_len-offset); 254 ret_val->inh_guid = winsec_parse_uuid(ret_val, 255 buf+offset, buf_len-offset); 235 256 if(ret_val->inh_guid == NULL) 236 257 { 237 if(ret_val->obj_guid != NULL) 238 free(ret_val->obj_guid); 239 free(ret_val); 258 talloc_free(ret_val); 240 259 return NULL; 241 260 } … … 244 263 } 245 264 246 ret_val->trustee = winsec_parse_dom_sid( buf+offset, buf_len-offset);265 ret_val->trustee = winsec_parse_dom_sid(ret_val, buf+offset, buf_len-offset); 247 266 if(ret_val->trustee == NULL) 248 267 { 249 if(ret_val->obj_guid != NULL) 250 free(ret_val->obj_guid); 251 if(ret_val->inh_guid != NULL) 252 free(ret_val->inh_guid); 253 free(ret_val); 254 return NULL; 268 talloc_free(ret_val); 269 return NULL; 255 270 } 256 271 … … 262 277 * Parses a WINSEC_DOM_SID structure. 263 278 ******************************************************************************/ 264 WINSEC_DOM_SID* winsec_parse_dom_sid(const uint8_t* buf, uint32_t buf_len) 279 WINSEC_DOM_SID* winsec_parse_dom_sid(void* talloc_ctx, 280 const uint8_t* buf, uint32_t buf_len) 265 281 { 266 282 uint32_t i; … … 270 286 return NULL; 271 287 272 if((ret_val = (WINSEC_DOM_SID*)zalloc(sizeof(WINSEC_DOM_SID))) == NULL) 288 /* if((ret_val = (WINSEC_DOM_SID*)zalloc(sizeof(WINSEC_DOM_SID))) == NULL)*/ 289 if((ret_val = talloc(talloc_ctx, WINSEC_DOM_SID)) == NULL) 273 290 return NULL; 274 291 … … 283 300 if(buf_len < ret_val->num_auths*sizeof(uint32_t)+8) 284 301 { 285 free(ret_val);302 talloc_free(ret_val); 286 303 return NULL; 287 304 } … … 297 314 * Parses a WINSEC_UUID struct. 298 315 ******************************************************************************/ 299 WINSEC_UUID* winsec_parse_uuid(const uint8_t* buf, uint32_t buf_len) 316 WINSEC_UUID* winsec_parse_uuid(void* talloc_ctx, 317 const uint8_t* buf, uint32_t buf_len) 300 318 { 301 319 WINSEC_UUID* ret_val; … … 304 322 return false; 305 323 306 if((ret_val = (WINSEC_UUID*)zalloc(sizeof(WINSEC_UUID))) == NULL) 324 /* if((ret_val = (WINSEC_UUID*)zalloc(sizeof(WINSEC_UUID))) == NULL)*/ 325 if((ret_val = talloc(talloc_ctx, WINSEC_UUID)) == NULL) 307 326 return NULL; 308 327 … … 321 340 * Calculates the size of a SID. 322 341 ******************************************************************************/ 323 /*size_t sid_size(const WINSEC_DOM_SID *sid)*/324 342 size_t winsec_sid_size(const WINSEC_DOM_SID* sid) 325 343 { … … 334 352 * Compare the auth portion of two SIDs. 335 353 ******************************************************************************/ 336 /*int sid_compare_auth(const WINSEC_DOM_SID *sid1, const WINSEC_DOM_SID *sid2)*/337 354 int winsec_sid_compare_auth(const WINSEC_DOM_SID* sid1, const WINSEC_DOM_SID* sid2) 338 355 { … … 360 377 * Compare two SIDs. 361 378 ******************************************************************************/ 362 /*int sid_compare(const WINSEC_DOM_SID *sid1, const WINSEC_DOM_SID *sid2)*/363 379 int winsec_sid_compare(const WINSEC_DOM_SID* sid1, const WINSEC_DOM_SID* sid2) 364 380 {
Note: See TracChangeset
for help on using the changeset viewer.