Skip to content

Commit

Permalink
Merge pull request #2802 from seanm/UBSan-null
Browse files Browse the repository at this point in the history
Fixed various UBSan warnings about working with NULL pointers
  • Loading branch information
WardF authored Nov 20, 2023
2 parents 3a1b125 + dc1b8b9 commit 0c6fd78
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 62 deletions.
17 changes: 10 additions & 7 deletions libsrc/attr.m4
Original file line number Diff line number Diff line change
Expand Up @@ -230,15 +230,18 @@ dup_NC_attrarrayV(NC_attrarray *ncap, const NC_attrarray *ref)
ncap->nelems = 0;
{
NC_attr **app = ncap->value;
const NC_attr **drpp = (const NC_attr **)ref->value;
NC_attr *const *const end = &app[ref->nelems];
for( /*NADA*/; app < end; drpp++, app++, ncap->nelems++)
if (app)
{
*app = dup_NC_attr(*drpp);
if(*app == NULL)
const NC_attr **drpp = (const NC_attr **)ref->value;
NC_attr *const *const end = &app[ref->nelems];
for( /*NADA*/; app < end; drpp++, app++, ncap->nelems++)
{
status = NC_ENOMEM;
break;
*app = dup_NC_attr(*drpp);
if(*app == NULL)
{
status = NC_ENOMEM;
break;
}
}
}
}
Expand Down
17 changes: 10 additions & 7 deletions libsrc/dim.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,15 +228,18 @@ dup_NC_dimarrayV(NC_dimarray *ncap, const NC_dimarray *ref)
ncap->nelems = 0;
{
NC_dim **dpp = ncap->value;
const NC_dim **drpp = (const NC_dim **)ref->value;
NC_dim *const *const end = &dpp[ref->nelems];
for( /*NADA*/; dpp < end; drpp++, dpp++, ncap->nelems++)
if(dpp != NULL)
{
*dpp = dup_NC_dim(*drpp);
if(*dpp == NULL)
const NC_dim **drpp = (const NC_dim **)ref->value;
NC_dim *const *const end = &dpp[ref->nelems];
for( /*NADA*/; dpp < end; drpp++, dpp++, ncap->nelems++)
{
status = NC_ENOMEM;
break;
*dpp = dup_NC_dim(*drpp);
if(*dpp == NULL)
{
status = NC_ENOMEM;
break;
}
}
}
}
Expand Down
17 changes: 10 additions & 7 deletions libsrc/nc3internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -950,7 +950,6 @@ int
NC_calcsize(const NC3_INFO *ncp, off_t *calcsizep)
{
NC_var **vpp = (NC_var **)ncp->vars.value;
NC_var *const *const end = &vpp[ncp->vars.nelems];
NC_var *last_fix = NULL; /* last "non-record" var */
int numrecvars = 0; /* number of record variables */

Expand All @@ -960,12 +959,16 @@ NC_calcsize(const NC3_INFO *ncp, off_t *calcsizep)
return NC_NOERR;
}

