Added more memory initialization for the sake of valgrind (especially

memory that gets set by ioctls that valgrind can't see).  Added a little
error handling for a few memory allocations.
This commit is contained in:
Frank Mori Hess 2008-01-16 19:45:05 +00:00
parent 4d07ce9969
commit ebe72a2b2a
5 changed files with 59 additions and 29 deletions

View file

@ -39,7 +39,7 @@ INTERNAL int __comedi_init=0;
INTERNAL void initialize(void)
{
char *s;
__comedi_init=1;
if( (s=getenv("COMEDILIB_LOGLEVEL")) ){
@ -47,7 +47,7 @@ INTERNAL void initialize(void)
COMEDILIB_DEBUG(3,"setting loglevel to %d\n",__comedi_loglevel);
}
}
EXPORT_ALIAS_DEFAULT(_comedi_open,comedi_open,0.7.18);
comedi_t* _comedi_open(const char *fn)
{
@ -70,7 +70,8 @@ comedi_t* _comedi_open(const char *fn)
it->n_subdevices=it->devinfo.n_subdevs;
get_subdevices(it);
if(get_subdevices(it) < 0)
goto cleanup;
it->magic=COMEDILIB_MAGIC;

View file

@ -45,7 +45,7 @@ int _comedi_data_write(comedi_t *it,unsigned int subdev,unsigned int chan,unsign
return -1;
s=it->subdevices+subdev;
if(it->has_insnlist_ioctl){
comedi_insn insn;
@ -69,7 +69,7 @@ int _comedi_data_write(comedi_t *it,unsigned int subdev,unsigned int chan,unsign
trigvar1: 0,
};
sampl_t sdata[2];
sdata[0]=data & 0xffff;
sdata[1]=(data >> 16) & 0xffff;
chan=CR_PACK(chan,range,aref);
@ -94,6 +94,7 @@ static int comedi_internal_data_read_n(comedi_t *it,
if(!valid_subd(it,subdev))
return -1;
if(n == 0) return 0;
s = it->subdevices + subdev;
@ -107,7 +108,7 @@ static int comedi_internal_data_read_n(comedi_t *it,
insn.data = data;
insn.subdev = subdev;
insn.chanspec = chanspec;
memset(insn.data, 0, n * sizeof(data[0])); // for valgrind
return comedi_do_insn(it,&insn);
}else{
comedi_trig cmd={
@ -196,7 +197,7 @@ int _comedi_data_read_delayed( comedi_t *it, unsigned int subdev,
comedi_insnlist ilist;
comedi_insn insn[3];
lsampl_t delay = nano_sec;
if( !valid_chan( it, subdev, chan ) )
return -1;
@ -204,6 +205,7 @@ int _comedi_data_read_delayed( comedi_t *it, unsigned int subdev,
memset( insn, 0, sizeof(insn) );
memset( &ilist, 0, sizeof(ilist) );
memset(data, 0, sizeof(*data)); // for valgrind
// setup, no conversions
insn[0].insn = INSN_READ;

View file

@ -105,6 +105,7 @@ int _comedi_dio_get_config(comedi_t *it,unsigned int subdev, unsigned int chan,
insn.data = data;
insn.subdev = subdev;
insn.chanspec = CR_PACK(chan,0,0);
memset(data, 0, insn.n * sizeof(*data));
data[0] = INSN_CONFIG_DIO_QUERY;
retval = comedi_do_insn(it,&insn);
@ -131,7 +132,7 @@ int _comedi_dio_read(comedi_t *it,unsigned int subdev,unsigned int chan,
if(it->has_insnlist_ioctl){
comedi_insn insn;
lsampl_t data;
lsampl_t data = 0;
memset(&insn,0,sizeof(insn));
insn.insn = INSN_READ;

View file

@ -21,6 +21,7 @@
USA.
*/
#include <assert.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
@ -51,16 +52,31 @@ int get_subdevices(comedi_t *it)
comedi_chaninfo ci;
subdevice *r;
s=malloc(sizeof(comedi_subdinfo)*it->n_subdevices);
debug_ptr(s);
s = calloc(it->n_subdevices, sizeof(comedi_subdinfo));
if(s == NULL)
{
debug_ptr(s);
libc_error();
return -1;
}
ret = comedi_ioctl(it->fd, COMEDI_SUBDINFO, (unsigned long)s);
debug_int(ret);
if(ret < 0)
{
debug_int(ret);
free(s);
return -1;
}
r=it->subdevices=realloc(it->subdevices,
sizeof(subdevice)*it->n_subdevices);
debug_ptr(r);
memset(r,0,sizeof(subdevice)*it->n_subdevices);
assert(it->subdevices == NULL);
r = it->subdevices = calloc(it->n_subdevices, sizeof(subdevice));
if(r == NULL)
{
debug_ptr(r);
libc_error();
free(s);
return -1;
}
it->has_insnlist_ioctl = do_test_for_insnlist(it);
it->has_insn_ioctl = do_test_for_insn(it);
@ -76,15 +92,15 @@ int get_subdevices(comedi_t *it)
r[i].range_type = s[i].range_type;
if(r[i].subd_flags&SDF_FLAGS){
r[i].flags_list=malloc(sizeof(*r[i].flags_list)*r[i].n_chan);
r[i].flags_list = calloc(r[i].n_chan, sizeof(*r[i].flags_list));
debug_ptr(r[i].flags_list);
}
if(r[i].subd_flags&SDF_MAXDATA){
r[i].maxdata_list=malloc(sizeof(*r[i].maxdata_list)*r[i].n_chan);
r[i].maxdata_list = calloc(r[i].n_chan, sizeof(*r[i].maxdata_list));
debug_ptr(r[i].maxdata_list);
}
if(r[i].subd_flags&SDF_RANGETYPE){
r[i].range_type_list=malloc(sizeof(*r[i].range_type_list)*r[i].n_chan);
r[i].range_type_list = calloc(r[i].n_chan, sizeof(*r[i].range_type_list));
debug_ptr(r[i].range_type_list);
}
ci.subdev = i;
@ -125,9 +141,21 @@ comedi_range *get_rangeinfo(int fd,unsigned int range_type)
int ret;
int i;
kr=malloc(sizeof(comedi_krange)*RANGE_LENGTH(range_type));
r=malloc(sizeof(comedi_range)*RANGE_LENGTH(range_type));
kr = calloc(RANGE_LENGTH(range_type), sizeof(comedi_krange));
if(kr == NULL)
{
libc_error();
return NULL;
}
r = malloc(sizeof(comedi_range)*RANGE_LENGTH(range_type));
if(r == NULL)
{
libc_error();
free(kr);
return NULL;
}
memset(&ri, 0, sizeof(ri));
ri.range_type = range_type;
ri.range_ptr = kr;
ret = comedi_ioctl(fd, COMEDI_RANGEINFO, (unsigned long)&ri);
@ -188,14 +216,14 @@ static int do_test_for_insnlist(comedi_t *dev)
lsampl_t data[2];
int ret;
memset(&insn,0,sizeof(insn));
il.n_insns = 1;
il.insns = &insn;
memset(&insn,0,sizeof(insn));
insn.insn = INSN_GTOD;
insn.n = 2;
insn.data = data;
memset(insn.data, 0, insn.n * sizeof(insn.data[0]));
ret = comedi_ioctl(dev->fd, COMEDI_INSNLIST, (unsigned long)&il);
@ -216,14 +244,14 @@ static int do_test_for_insn(comedi_t *dev)
lsampl_t data[2];
int ret;
memset(&insn,0,sizeof(insn));
il.n_insns = 1;
il.insns = &insn;
memset(&insn,0,sizeof(insn));
insn.insn = INSN_GTOD;
insn.n = 2;
insn.data = data;
memset(insn.data, 0, insn.n * sizeof(insn.data[0]));
ret = comedi_ioctl(dev->fd, COMEDI_INSN, (unsigned long)&insn);
@ -255,9 +283,7 @@ static int do_test_for_insn_bits(comedi_t *dev,unsigned int subdevice)
insn.n = 2;
insn.data = data;
insn.subdev = subdevice;
data[0]=0;
data[1]=0;
memset(data, 0, insn.n * sizeof(data[0]));
ret = comedi_do_insnlist(dev,&il);

View file

@ -87,10 +87,10 @@ int _comedi_get_subdevice_flags(comedi_t *it,unsigned int subd)
int ret;
if(!valid_dev(it))
return -1;
s = malloc(sizeof(comedi_subdinfo) * it->n_subdevices);
s = calloc(it->n_subdevices, sizeof(comedi_subdinfo));
if(s == NULL)
{
__comedi_errno = errno;
libc_error();
return -1;
}
ret = comedi_ioctl(it->fd, COMEDI_SUBDINFO, (unsigned long)s);