Skip to content

Commit 2dba194

Browse files
committed
Avoid jumping over allocations in error cleanup. Mostly this is done by just returning a value, but one place where I reordered the jump destinations
1 parent 3c82374 commit 2dba194

File tree

1 file changed

+49
-42
lines changed

1 file changed

+49
-42
lines changed

src/bigfile.c

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -287,15 +287,14 @@ big_file_open_block(BigFile * bf, BigBlock * block, const char * blockname)
287287
int
288288
big_file_create_block(BigFile * bf, BigBlock * block, const char * blockname, const char * dtype, int nmemb, int Nfile, const size_t fsize[])
289289
{
290-
RAISEIF(0 != _big_file_mksubdir_r(bf->basename, blockname),
291-
ex_subdir,
292-
NULL);
290+
if(0 != _big_file_mksubdir_r(bf->basename, blockname)) {
291+
_big_file_raise(NULL, __FILE__, __LINE__);
292+
return -1;
293+
}
293294
char * basename = _path_join(bf->basename, blockname);
294295
int rt = _big_block_create(block, basename, dtype, nmemb, Nfile, fsize);
295296
free(basename);
296297
return rt;
297-
ex_subdir:
298-
return -1;
299298
}
300299

301300
int
@@ -814,9 +813,10 @@ big_block_read(BigBlock * bb, BigBlockPtr * ptr, BigArray * array)
814813
FILE * fp = NULL;
815814
ptrdiff_t toread = 0;
816815

817-
RAISEIF(chunkbuf == NULL,
818-
ex_malloc,
819-
"Not enough memory for chunkbuf");
816+
if(chunkbuf == NULL) {
817+
_big_file_raise("Not enough memory for chunkbuf", __FILE__, __LINE__);
818+
return -1;
819+
}
820820

821821
big_array_init(&chunk_array, chunkbuf, bb->dtype, 2, dims, NULL);
822822
big_array_iter_init(&array_iter, array);
@@ -883,7 +883,6 @@ big_block_read(BigBlock * bb, BigBlockPtr * ptr, BigArray * array)
883883
ex_open:
884884
ex_eof:
885885
free(chunkbuf);
886-
ex_malloc:
887886
return -1;
888887
}
889888

@@ -908,9 +907,10 @@ big_block_write(BigBlock * bb, BigBlockPtr * ptr, BigArray * array)
908907
ptrdiff_t towrite = 0;
909908
FILE * fp;
910909

911-
RAISEIF(chunkbuf == NULL,
912-
ex_malloc,
913-
"not enough memory for chunkbuf of size %d bytes", CHUNK_BYTES);
910+
if(chunkbuf == NULL) {
911+
_big_file_raise("not enough memory for chunkbuf of size %d bytes", __FILE__, __LINE__, CHUNK_BYTES);
912+
return -1;
913+
}
914914

915915
big_array_init(&chunk_array, chunkbuf, bb->dtype, 2, dims, NULL);
916916
big_array_iter_init(&array_iter, array);
@@ -1494,17 +1494,30 @@ attrset_read_attr_set_v2(BigAttrSet * attrset, const char * basename)
14941494
fseek(fattr, 0, SEEK_END);
14951495
long size = ftell(fattr);
14961496
/*ftell may fail*/
1497-
RAISEIF(size < 0, ex_init, "ftell error: %s",strerror(errno));
1497+
if(size < 0) {
1498+
_big_file_raise("ftell error: %s", __FILE__, __LINE__, strerror(errno));
1499+
fclose(fattr);
1500+
return -1;
1501+
}
14981502
char * buffer = (char*) malloc(size + 1);
1499-
RAISEIF(!buffer, ex_init, "Could not allocate memory for buffer: %ld bytes",size+1);
15001503
unsigned char * data = (unsigned char * ) malloc(size + 1);
1504+
RAISEIF(!buffer, ex_init, "Could not allocate memory for buffer: %ld bytes",size+1);
15011505
RAISEIF(!data, ex_data, "Could not allocate memory for data: %ld bytes",size+1);
15021506
fseek(fattr, 0, SEEK_SET);
15031507
RAISEIF(size != fread(buffer, 1, size, fattr),
15041508
ex_read_file,
15051509
"Failed to read attribute file\n");
15061510
buffer[size] = 0;
1507-
1511+
if(0) { /* Just here for the error cleanups*/
1512+
ex_read_file:
1513+
attrset->dirty = 0;
1514+
free(data);
1515+
ex_data:
1516+
free(buffer);
1517+
ex_init:
1518+
fclose(fattr);
1519+
return -1;
1520+
}
15081521
/* now parse the v2 attr file.*/
15091522
long i = 0;
15101523
#define ATTRV2_EXPECT(variable) while(_isblank(buffer[i])) i++; \
@@ -1522,11 +1535,15 @@ attrset_read_attr_set_v2(BigAttrSet * attrset, const char * basename)
15221535
int nmemb = atoi(rawlength);
15231536
int itemsize = big_file_dtype_itemsize(dtype);
15241537

