Fixes for resource leaks foudn with Coverity.
Bug 173, 174, 175, 176 and 177
This commit is contained in:
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user