for( /*NADA*/; vpp < end; vpp++) {
if(IS_RECVAR(*vpp)) {
numrecvars++;
} else {
last_fix = *vpp;
}
if (vpp)
{
NC_var *const *const end = &vpp[ncp->vars.nelems];
for( /*NADA*/; vpp < end; vpp++) {
if(IS_RECVAR(*vpp)) {
numrecvars++;
} else {
last_fix = *vpp;
}
}
}

if(numrecvars == 0) {
Expand Down
2 changes: 1 addition & 1 deletion libsrc/putget.m4
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ static int
NCedgeck(const NC3_INFO* ncp, const NC_var *varp,
const size_t *start, const size_t *edges)
{
const size_t *const end = start + varp->ndims;
const size_t *const end = start ? (start + varp->ndims) : NULL;
const size_t *shp = varp->shape;

if(varp->ndims == 0)
Expand Down
84 changes: 50 additions & 34 deletions libsrc/v1hpg.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,10 +448,13 @@ ncx_len_NC_dimarray(const NC_dimarray *ncap, int version)
/* else */
{
const NC_dim **dpp = (const NC_dim **)ncap->value;
const NC_dim *const *const end = &dpp[ncap->nelems];
for( /*NADA*/; dpp < end; dpp++)
if (dpp)
{
xlen += ncx_len_NC_dim(*dpp,version);
const NC_dim *const *const end = &dpp[ncap->nelems];
for( /*NADA*/; dpp < end; dpp++)
{
xlen += ncx_len_NC_dim(*dpp,version);
}
}
}
return xlen;
Expand Down Expand Up @@ -641,11 +644,13 @@ v1h_put_NC_attrV(v1hs *psp, const NC_attr *attrp)
if(status != NC_NOERR)
return status;

(void) memcpy(psp->pos, value, nbytes);

if (value) {
(void) memcpy(psp->pos, value, nbytes);
value = (void *)((char *)value + nbytes);
}

psp->pos = (void *)((char *)psp->pos + nbytes);
value = (void *)((char *)value + nbytes);
remaining -= nbytes;
remaining -= nbytes;

} while(remaining != 0);

Expand Down Expand Up @@ -709,11 +714,13 @@ v1h_get_NC_attrV(v1hs *gsp, NC_attr *attrp)
if(status != NC_NOERR)
return status;

(void) memcpy(value, gsp->pos, nget);
if (value) {
(void) memcpy(value, gsp->pos, nget);
value = (void *)((signed char *)value + nget);
}

gsp->pos = (void*)((unsigned char *)gsp->pos + nget);

value = (void *)((signed char *)value + nget);

remaining -= nget;

} while(remaining != 0);
Expand Down Expand Up @@ -790,10 +797,13 @@ ncx_len_NC_attrarray(const NC_attrarray *ncap, int version)
/* else */
{
const NC_attr **app = (const NC_attr **)ncap->value;
const NC_attr *const *const end = &app[ncap->nelems];
for( /*NADA*/; app < end; app++)
if (app)
{
xlen += ncx_len_NC_attr(*app,version);
const NC_attr *const *const end = &app[ncap->nelems];
for( /*NADA*/; app < end; app++)
{
xlen += ncx_len_NC_attr(*app,version);
}
}
}
return xlen;
Expand Down Expand Up @@ -1090,10 +1100,13 @@ ncx_len_NC_vararray(const NC_vararray *ncap, size_t sizeof_off_t, int version)
/* else */
{
const NC_var **vpp = (const NC_var **)ncap->value;
const NC_var *const *const end = &vpp[ncap->nelems];
for( /*NADA*/; vpp < end; vpp++)
if (vpp)
{
xlen += ncx_len_NC_var(*vpp, sizeof_off_t, version);
const NC_var *const *const end = &vpp[ncap->nelems];
for( /*NADA*/; vpp < end; vpp++)
{
xlen += ncx_len_NC_var(*vpp, sizeof_off_t, version);
}
}
}
return xlen;
Expand Down Expand Up @@ -1224,7 +1237,6 @@ static int
NC_computeshapes(NC3_INFO* ncp)
{
NC_var **vpp = (NC_var **)ncp->vars.value;
NC_var *const *const end = &vpp[ncp->vars.nelems];
NC_var *first_var = NULL; /* first "non-record" var */
NC_var *first_rec = NULL; /* first "record" var */
int status;
Expand All @@ -1236,27 +1248,31 @@ NC_computeshapes(NC3_INFO* ncp)
if(ncp->vars.nelems == 0)
return(0);

for( /*NADA*/; vpp < end; vpp++)
if (vpp)
{
status = NC_var_shape(*vpp, &ncp->dims);
if(status != NC_NOERR)
return(status);

if(IS_RECVAR(*vpp))
{
if(first_rec == NULL)
first_rec = *vpp;
ncp->recsize += (*vpp)->len;
}
else
NC_var *const *const end = &vpp[ncp->vars.nelems];
for( /*NADA*/; vpp < end; vpp++)
{
status = NC_var_shape(*vpp, &ncp->dims);
if(status != NC_NOERR)
return(status);

if(IS_RECVAR(*vpp))
{
if(first_rec == NULL)
first_rec = *vpp;
ncp->recsize += (*vpp)->len;
}
else
{
if(first_var == NULL)
first_var = *vpp;
/*
* Overwritten each time thru.
* Usually overwritten in first_rec != NULL clause below.
*/
ncp->begin_rec = (*vpp)->begin + (off_t)(*vpp)->len;
/*
* Overwritten each time thru.
* Usually overwritten in first_rec != NULL clause below.
*/
ncp->begin_rec = (*vpp)->begin + (off_t)(*vpp)->len;
}
}
}

Expand Down
15 changes: 9 additions & 6 deletions libsrc/var.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,14 +267,17 @@ dup_NC_vararrayV(NC_vararray *ncap, const NC_vararray *ref)
{
NC_var **vpp = ncap->value;
const NC_var **drpp = (const NC_var **)ref->value;
NC_var *const *const end = &vpp[ref->nelems];
for( /*NADA*/; vpp < end; drpp++, vpp++, ncap->nelems++)
if (vpp)
{
*vpp = dup_NC_var(*drpp);
if(*vpp == NULL)
NC_var *const *const end = &vpp[ref->nelems];
for( /*NADA*/; vpp < end; drpp++, vpp++, ncap->nelems++)
{
status = NC_ENOMEM;
break;
*vpp = dup_NC_var(*drpp);
if(*vpp == NULL)
{
status = NC_ENOMEM;
break;
}
}
}
}
Expand Down

0 comments on commit 0c6fd78

Please sign in to comment.