1525-
RAISEIF(nmemb * itemsize * 2!= strlen(rawdata),
1526-
ex_parse_attr,
1527-
"NMEMB and data mismiatch: %d x %d (%s) * 2 != %d",
1528-
nmemb, itemsize, dtype, strlen(rawdata));
1529-
1538+
if(nmemb * itemsize * 2 != strlen(rawdata)){
1539+
_big_file_raise("NMEMB and data mismatch: %d x %d (%s) * 2 != %d",
1540+
__FILE__, __LINE__, nmemb, itemsize, dtype, strlen(rawdata));
1541+
attrset->dirty = 0;
1542+
free(data);
1543+
free(buffer);
1544+
fclose(fattr);
1545+
return -1;
1546+
}
15301547
int j, k;
15311548
for(k = 0, j = 0; k < nmemb * itemsize; k ++, j += 2) {
15321549
char buf[3];
@@ -1536,26 +1553,19 @@ attrset_read_attr_set_v2(BigAttrSet * attrset, const char * basename)
15361553
unsigned int byte = strtoll(buf, NULL, 16);
15371554
data[k] = byte;
15381555
}
1539-
RAISEIF(0 != attrset_set_attr(attrset, name, data, dtype, nmemb),
1540-
ex_set_attr,
1541-
NULL);
1556+
if(0 != attrset_set_attr(attrset, name, data, dtype, nmemb)) {
1557+
attrset->dirty = 0;
1558+
free(data);
1559+
free(buffer);
1560+
fclose(fattr);
1561+
return -1;
1562+
}
15421563
}
15431564
fclose(fattr);
15441565
free(data);
15451566
free(buffer);
15461567
attrset->dirty = 0;
15471568
return 0;
1548-
1549-
ex_read_file:
1550-
ex_parse_attr:
1551-
ex_set_attr:
1552-
attrset->dirty = 0;
1553-
free(data);
1554-
ex_data:
1555-
free(buffer);
1556-
ex_init:
1557-
fclose(fattr);
1558-
return -1;
15591569
}
15601570
static int
15611571
attrset_write_attr_set_v2(BigAttrSet * attrset, const char * basename)
@@ -1575,7 +1585,7 @@ attrset_write_attr_set_v2(BigAttrSet * attrset, const char * basename)
15751585
int ldata = itemsize * a->nmemb;
15761586

15771587
char * rawdata = (char *) malloc(ldata * 2 + 1);
1578-
unsigned char * adata = (unsigned char*) a->data;
1588+
char * adata = (char*) a->data;
15791589
int j, k;
15801590
for(j = 0, k = 0; k < ldata; k ++, j+=2) {
15811591
rawdata[j] = conv[adata[k] / 16];
@@ -1695,19 +1705,16 @@ static int
16951705
attrset_remove_attr(BigAttrSet * attrset, const char * attrname)
16961706
{
16971707
BigAttr *attr = attrset_lookup_attr(attrset, attrname);
1698-
RAISEIF(attr == NULL,
1699-
ex_notfound,
1700-
"Attribute name '%s' is not found.", attrname
1701-
)
1708+
if(attr == NULL) {
1709+
_big_file_raise("Attribute name '%s' is not found.", __FILE__, __LINE__, attrname);
1710+
return -1;
1711+
}
17021712
ptrdiff_t ind = attr - attrset->attrlist;
17031713
memmove(&attrset->attrlist[ind], &attrset->attrlist[ind + 1],
17041714
(attrset->listused - ind - 1) * sizeof(BigAttr));
17051715
attrset->listused -= 1;
17061716

17071717
return 0;
1708-
1709-
ex_notfound:
1710-
return -1;
17111718
}
17121719

17131720
static BigAttr *

0 commit comments

Comments
 (0)