2
2
#include <ctype.h>
3
3
#include <string.h>
4
4
#include <stdio.h>
5
+ #include "utils.h"
5
6
#include "bamlite.h"
6
7
7
8
/*********************
@@ -53,7 +54,7 @@ int bam_is_be;
53
54
bam_header_t * bam_header_init ()
54
55
{
55
56
bam_is_be = bam_is_big_endian ();
56
- return (bam_header_t * )calloc (1 , sizeof (bam_header_t ));
57
+ return (bam_header_t * )xcalloc (1 , sizeof (bam_header_t ));
57
58
}
58
59
59
60
void bam_header_destroy (bam_header_t * header )
@@ -62,11 +63,11 @@ void bam_header_destroy(bam_header_t *header)
62
63
if (header == 0 ) return ;
63
64
if (header -> target_name ) {
64
65
for (i = 0 ; i < header -> n_targets ; ++ i )
65
- free (header -> target_name [i ]);
66
+ if (header -> target_name [i ]) free (header -> target_name [i ]);
67
+ if (header -> target_len ) free (header -> target_len );
66
68
free (header -> target_name );
67
- free (header -> target_len );
68
69
}
69
- free (header -> text );
70
+ if ( header -> text ) free (header -> text );
70
71
free (header );
71
72
}
72
73
@@ -80,28 +81,33 @@ bam_header_t *bam_header_read(bamFile fp)
80
81
magic_len = bam_read (fp , buf , 4 );
81
82
if (magic_len != 4 || strncmp (buf , "BAM\001" , 4 ) != 0 ) {
82
83
fprintf (stderr , "[bam_header_read] invalid BAM binary header (this is not a BAM file).\n" );
83
- return 0 ;
84
+ return NULL ;
84
85
}
85
86
header = bam_header_init ();
86
87
// read plain text and the number of reference sequences
87
- bam_read (fp , & header -> l_text , 4 );
88
+ if ( bam_read (fp , & header -> l_text , 4 ) != 4 ) goto fail ;
88
89
if (bam_is_be ) bam_swap_endian_4p (& header -> l_text );
89
- header -> text = (char * )calloc (header -> l_text + 1 , 1 );
90
- bam_read (fp , header -> text , header -> l_text );
91
- bam_read (fp , & header -> n_targets , 4 );
90
+ header -> text = (char * )xcalloc (header -> l_text + 1 , 1 );
91
+ if ( bam_read (fp , header -> text , header -> l_text ) != header -> l_text ) goto fail ;
92
+ if ( bam_read (fp , & header -> n_targets , 4 ) != 4 ) goto fail ;
92
93
if (bam_is_be ) bam_swap_endian_4p (& header -> n_targets );
93
94
// read reference sequence names and lengths
94
- header -> target_name = (char * * )calloc (header -> n_targets , sizeof (char * ));
95
- header -> target_len = (uint32_t * )calloc (header -> n_targets , 4 );
95
+ header -> target_name = (char * * )xcalloc (header -> n_targets , sizeof (char * ));
96
+ header -> target_len = (uint32_t * )xcalloc (header -> n_targets , 4 );
96
97
for (i = 0 ; i != header -> n_targets ; ++ i ) {
97
- bam_read (fp , & name_len , 4 );
98
+ if ( bam_read (fp , & name_len , 4 ) != 4 ) goto fail ;
98
99
if (bam_is_be ) bam_swap_endian_4p (& name_len );
99
- header -> target_name [i ] = (char * )calloc (name_len , 1 );
100
- bam_read (fp , header -> target_name [i ], name_len );
101
- bam_read (fp , & header -> target_len [i ], 4 );
100
+ header -> target_name [i ] = (char * )xcalloc (name_len , 1 );
101
+ if (bam_read (fp , header -> target_name [i ], name_len ) != name_len ) {
102
+ goto fail ;
103
+ }
104
+ if (bam_read (fp , & header -> target_len [i ], 4 ) != 4 ) goto fail ;
102
105
if (bam_is_be ) bam_swap_endian_4p (& header -> target_len [i ]);
103
106
}
104
107
return header ;
108
+ fail :
109
+ bam_header_destroy (header );
110
+ return NULL ;
105
111
}
106
112
107
113
static void swap_endian_data (const bam1_core_t * c , int data_len , uint8_t * data )
@@ -146,7 +152,7 @@ int bam_read1(bamFile fp, bam1_t *b)
146
152
if (b -> m_data < b -> data_len ) {
147
153
b -> m_data = b -> data_len ;
148
154
kroundup32 (b -> m_data );
149
- b -> data = (uint8_t * )realloc (b -> data , b -> m_data );
155
+ b -> data = (uint8_t * )xrealloc (b -> data , b -> m_data );
150
156
}
151
157
if (bam_read (fp , b -> data , b -> data_len ) != b -> data_len ) return -4 ;
152
158
b -> l_aux = b -> data_len - c -> n_cigar * 4 - c -> l_qname - c -> l_qseq - (c -> l_qseq + 1 )/2 ;
0 commit comments