Fixed some possible memory leaks

This commit is contained in:
Micke Prag 2008-10-15 10:23:45 +00:00
parent d1e79e6195
commit d2f81b089d
7 changed files with 58 additions and 20 deletions

View file

@ -8,4 +8,5 @@ endif(COMMAND cmake_policy)
ADD_SUBDIRECTORY(driver) ADD_SUBDIRECTORY(driver)
ADD_SUBDIRECTORY(tdtool) ADD_SUBDIRECTORY(tdtool)
ADD_SUBDIRECTORY(rfcmd)

View file

@ -1,10 +1,14 @@
#include "Device.h" #include "Device.h"
#include <stdlib.h>
/* /*
* Constructor * Constructor
*/ */
Device::Device() Device::Device()
{ {
#ifdef _LINUX
strDevice = 0;
#endif
} }
/* /*
@ -12,6 +16,11 @@ Device::Device()
*/ */
Device::~Device(void) Device::~Device(void)
{ {
#ifdef _LINUX
if (strDevice != 0) {
free(strDevice);
}
#endif
} }
/* /*

View file

@ -14,7 +14,7 @@ public:
virtual int dim(unsigned char level); virtual int dim(unsigned char level);
virtual int methods(char* strModel); virtual int methods(char* strModel);
#ifndef _WINDOWS #ifdef _LINUX
void setDevice(const char *device); void setDevice(const char *device);
protected: protected:
char *strDevice; char *strDevice;

View file

@ -75,7 +75,10 @@ int WINAPI devTurnOn(int intDeviceId){
TelldusSettings ts; TelldusSettings ts;
Device* dev = ts.getDevice(intDeviceId); Device* dev = ts.getDevice(intDeviceId);
if(dev != NULL){ if(dev != NULL){
int methods = dev->methods( ts.getModel( intDeviceId ) ); char *model = ts.getModel( intDeviceId );
int methods = dev->methods( model );
free(model);
int retval = 0; int retval = 0;
if ( !(methods & TELLSTICK_TURNON) ) { if ( !(methods & TELLSTICK_TURNON) ) {
@ -109,7 +112,9 @@ int WINAPI devTurnOff(int intDeviceId){
TelldusSettings ts; TelldusSettings ts;
Device* dev = ts.getDevice(intDeviceId); Device* dev = ts.getDevice(intDeviceId);
if(dev != NULL){ if(dev != NULL){
int methods = dev->methods( ts.getModel( intDeviceId ) ); char *model = ts.getModel( intDeviceId );
int methods = dev->methods( model );
free(model);
int retval = 0; int retval = 0;
if ( !(methods & TELLSTICK_TURNOFF) ) { if ( !(methods & TELLSTICK_TURNOFF) ) {
@ -143,7 +148,9 @@ int WINAPI devBell(int intDeviceId){
TelldusSettings ts; TelldusSettings ts;
Device* dev = ts.getDevice(intDeviceId); Device* dev = ts.getDevice(intDeviceId);
if(dev != NULL){ if(dev != NULL){
int methods = dev->methods( ts.getModel( intDeviceId ) ); char *model = ts.getModel( intDeviceId );
int methods = dev->methods( model );
free(model);
int retval = 0; int retval = 0;
if ( !(methods & TELLSTICK_BELL) ) { if ( !(methods & TELLSTICK_BELL) ) {
@ -177,7 +184,9 @@ int WINAPI devDim(int intDeviceId, unsigned char level){
TelldusSettings ts; TelldusSettings ts;
Device* dev = ts.getDevice(intDeviceId); Device* dev = ts.getDevice(intDeviceId);
if(dev != NULL){ if(dev != NULL){
int methods = dev->methods( ts.getModel( intDeviceId ) ); char *model = ts.getModel( intDeviceId );
int methods = dev->methods( model );
free(model);
int retval = 0; int retval = 0;
if ( !(methods & TELLSTICK_DIM) ) { if ( !(methods & TELLSTICK_DIM) ) {
@ -451,7 +460,7 @@ char * WINAPI devGetErrorString(int intErrorNo) {
strReturn = "Unknown error"; strReturn = "Unknown error";
} else { } else {
// Copy the error string to strReturn // Copy the error string to strReturn
strReturn = (char *)malloc( sizeof(char) * strlen(responses[intErrorNo]) ); strReturn = (char *)malloc( sizeof(char) * (strlen(responses[intErrorNo])+1) );
strcpy( strReturn, responses[intErrorNo] ); strcpy( strReturn, responses[intErrorNo] );
} }

View file

@ -4,6 +4,7 @@
#include "../DeviceSartano.h" #include "../DeviceSartano.h"
#include "../DeviceIkea.h" #include "../DeviceIkea.h"
#include <string.h> #include <string.h>
#include <stdlib.h>
/* /*
* Get the requested device * Get the requested device
@ -21,25 +22,35 @@ Device* TelldusSettings::getDevice(int intDeviceId){
char *strHouse = getArgument(intDeviceId, "nexa_house"); char *strHouse = getArgument(intDeviceId, "nexa_house");
char *strCode = getArgument(intDeviceId, "nexa_unit"); char *strCode = getArgument(intDeviceId, "nexa_unit");
dev = new DeviceNexa(strHouse, strCode); dev = new DeviceNexa(strHouse, strCode);
free(strHouse);
free(strCode);
} else if (strcmp(vendor, "Waveman") == 0) { } else if (strcmp(vendor, "Waveman") == 0) {
char *strHouse = getArgument(intDeviceId, "nexa_house"); char *strHouse = getArgument(intDeviceId, "nexa_house");
char *strCode = getArgument(intDeviceId, "nexa_unit"); char *strCode = getArgument(intDeviceId, "nexa_unit");
dev = new DeviceWaveman(strHouse, strCode); dev = new DeviceWaveman(strHouse, strCode);
free(strHouse);
free(strCode);
} else if (strcmp(vendor, "Sartano") == 0) { } else if (strcmp(vendor, "Sartano") == 0) {
char *strCode = getArgument(intDeviceId, "sartano_code"); char *strCode = getArgument(intDeviceId, "sartano_code");
dev = new DeviceSartano(strCode); dev = new DeviceSartano(strCode);
free(strCode);
} else if (strcmp(vendor, "Ikea") == 0) { } else if (strcmp(vendor, "Ikea") == 0) {
char *strSystem = getArgument(intDeviceId, "ikea_system"); char *strSystem = getArgument(intDeviceId, "ikea_system");
char *strUnits = getArgument(intDeviceId, "ikea_units"); char *strUnits = getArgument(intDeviceId, "ikea_units");
char *strFade = getArgument(intDeviceId, "ikea_fade"); char *strFade = getArgument(intDeviceId, "ikea_fade");
dev = new DeviceIkea(strSystem, strUnits, strFade); dev = new DeviceIkea(strSystem, strUnits, strFade);
free(strSystem);
free(strUnits);
free(strFade);
} else { } else {
free(vendor);
return NULL; return NULL;
} }
free(vendor);
#ifdef _LINUX #ifdef _LINUX
dev->setDevice( getSetting("deviceNode") ); dev->setDevice( getSetting("deviceNode") );

View file

@ -32,8 +32,6 @@ TelldusSettings::TelldusSettings(void)
{ {
d = new privateVars(); d = new privateVars();
readConfig(&d->cfg); readConfig(&d->cfg);
// printf("Nu: %d\n", cfg_size(d->cfg, "device"));
} }
/* /*
@ -43,6 +41,7 @@ TelldusSettings::~TelldusSettings(void)
{ {
if (d->cfg > 0) if (d->cfg > 0)
cfg_free(d->cfg); cfg_free(d->cfg);
delete d;
} }
/* /*
@ -175,7 +174,7 @@ char *TelldusSettings::getStringSetting(int intDeviceId, const char* name, bool
if (strSetting == NULL) { if (strSetting == NULL) {
return NULL; return NULL;
} }
char *strReturn = (char *)malloc(strlen(strSetting) * sizeof(char)); char *strReturn = (char *)malloc((strlen(strSetting)+1) * sizeof(char));
strcpy(strReturn, strSetting); strcpy(strReturn, strSetting);
return strReturn; return strReturn;
} }

View file

@ -50,19 +50,21 @@ void print_usage( char *name ) {
printf(" Both device-id and name is outputed with the --list option\n"); printf(" Both device-id and name is outputed with the --list option\n");
printf("\n"); printf("\n");
printf("Written by Micke Prag <micke.prag@telldus.se>\n"); printf("Written by Micke Prag <micke.prag@telldus.se>\n");
printf("Report bugs to <info.tech@telldus.se>\n");
printf("\n"); printf("\n");
printf("Copyright (C) 2008 Telldus Technologies AB\n"); printf("Copyright (C) 2008 Telldus Technologies AB\n");
} }
void print_version() { void print_version() {
printf("tdtool 2.0\n"); printf("tdtool 2.0\n");
printf("\n");
printf("Report bugs to <info.tech@telldus.se>\n");
} }
void print_device( int index ) { void print_device( int index ) {
int intId = devGetDeviceId(index); int intId = devGetDeviceId(index);
char *name = devGetName(intId); char *name = devGetName(intId);
printf("%i\t%s\n", intId, name); printf("%i\t%s\n", intId, name);
free(name);
} }
void list_devices() { void list_devices() {
@ -85,8 +87,10 @@ int find_device( char *device ) {
char *name = devGetName( id ); char *name = devGetName( id );
if (strcasecmp(name, device) == 0) { if (strcasecmp(name, device) == 0) {
deviceId = id; deviceId = id;
free(name);
break; break;
} }
free(name);
index++; index++;
} }
} }
@ -101,13 +105,12 @@ void switch_device( bool turnOn, char *device ) {
} }
char *name = devGetName( deviceId ); char *name = devGetName( deviceId );
if (turnOn) { int retval = (turnOn ? devTurnOn( deviceId ) : devTurnOff( deviceId ));
int retval = devTurnOn( deviceId ); char *errorString = devGetErrorString(retval);
printf("Turning on device: %i %s - %s\n", deviceId, name, devGetErrorString(retval));
} else { printf("Turning %s device: %i %s - %s\n", (turnOn ? "on" : "off"), deviceId, name, errorString);
int retval = devTurnOff( deviceId ); free(name);
printf("Turning off device: %i %s - %s\n", deviceId, name, devGetErrorString(retval)); free(errorString);
}
sleep(1); sleep(1);
} }
@ -124,7 +127,10 @@ void dim_device( char *device, int level ) {
char *name = devGetName( deviceId ); char *name = devGetName( deviceId );
int retval = devDim( deviceId, (unsigned char)level ); int retval = devDim( deviceId, (unsigned char)level );
printf("Dimming device: %i %s to %i - %s\n", deviceId, name, level, devGetErrorString(retval)); char *errorString = devGetErrorString(retval);
printf("Dimming device: %i %s to %i - %s\n", deviceId, name, level, errorString);
free(name);
free(errorString);
sleep(1); sleep(1);
} }
@ -137,7 +143,10 @@ void bell_device( char *device ) {
char *name = devGetName( deviceId ); char *name = devGetName( deviceId );
int retval = devBell( deviceId ); int retval = devBell( deviceId );
printf("Sending bell to: %i %s - %s\n", deviceId, name, devGetErrorString(retval)); char *errorString = devGetErrorString(retval);
printf("Sending bell to: %i %s - %s\n", deviceId, name, errorString);
free(name);
free(errorString);
sleep(1); sleep(1);
} }