Changeset 745 for trunk/server/nsswitch/libwbclient/wbc_pwd.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/nsswitch/libwbclient/wbc_pwd.c
r414 r745 25 25 #include "replace.h" 26 26 #include "libwbclient.h" 27 #include "../winbind_client.h" 27 28 28 29 /** @brief The maximum number of pwent structs to get from winbindd … … 40 41 **/ 41 42 43 static void wbcPasswdDestructor(void *ptr) 44 { 45 struct passwd *pw = (struct passwd *)ptr; 46 free(pw->pw_name); 47 free(pw->pw_passwd); 48 free(pw->pw_gecos); 49 free(pw->pw_shell); 50 free(pw->pw_dir); 51 } 52 42 53 static struct passwd *copy_passwd_entry(struct winbindd_pw *p) 43 54 { 44 struct passwd *pwd = NULL; 45 wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE; 46 47 pwd = talloc(NULL, struct passwd); 48 BAIL_ON_PTR_ERROR(pwd, wbc_status); 49 50 pwd->pw_name = talloc_strdup(pwd,p->pw_name); 51 BAIL_ON_PTR_ERROR(pwd->pw_name, wbc_status); 52 53 pwd->pw_passwd = talloc_strdup(pwd, p->pw_passwd); 54 BAIL_ON_PTR_ERROR(pwd->pw_passwd, wbc_status); 55 56 pwd->pw_gecos = talloc_strdup(pwd, p->pw_gecos); 57 BAIL_ON_PTR_ERROR(pwd->pw_gecos, wbc_status); 58 59 pwd->pw_shell = talloc_strdup(pwd, p->pw_shell); 60 BAIL_ON_PTR_ERROR(pwd->pw_shell, wbc_status); 61 62 pwd->pw_dir = talloc_strdup(pwd, p->pw_dir); 63 BAIL_ON_PTR_ERROR(pwd->pw_dir, wbc_status); 64 65 pwd->pw_uid = p->pw_uid; 66 pwd->pw_gid = p->pw_gid; 67 68 done: 69 if (!WBC_ERROR_IS_OK(wbc_status)) { 70 talloc_free(pwd); 71 pwd = NULL; 72 } 73 74 return pwd; 55 struct passwd *pw = NULL; 56 57 pw = (struct passwd *)wbcAllocateMemory(1, sizeof(struct passwd), 58 wbcPasswdDestructor); 59 if (pw == NULL) { 60 return NULL; 61 } 62 pw->pw_name = strdup(p->pw_name); 63 if (pw->pw_name == NULL) { 64 goto fail; 65 } 66 pw->pw_passwd = strdup(p->pw_passwd); 67 if (pw->pw_passwd == NULL) { 68 goto fail; 69 } 70 pw->pw_gecos = strdup(p->pw_gecos); 71 if (pw->pw_gecos == NULL) { 72 goto fail; 73 } 74 pw->pw_shell = strdup(p->pw_shell); 75 if (pw->pw_shell == NULL) { 76 goto fail; 77 } 78 pw->pw_dir = strdup(p->pw_dir); 79 if (pw->pw_dir == NULL) { 80 goto fail; 81 } 82 pw->pw_uid = p->pw_uid; 83 pw->pw_gid = p->pw_gid; 84 return pw; 85 86 fail: 87 wbcFreeMemory(pw); 88 return NULL; 75 89 } 76 90 … … 78 92 * 79 93 **/ 94 95 static void wbcGroupDestructor(void *ptr) 96 { 97 struct group *gr = (struct group *)ptr; 98 int i; 99 100 free(gr->gr_name); 101 free(gr->gr_passwd); 102 103 /* if the array was partly created this can be NULL */ 104 if (gr->gr_mem == NULL) { 105 return; 106 } 107 108 for (i=0; gr->gr_mem[i] != NULL; i++) { 109 free(gr->gr_mem[i]); 110 } 111 free(gr->gr_mem); 112 } 80 113 81 114 static struct group *copy_group_entry(struct winbindd_gr *g, 82 115 char *mem_buf) 83 116 { 84 struct group *grp = NULL; 85 wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE; 117 struct group *gr = NULL; 86 118 int i; 87 119 char *mem_p, *mem_q; 88 120 89 grp = talloc(NULL, struct group); 90 BAIL_ON_PTR_ERROR(grp, wbc_status); 91 92 grp->gr_name = talloc_strdup(grp, g->gr_name); 93 BAIL_ON_PTR_ERROR(grp->gr_name, wbc_status); 94 95 grp->gr_passwd = talloc_strdup(grp, g->gr_passwd); 96 BAIL_ON_PTR_ERROR(grp->gr_passwd, wbc_status); 97 98 grp->gr_gid = g->gr_gid; 99 100 grp->gr_mem = talloc_array(grp, char*, g->num_gr_mem+1); 121 gr = (struct group *)wbcAllocateMemory( 122 1, sizeof(struct group), wbcGroupDestructor); 123 if (gr == NULL) { 124 return NULL; 125 } 126 127 gr->gr_name = strdup(g->gr_name); 128 if (gr->gr_name == NULL) { 129 goto fail; 130 } 131 gr->gr_passwd = strdup(g->gr_passwd); 132 if (gr->gr_passwd == NULL) { 133 goto fail; 134 } 135 gr->gr_gid = g->gr_gid; 136 137 gr->gr_mem = (char **)calloc(g->num_gr_mem+1, sizeof(char *)); 138 if (gr->gr_mem == NULL) { 139 goto fail; 140 } 101 141 102 142 mem_p = mem_q = mem_buf; 103 143 for (i=0; i<g->num_gr_mem && mem_p; i++) { 104 if ((mem_q = strchr(mem_p, ',')) != NULL) { 144 mem_q = strchr(mem_p, ','); 145 if (mem_q != NULL) { 105 146 *mem_q = '\0'; 106 147 } 107 148 108 grp->gr_mem[i] = talloc_strdup(grp, mem_p); 109 BAIL_ON_PTR_ERROR(grp->gr_mem[i], wbc_status); 149 gr->gr_mem[i] = strdup(mem_p); 150 if (gr->gr_mem[i] == NULL) { 151 goto fail; 152 } 110 153 111 154 if (mem_q == NULL) { … … 115 158 mem_p = mem_q + 1; 116 159 } 117 grp->gr_mem[i] = NULL; 118 119 wbc_status = WBC_ERR_SUCCESS; 120 121 done: 122 if (!WBC_ERROR_IS_OK(wbc_status)) { 123 talloc_free(grp); 124 grp = NULL; 125 } 126 127 return grp; 160 gr->gr_mem[i] = NULL; 161 162 return gr; 163 164 fail: 165 wbcFreeMemory(gr); 166 return NULL; 128 167 } 129 168 … … 198 237 struct winbindd_request request; 199 238 struct winbindd_response response; 200 char * sid_string = NULL;201 239 202 240 if (!pwd) { … … 205 243 } 206 244 207 wbc_status = wbcSidToString(sid, &sid_string);208 BAIL_ON_WBC_ERROR(wbc_status);209 210 245 /* Initialize request */ 211 246 … … 213 248 ZERO_STRUCT(response); 214 249 215 strncpy(request.data.sid, sid_string, sizeof(request.data.sid));250 wbcSidToStringBuf(sid, request.data.sid, sizeof(request.data.sid)); 216 251 217 252 wbc_status = wbcRequestResponse(WINBINDD_GETPWSID, … … 224 259 225 260 done: 226 if (sid_string) {227 wbcFreeMemory(sid_string);228 }229 230 261 return wbc_status; 231 262 } … … 262 293 263 294 done: 264 if (response.extra_data.data) 265 free(response.extra_data.data); 295 winbindd_free_response(&response); 266 296 267 297 return wbc_status; … … 297 327 298 328 done: 299 if (response.extra_data.data) 300 free(response.extra_data.data); 329 winbindd_free_response(&response); 301 330 302 331 return wbc_status; … … 325 354 if (pw_cache_size > 0) { 326 355 pw_cache_idx = pw_cache_size = 0; 327 if (pw_response.extra_data.data) { 328 free(pw_response.extra_data.data); 329 } 356 winbindd_free_response(&pw_response); 330 357 } 331 358 … … 347 374 if (pw_cache_size > 0) { 348 375 pw_cache_idx = pw_cache_size = 0; 349 if (pw_response.extra_data.data) { 350 free(pw_response.extra_data.data); 351 } 376 winbindd_free_response(&pw_response); 352 377 } 353 378 … … 376 401 pw_cache_idx = 0; 377 402 378 if (pw_response.extra_data.data) { 379 free(pw_response.extra_data.data); 380 ZERO_STRUCT(pw_response); 381 } 403 winbindd_free_response(&pw_response); 382 404 383 405 ZERO_STRUCT(request); … … 427 449 if (gr_cache_size > 0) { 428 450 gr_cache_idx = gr_cache_size = 0; 429 if (gr_response.extra_data.data) { 430 free(gr_response.extra_data.data); 431 } 451 winbindd_free_response(&gr_response); 432 452 } 433 453 … … 449 469 if (gr_cache_size > 0) { 450 470 gr_cache_idx = gr_cache_size = 0; 451 if (gr_response.extra_data.data) { 452 free(gr_response.extra_data.data); 453 } 471 winbindd_free_response(&gr_response); 454 472 } 455 473 … … 479 497 gr_cache_idx = 0; 480 498 481 if (gr_response.extra_data.data) { 482 free(gr_response.extra_data.data); 483 ZERO_STRUCT(gr_response); 484 } 499 winbindd_free_response(&gr_response); 485 500 486 501 ZERO_STRUCT(request); … … 528 543 gr_cache_idx = 0; 529 544 530 if (gr_response.extra_data.data) { 531 free(gr_response.extra_data.data); 532 ZERO_STRUCT(gr_response); 533 } 545 winbindd_free_response(&gr_response); 546 ZERO_STRUCT(gr_response); 534 547 535 548 ZERO_STRUCT(request); … … 587 600 BAIL_ON_WBC_ERROR(wbc_status); 588 601 589 groups = talloc_array(NULL, gid_t, response.data.num_entries); 602 groups = (gid_t *)wbcAllocateMemory( 603 response.data.num_entries, sizeof(gid_t), NULL); 590 604 BAIL_ON_PTR_ERROR(groups, wbc_status); 591 605 … … 601 615 602 616 done: 603 if (response.extra_data.data) { 604 free(response.extra_data.data); 605 } 606 if (groups) { 607 talloc_free(groups); 608 } 609 610 return wbc_status; 611 } 617 winbindd_free_response(&response); 618 wbcFreeMemory(groups); 619 return wbc_status; 620 }
Note:
See TracChangeset
for help on using the changeset viewer.