Skip to content

Commit 9e01511

Browse files
sirus20x6pd3
authored andcommitted
Fix three bugs in vcfmerge FORMAT field handling
1. merge_localized_numberG_format_field: BCF_BT_INT32 case incorrectly used le_to_i16 instead of le_to_i32, causing wrong byte conversion for 32-bit integer FORMAT fields. 2. init_local_alleles: INT8 PL case lacked bounds checking on val before indexing into pl2prob[], risking out-of-bounds access. Added the same clamping guard (val>=0 && val<PL2PROB_MAX) already present in the INT16 and INT32 cases. 3. update_local_alleles: vector_end padding loop wrote to src[j] instead of dst[j], leaving the destination buffer with uninitialized trailing entries.
1 parent 78c13cd commit 9e01511

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

vcfmerge.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,7 +1653,7 @@ void init_local_alleles(args_t *args, bcf1_t *out, int ifmt_PL)
16531653
}
16541654
switch (fmt_ori->type)
16551655
{
1656-
case BCF_BT_INT8: BRANCH( int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, val); break;
1656+
case BCF_BT_INT8: BRANCH( int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break;
16571657
case BCF_BT_INT16: BRANCH(int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break;
16581658
case BCF_BT_INT32: BRANCH(int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, val>=0 && val<PL2PROB_MAX ? val : PL2PROB_MAX-1); break;
16591659
default: error("Unexpected case: %d, PL\n", fmt_ori->type);
@@ -1689,7 +1689,7 @@ void update_local_alleles(args_t *args, bcf1_t *out)
16891689
}
16901690
}
16911691
if ( j==0 ) dst[j++] = bcf_int32_missing;
1692-
for (; j<ma->nlaa; j++) src[j] = bcf_int32_vector_end;
1692+
for (; j<ma->nlaa; j++) dst[j] = bcf_int32_vector_end;
16931693
ismpl++;
16941694
}
16951695
}
@@ -2014,7 +2014,7 @@ void merge_localized_numberG_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf
20142014
{
20152015
case BCF_BT_INT8: BRANCH(int32_t, int8_t, le_to_i8, val==bcf_int8_missing, val==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break;
20162016
case BCF_BT_INT16: BRANCH(int32_t, int16_t, le_to_i16, val==bcf_int16_missing, val==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break;
2017-
case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i16, val==bcf_int32_missing, val==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break;
2017+
case BCF_BT_INT32: BRANCH(int32_t, int32_t, le_to_i32, val==bcf_int32_missing, val==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break;
20182018
case BCF_BT_FLOAT: BRANCH(float, float, le_to_float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break;
20192019
default: error("Unexpected case: %d, %s\n", fmt_ori->type, key);
20202020
}

0 commit comments

Comments
 (0)