]> sigrok.org Git - libsigrokdecode.git/commitdiff
Fix three -fsanitize=undefined issues.
authorUwe Hermann <redacted>
Sat, 23 Nov 2019 16:45:23 +0000 (17:45 +0100)
committerUwe Hermann <redacted>
Sat, 23 Nov 2019 17:13:04 +0000 (18:13 +0100)
  instance.c:62:2: runtime error: null pointer passed as argument 1, which is declared to never be null
  instance.c:858:45: runtime error: shift exponent -1 is negative
  instance.c:836:45: runtime error: shift exponent -1 is negative

instance.c

index 2859493194d724f7ea775cead7e6cba740742808..36fb2d0c32889b609712ba6dc2f42a00f1aecda2 100644 (file)
@@ -59,7 +59,8 @@ static void oldpins_array_seed(struct srd_decoder_inst *di)
        count = di->dec_num_channels;
        arr = g_array_sized_new(FALSE, TRUE, sizeof(uint8_t), count);
        g_array_set_size(arr, count);
        count = di->dec_num_channels;
        arr = g_array_sized_new(FALSE, TRUE, sizeof(uint8_t), count);
        g_array_set_size(arr, count);
-       memset(arr->data, SRD_INITIAL_PIN_SAME_AS_SAMPLE0, count);
+       if (arr->data)
+               memset(arr->data, SRD_INITIAL_PIN_SAME_AS_SAMPLE0, count);
        di->old_pins_array = arr;
 }
 
        di->old_pins_array = arr;
 }
 
@@ -831,6 +832,8 @@ static void update_old_pins_array(struct srd_decoder_inst *di,
 
        oldpins_array_seed(di);
        for (i = 0; i < di->dec_num_channels; i++) {
 
        oldpins_array_seed(di);
        for (i = 0; i < di->dec_num_channels; i++) {
+               if (di->dec_channelmap[i] == -1)
+                       continue; /* Ignore unused optional channels. */
                byte_offset = di->dec_channelmap[i] / 8;
                bit_offset = di->dec_channelmap[i] % 8;
                sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0;
                byte_offset = di->dec_channelmap[i] / 8;
                bit_offset = di->dec_channelmap[i] % 8;
                sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0;
@@ -853,6 +856,8 @@ static void update_old_pins_array_initial_pins(struct srd_decoder_inst *di)
        for (i = 0; i < di->dec_num_channels; i++) {
                if (di->old_pins_array->data[i] != SRD_INITIAL_PIN_SAME_AS_SAMPLE0)
                        continue;
        for (i = 0; i < di->dec_num_channels; i++) {
                if (di->old_pins_array->data[i] != SRD_INITIAL_PIN_SAME_AS_SAMPLE0)
                        continue;
+               if (di->dec_channelmap[i] == -1)
+                       continue; /* Ignore unused optional channels. */
                byte_offset = di->dec_channelmap[i] / 8;
                bit_offset = di->dec_channelmap[i] % 8;
                sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0;
                byte_offset = di->dec_channelmap[i] / 8;
                bit_offset = di->dec_channelmap[i] % 8;
                sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0;