Fixes for resource leaks foudn with Coverity.

Bug 173, 174, 175, 176 and 177
This commit is contained in:
Mark Riddoch
2013-08-21 17:26:55 +02:00
parent 2135a76f7b
commit 9fe7a83675
5 changed files with 38 additions and 8 deletions

View File

@ -122,7 +122,10 @@ char uname[80], passwd[80];
if ((fp = fopen(fname, "r")) == NULL) if ((fp = fopen(fname, "r")) == NULL)
return NULL; return NULL;
if ((rval = users_alloc()) == NULL) if ((rval = users_alloc()) == NULL)
{
fclose(fp);
return NULL; return NULL;
}
while (fscanf(fp, "%[^:]:%s\n", uname, passwd) == 2) while (fscanf(fp, "%[^:]:%s\n", uname, passwd) == 2)
{ {
users_add(rval, uname, passwd); users_add(rval, uname, passwd);
@ -274,13 +277,15 @@ char* admin_remove_user(
* Scan passwd and copy all but matching lines to temp file. * Scan passwd and copy all but matching lines to temp file.
*/ */
if (fgetpos(fp, &rpos) != 0) { if (fgetpos(fp, &rpos) != 0) {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write( LOGFILE_ERROR,
"Unable to process passwd file %s : errno %d.\n" "Unable to process passwd file %s : errno %d.\n"
"Removing user from file failed, and must be done manually.", "Removing user from file failed, and must be done manually.",
fname, fname,
err); err);
return ADMIN_ERR_PWDFILEACCESS; fclose(fp_tmp);
unlink(fname_tmp);
return ADMIN_ERR_PWDFILEACCESS;
} }
while (fscanf(fp, "%[^:]:%s\n", fusr, fpwd) == 2) while (fscanf(fp, "%[^:]:%s\n", fusr, fpwd) == 2)
@ -303,6 +308,8 @@ char* admin_remove_user(
"done manually.", "done manually.",
fname, fname,
err); err);
fclose(fp_tmp);
unlink(fname_tmp);
return ADMIN_ERR_PWDFILEACCESS; return ADMIN_ERR_PWDFILEACCESS;
} }
} }
@ -311,14 +318,15 @@ char* admin_remove_user(
* Replace original passwd file with new. * Replace original passwd file with new.
*/ */
if (rename(fname_tmp, fname)) { if (rename(fname_tmp, fname)) {
int err = errno; int err = errno;
skygw_log_write( LOGFILE_ERROR, skygw_log_write( LOGFILE_ERROR,
"Unable to rename new passwd file %s : errno %d.\n" "Unable to rename new passwd file %s : errno %d.\n"
"Rename it to %s manually.", "Rename it to %s manually.",
fname_tmp, fname_tmp,
err, err,
fname); fname);
return ADMIN_ERR_PWDFILEACCESS; unlink(fname_tmp);
return ADMIN_ERR_PWDFILEACCESS;
} }
fclose(fp_tmp); fclose(fp_tmp);

View File

@ -376,6 +376,7 @@ int eno = 0;
if (n < 0) if (n < 0)
{ {
gwbuf_free(buffer);
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
{ {
return n; return n;
@ -387,6 +388,7 @@ int eno = 0;
} }
else if (n == 0) else if (n == 0)
{ {
gwbuf_free(buffer);
return n; return n;
} }

View File

@ -106,9 +106,11 @@ int gw_read_gwbuff(DCB *dcb, GWBUF **head, int b) {
if (n < 0) { if (n < 0) {
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
fprintf(stderr, "Client connection %i: continue for %i, %s\n", dcb->fd, errno, strerror(errno)); fprintf(stderr, "Client connection %i: continue for %i, %s\n", dcb->fd, errno, strerror(errno));
gwbuf_free(buffer);
return 1; return 1;
} else { } else {
fprintf(stderr, "Client connection %i error: %i, %s\n", dcb->fd, errno, strerror(errno));; fprintf(stderr, "Client connection %i error: %i, %s\n", dcb->fd, errno, strerror(errno));;
gwbuf_free(buffer);
(dcb->func).close(dcb); (dcb->func).close(dcb);
return 1; return 1;
} }
@ -117,6 +119,7 @@ int gw_read_gwbuff(DCB *dcb, GWBUF **head, int b) {
if (n == 0) { if (n == 0) {
// socket closed // socket closed
fprintf(stderr, "Client connection %i closed: %i, %s\n", dcb->fd, errno, strerror(errno)); fprintf(stderr, "Client connection %i closed: %i, %s\n", dcb->fd, errno, strerror(errno));
gwbuf_free(buffer);
(dcb->func).close(dcb); (dcb->func).close(dcb);
return 1; return 1;
} }

View File

@ -106,12 +106,14 @@ int fd;
/* read all data from file */ /* read all data from file */
if (read(fd, keys, sizeof(MAXKEYS)) != sizeof(MAXKEYS)) if (read(fd, keys, sizeof(MAXKEYS)) != sizeof(MAXKEYS))
{ {
free(keys);
skygw_log_write( LOGFILE_ERROR, "secrets_readKeys, failed reading from secret file [%s]. Error %i, %s\n", secret_file, errno, strerror(errno)); skygw_log_write( LOGFILE_ERROR, "secrets_readKeys, failed reading from secret file [%s]. Error %i, %s\n", secret_file, errno, strerror(errno));
return NULL; return NULL;
} }
/* Close the file */ /* Close the file */
if (close(fd) < 0) { if (close(fd) < 0) {
free(keys);
skygw_log_write( LOGFILE_ERROR, "secrets_readKeys, failed closing the secret file [%s]. Error %i, %s\n", secret_file, errno, strerror(errno)); skygw_log_write( LOGFILE_ERROR, "secrets_readKeys, failed closing the secret file [%s]. Error %i, %s\n", secret_file, errno, strerror(errno));
return NULL; return NULL;
} }
@ -188,14 +190,22 @@ int enlen;
return strdup(crypt); return strdup(crypt);
/* If the input is not a HEX string return the input - it probably was not encrypted */ /* If the input is not a HEX string return the input - it probably was not encrypted */
for (ptr = crypt; *ptr; ptr++) for (ptr = crypt; *ptr; ptr++)
{
if (!isxdigit(*ptr)) if (!isxdigit(*ptr))
{
free(keys);
return strdup(crypt); return strdup(crypt);
}
}
enlen = strlen(crypt) / 2; enlen = strlen(crypt) / 2;
gw_hex2bin(encrypted, crypt, strlen(crypt)); gw_hex2bin(encrypted, crypt, strlen(crypt));
if ((plain = (unsigned char *)malloc(80)) == NULL) if ((plain = (unsigned char *)malloc(80)) == NULL)
{
free(keys);
return NULL; return NULL;
}
AES_set_decrypt_key(keys->enckey, 8 * MAXSCALE_KEYLEN, &aeskey); AES_set_decrypt_key(keys->enckey, 8 * MAXSCALE_KEYLEN, &aeskey);

View File

@ -182,6 +182,7 @@ void
dprintAllServers(DCB *dcb) dprintAllServers(DCB *dcb)
{ {
SERVER *ptr; SERVER *ptr;
char *stat;
spinlock_acquire(&server_spin); spinlock_acquire(&server_spin);
ptr = allServers; ptr = allServers;
@ -189,7 +190,9 @@ SERVER *ptr;
{ {
dcb_printf(dcb, "Server %p\n", ptr); dcb_printf(dcb, "Server %p\n", ptr);
dcb_printf(dcb, "\tServer: %s\n", ptr->name); dcb_printf(dcb, "\tServer: %s\n", ptr->name);
dcb_printf(dcb, "\tStatus: %s\n", server_status(ptr)); stat = server_status(ptr);
dcb_printf(dcb, "\tStatus: %s\n", stat);
free(stat);
dcb_printf(dcb, "\tProtocol: %s\n", ptr->protocol); dcb_printf(dcb, "\tProtocol: %s\n", ptr->protocol);
dcb_printf(dcb, "\tPort: %d\n", ptr->port); dcb_printf(dcb, "\tPort: %d\n", ptr->port);
dcb_printf(dcb, "\tNumber of connections: %d\n", ptr->stats.n_connections); dcb_printf(dcb, "\tNumber of connections: %d\n", ptr->stats.n_connections);
@ -208,9 +211,13 @@ SERVER *ptr;
void void
dprintServer(DCB *dcb, SERVER *server) dprintServer(DCB *dcb, SERVER *server)
{ {
char *stat;
dcb_printf(dcb, "Server %p\n", server); dcb_printf(dcb, "Server %p\n", server);
dcb_printf(dcb, "\tServer: %s\n", server->name); dcb_printf(dcb, "\tServer: %s\n", server->name);
dcb_printf(dcb, "\tStatus: %s\n", server_status(server)); stat = server_status(server);
dcb_printf(dcb, "\tStatus: %s\n", stat);
free(stat);
dcb_printf(dcb, "\tProtocol: %s\n", server->protocol); dcb_printf(dcb, "\tProtocol: %s\n", server->protocol);
dcb_printf(dcb, "\tPort: %d\n", server->port); dcb_printf(dcb, "\tPort: %d\n", server->port);
dcb_printf(dcb, "\tNumber of connections: %d\n", server->stats.n_connections); dcb_printf(dcb, "\tNumber of connections: %d\n", server->stats.n_connections);