1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

r14135: Fix for Coverity #123: resource leak. Also rework much of the code to

make it cleaner.  There's still more to do on this...
This commit is contained in:
Jim McDonough 2006-03-10 09:41:08 +00:00 committed by Gerald (Jerry) Carter
parent 62e58d939b
commit f75dad0325

View File

@ -1710,14 +1710,14 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
char *ldif_file;
fstring sid, domainname;
uint32 sync_context = 0;
NTSTATUS result;
NTSTATUS ret = NT_STATUS_OK, result;
int k;
TALLOC_CTX *mem_ctx;
SAM_DELTA_HDR *hdr_deltas;
SAM_DELTA_CTR *deltas;
uint32 num_deltas;
const char *add_ldif = "/tmp/add.ldif", *mod_ldif = "/tmp/mod.ldif";
FILE *add_fd, *mod_fd, *ldif_fd;
FILE *add_fd = NULL, *mod_fd = NULL, *ldif_fd = NULL;
char sys_cmd[1024];
int num_alloced = 0, g_index = 0, a_index = 0, sys_cmd_result;
@ -1739,22 +1739,29 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
else
ldif_file = talloc_strdup(mem_ctx, "/tmp/tmp.ldif");
if (ldif_file == NULL)
return NT_STATUS_NO_MEMORY;
if (ldif_file == NULL) {
ret = NT_STATUS_NO_MEMORY;
goto done;
}
/* Open the add and mod ldif files */
add_fd = fopen(add_ldif, "a");
mod_fd = fopen(mod_ldif, "a");
if (add_fd == NULL || mod_fd == NULL) {
if (!(add_fd = fopen(add_ldif, "a"))) {
DEBUG(1, ("Could not open %s\n", add_ldif));
return NT_STATUS_UNSUCCESSFUL;
ret = NT_STATUS_UNSUCCESSFUL;
goto done;
}
if (!(mod_fd = fopen(mod_ldif, "a"))) {
DEBUG(1, ("Could not open %s\n", mod_ldif));
ret = NT_STATUS_UNSUCCESSFUL;
goto done;
}
/* Open the user's ldif file */
ldif_fd = fopen(ldif_file, "a");
if (ldif_fd == NULL) {
DEBUG(1, ("Could not open %s\n", ldif_file));
return NT_STATUS_UNSUCCESSFUL;
ret = NT_STATUS_UNSUCCESSFUL;
goto done;
}
/* Get the sid */
@ -1779,7 +1786,8 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
accountmap = SMB_MALLOC_ARRAY(ACCOUNTMAP, 8);
if (groupmap == NULL || accountmap == NULL) {
DEBUG(1,("GROUPMAP malloc failed\n"));
return NT_STATUS_NO_MEMORY;
ret = NT_STATUS_NO_MEMORY;
goto done;
}
/* Initialize the arrays */
@ -1821,7 +1829,8 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
&deltas);
if (!NT_STATUS_IS_OK(result) &&
!NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) {
return NT_STATUS_OK;
ret = NT_STATUS_OK;
goto done; /* is this correct? jmcd */
}
/* Re-allocate memory for groupmap and accountmap arrays */
@ -1831,9 +1840,8 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
num_deltas+num_alloced);
if (groupmap == NULL || accountmap == NULL) {
DEBUG(1,("GROUPMAP malloc failed\n"));
SAFE_FREE(groupmap);
SAFE_FREE(accountmap);
return NT_STATUS_NO_MEMORY;
ret = NT_STATUS_NO_MEMORY;
goto done;
}
/* Initialize the new records */
@ -1925,7 +1933,9 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
/* Close the ldif files */
fclose(add_fd);
add_fd = NULL;
fclose(mod_fd);
mod_fd = NULL;
/* Write ldif data to the user's file */
if (db_type == SAM_DATABASE_DOMAIN) {
@ -1946,7 +1956,8 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
if (sys_cmd_result) {
d_fprintf(stderr, "%s failed. Error was (%s)\n",
sys_cmd, strerror(errno));
return NT_STATUS_UNSUCCESSFUL;
ret = NT_STATUS_UNSUCCESSFUL;
goto done;
}
if (db_type == SAM_DATABASE_DOMAIN) {
fprintf(ldif_fd,
@ -1966,20 +1977,26 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
if (sys_cmd_result) {
d_fprintf(stderr, "%s failed. Error was (%s)\n",
sys_cmd, strerror(errno));
return NT_STATUS_UNSUCCESSFUL;
ret = NT_STATUS_UNSUCCESSFUL;
goto done;
}
/* Delete the temporary ldif files */
pstr_sprintf(sys_cmd, "rm -f %s %s", add_ldif, mod_ldif);
sys_cmd_result = system(sys_cmd);
if (sys_cmd_result) {
d_fprintf(stderr, "%s failed. Error was (%s)\n",
sys_cmd, strerror(errno));
return NT_STATUS_UNSUCCESSFUL;
}
if (unlink(add_ldif))
d_fprintf(stderr, "unlink(%s) failed, error was (%s)\n",
add_ldif, strerror(errno));
if (unlink(mod_ldif))
d_fprintf(stderr, "unlink(%s) failed, error was (%s)\n",
mod_ldif, strerror(errno));
/* Close the ldif file */
fclose(ldif_fd);
done:
/* Close the ldif files */
if (add_fd)
fclose(add_fd);
if (mod_fd)
fclose(mod_fd);
if (ldif_fd)
fclose(ldif_fd);
/* Deallocate memory for the mapping arrays */
SAFE_FREE(groupmap);
@ -1987,7 +2004,7 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
/* Return */
talloc_destroy(mem_ctx);
return NT_STATUS_OK;
return ret;
}
/**