Skip to content

Commit afeff82

Browse files
committed
Various changes for legibility
Fix some warinings and possible integer overflows
1 parent d210b0a commit afeff82

File tree

1 file changed

+32
-36
lines changed

1 file changed

+32
-36
lines changed

extract-xiso.c

+32-36
Original file line numberDiff line numberDiff line change
@@ -863,19 +863,15 @@ int log_err(const char* in_file, int in_line, const char* in_format, ...) {
863863
format = (char*)in_format;
864864
#endif
865865

866-
if (s_real_quiet) {
867-
ret = 0;
868-
}
866+
if (s_real_quiet) ret = 0;
869867
else if(format){
870868
va_start(ap, in_format);
871869
fprintf(stderr, "\n");
872870
ret = vfprintf(stderr, format, ap);
873871
fprintf(stderr, "\n");
874872
va_end(ap);
875873
}
876-
else {
877-
ret = 1;
878-
}
874+
else ret = 1;
879875

880876
#if DEBUG
881877
if(format) free(format);
@@ -949,7 +945,7 @@ int create_xiso( char *in_root_directory, char *in_output_directory, dir_node_av
949945
xoff_t pos;
950946
dir_node_avl root;
951947
FILE_TIME *ft = nil;
952-
write_tree_context wt_context;
948+
write_tree_context wt_context = { 0 };
953949
uint32_t start_sector;
954950
int i, n, xiso = -1, err = 0;
955951
char *cwd = nil, *buf = nil, *iso_name, *xiso_path, *iso_dir;
@@ -1253,7 +1249,7 @@ int traverse_xiso(int in_xiso, xoff_t in_dir_start, uint16_t entry_offset, uint1
12531249
little32(node->file_size);
12541250
little32(node->start_sector);
12551251

1256-
if ((node->filename = (char*)malloc(node->filename_length + 1)) == nil) mem_err();
1252+
if ((node->filename = (char*)malloc((size_t)node->filename_length + 1)) == nil) mem_err();
12571253
}
12581254

12591255
if (!err) {
@@ -1364,9 +1360,7 @@ int process_node(int in_xiso, dir_node* node, char* in_path, modes in_mode, dir_
13641360
if (!err) {
13651361
if (!s_remove_systemupdate || !strstr(in_path, s_systemupdate))
13661362
{
1367-
if (in_mode == k_extract) {
1368-
err = extract_file(in_xiso, node, in_mode, in_path);
1369-
}
1363+
if (in_mode == k_extract) err = extract_file(in_xiso, node, in_mode, in_path);
13701364
else {
13711365
exiso_log("\n%s%s (%u bytes)", in_path, node->filename, node->file_size); flush();
13721366
}
@@ -1710,7 +1704,7 @@ int free_dir_node_avl( void *in_dir_node_avl, void *in_context, long in_depth )
17101704

17111705
int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_depth ) {
17121706
xoff_t pos;
1713-
write_tree_context context;
1707+
write_tree_context context = { 0 };
17141708
xoff_t dir_start = (xoff_t)in_avl->start_sector * XISO_SECTOR_SIZE;
17151709
int err = 0, pad;
17161710
char sector[XISO_SECTOR_SIZE];
@@ -1738,7 +1732,8 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17381732
if (!err && lseek(in_context->xiso, dir_start, SEEK_SET) == -1) seek_err();
17391733
if (!err) err = avl_traverse_depth_first(in_avl->subdirectory, (traversal_callback)write_directory, in_context, k_prefix, 0);
17401734
if (!err && (pos = lseek(in_context->xiso, 0, SEEK_CUR)) == -1) seek_err();
1741-
if (!err && (pad = (int)((XISO_SECTOR_SIZE - (pos % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE))) {
1735+
if (!err) {
1736+
pad = (int)((XISO_SECTOR_SIZE - (pos % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE);
17421737
memset(sector, XISO_PAD_BYTE, pad);
17431738
if (write(in_context->xiso, sector, pad) != pad) write_err();
17441739
}
@@ -1762,14 +1757,14 @@ int write_tree( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17621757

17631758
int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_depth ) {
17641759
char *buf, *p;
1765-
uint32_t bytes, n, size;
1760+
uint32_t bytes, n, size = max(XISO_SECTOR_SIZE, READWRITE_BUFFER_SIZE);
17661761
int err = 0, fd = -1, i;
17671762
size_t len;
17681763

17691764
if ( ! in_avl->subdirectory ) {
17701765
if ( lseek( in_context->xiso, (xoff_t) in_avl->start_sector * XISO_SECTOR_SIZE, SEEK_SET ) == -1 ) seek_err();
17711766

1772-
if ( ! err && ( buf = (char *) malloc( ( size = max( XISO_SECTOR_SIZE, READWRITE_BUFFER_SIZE ) ) + 1 ) ) == nil ) mem_err();
1767+
if ( ! err && ( buf = (char *) malloc( (size_t)size + 1 ) ) == nil ) mem_err();
17731768
if ( ! err ) {
17741769
if ( in_context->from == -1 ) {
17751770
if ( ( fd = open( in_avl->filename, READFLAGS, 0 ) ) == -1 ) open_err( in_avl->filename );
@@ -1783,40 +1778,37 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
17831778

17841779
i = 0;
17851780
bytes = in_avl->file_size;
1781+
len = strlen(in_avl->filename);
17861782
do {
1787-
if ((int)(n = read(fd, buf + i, min(bytes, size - i))) < 0) {
1783+
n = read(fd, buf + i, min(bytes, size - i));
1784+
if ((signed)n < 0) {
17881785
read_err();
17891786
break;
17901787
}
1791-
if (n == 0) {
1792-
if (i) {
1793-
if (write(in_context->xiso, buf, i) != i) {
1794-
write_err();
1795-
break;
1796-
}
1797-
}
1788+
else if (n == 0) { // End of file
1789+
if (i && write(in_context->xiso, buf, i) != i) write_err(); // Write remaining 'i' bytes
17981790
break;
17991791
}
18001792
bytes -= n;
1801-
if (s_media_enable && (len = strlen(in_avl->filename)) >= 4 && strcasecmp(&in_avl->filename[len - 4], ".xbe") == 0) {
1793+
if (s_media_enable && len >= 4 && strcasecmp(&in_avl->filename[len - 4], ".xbe") == 0) {
18021794
for (buf[n += i] = 0, p = buf; (p = boyer_moore_search(p, n - (long)(p - buf))) != nil; p += XISO_MEDIA_ENABLE_LENGTH) p[XISO_MEDIA_ENABLE_BYTE_POS] = XISO_MEDIA_ENABLE_BYTE;
18031795
if (bytes) {
18041796
i = XISO_MEDIA_ENABLE_LENGTH - 1;
1805-
if (write(in_context->xiso, buf, n - i) != (int)n - i) {
1797+
if (write(in_context->xiso, buf, n - i) != (signed)n - i) {
18061798
write_err();
18071799
break;
18081800
}
18091801
memcpy(buf, &buf[n - i], i);
18101802
}
18111803
else {
1812-
if (write(in_context->xiso, buf, n + i) != (int)n + i) {
1804+
if (write(in_context->xiso, buf, n + i) != (signed)n + i) {
18131805
write_err();
18141806
break;
18151807
}
18161808
}
18171809
}
18181810
else {
1819-
if (write(in_context->xiso, buf, n + i) != (int)n + i) {
1811+
if (write(in_context->xiso, buf, n + i) != (signed)n + i) {
18201812
write_err();
18211813
break;
18221814
}
@@ -1825,9 +1817,12 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
18251817
i = in_avl->file_size;
18261818
in_avl->file_size -= bytes;
18271819

1828-
if (!err && (bytes = (XISO_SECTOR_SIZE - (in_avl->file_size % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE)) {
1829-
memset(buf, XISO_PAD_BYTE, bytes);
1830-
if (write(in_context->xiso, buf, bytes) != (int)bytes) write_err();
1820+
if (!err) {
1821+
bytes = (XISO_SECTOR_SIZE - (in_avl->file_size % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE;
1822+
if (bytes) {
1823+
memset(buf, XISO_PAD_BYTE, bytes);
1824+
if (write(in_context->xiso, buf, bytes) != (signed)bytes) write_err();
1825+
}
18311826
}
18321827
exiso_log(err ? "failed" : "[OK]");
18331828

@@ -1852,12 +1847,12 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
18521847

18531848
int write_directory( dir_node_avl *in_avl, write_tree_context* in_context, int in_depth ) {
18541849
xoff_t pos;
1855-
int err = 0, pad;
18561850
uint16_t l_offset, r_offset;
1857-
uint32_t file_size = in_avl->file_size + (in_avl->subdirectory ? (XISO_SECTOR_SIZE - (in_avl->file_size % XISO_SECTOR_SIZE)) % XISO_SECTOR_SIZE : 0);
1858-
char length = (char)strlen(in_avl->filename);
1859-
char attributes = in_avl->subdirectory ? XISO_ATTRIBUTE_DIR : XISO_ATTRIBUTE_ARC;
1851+
uint32_t file_size = in_avl->subdirectory ? n_sectors(in_avl->file_size) * XISO_SECTOR_SIZE : in_avl->file_size;
1852+
uint8_t length = (uint8_t)strlen(in_avl->filename);
1853+
uint8_t attributes = in_avl->subdirectory ? XISO_ATTRIBUTE_DIR : XISO_ATTRIBUTE_ARC;
18601854
char sector[XISO_SECTOR_SIZE];
1855+
int err = 0, pad;
18611856

18621857
little32( in_avl->file_size );
18631858
little32( in_avl->start_sector );
@@ -1871,7 +1866,8 @@ int write_directory( dir_node_avl *in_avl, write_tree_context* in_context, int i
18711866
memset( sector, XISO_PAD_BYTE, XISO_SECTOR_SIZE );
18721867

18731868
if ( ( pos = lseek( in_context->xiso, 0, SEEK_CUR ) ) == -1 ) seek_err();
1874-
if ( ! err && ( pad = (int) ( (xoff_t) in_avl->offset + in_avl->dir_start - pos ) ) && write( in_context->xiso, sector, pad ) != pad ) write_err();
1869+
if ( ! err ) pad = (int)((xoff_t)in_avl->offset + in_avl->dir_start - pos);
1870+
if ( ! err && write( in_context->xiso, sector, pad ) != pad ) write_err();
18751871
if ( ! err && write( in_context->xiso, &l_offset, XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err();
18761872
if ( ! err && write( in_context->xiso, &r_offset, XISO_TABLE_OFFSET_SIZE ) != XISO_TABLE_OFFSET_SIZE ) write_err();
18771873
if ( ! err && write( in_context->xiso, &in_avl->start_sector, XISO_SECTOR_OFFSET_SIZE ) != XISO_SECTOR_OFFSET_SIZE ) write_err();
@@ -1888,7 +1884,7 @@ int write_directory( dir_node_avl *in_avl, write_tree_context* in_context, int i
18881884

18891885

18901886
int calculate_directory_offsets( dir_node_avl *in_avl, uint32_t *io_current_sector, int in_depth ) {
1891-
wdsafp_context context;
1887+
wdsafp_context context = { 0 };
18921888

18931889
if ( in_avl->subdirectory ) {
18941890
if (in_avl->subdirectory == EMPTY_SUBDIRECTORY) {

0 commit comments

Comments
 (0)