Coverage Report

Created: 2025-10-13 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/lzma-fuzz/sdk/C/Bra86.c
Line
Count
Source
1
/* Bra86.c -- Converter for x86 code (BCJ)
2
2017-04-03 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include "Bra.h"
7
8
7.48M
#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0)
9
10
SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding)
11
21.7k
{
12
21.7k
  SizeT pos = 0;
13
21.7k
  UInt32 mask = *state & 7;
14
21.7k
  if (size < 5)
15
8.89k
    return 0;
16
12.8k
  size -= 4;
17
12.8k
  ip += 5;
18
19
12.8k
  for (;;)
20
19.8M
  {
21
19.8M
    Byte *p = data + pos;
22
19.8M
    const Byte *limit = data + size;
23
221M
    for (; p < limit; p++)
24
221M
      if ((*p & 0xFE) == 0xE8)
25
19.7M
        break;
26
27
19.8M
    {
28
19.8M
      SizeT d = (SizeT)(p - data - pos);
29
19.8M
      pos = (SizeT)(p - data);
30
19.8M
      if (p >= limit)
31
12.8k
      {
32
12.8k
        *state = (d > 2 ? 0 : mask >> (unsigned)d);
33
12.8k
        return pos;
34
12.8k
      }
35
19.7M
      if (d > 2)
36
1.76M
        mask = 0;
37
18.0M
      else
38
18.0M
      {
39
18.0M
        mask >>= (unsigned)d;
40
18.0M
        if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1])))
41
13.6M
        {
42
13.6M
          mask = (mask >> 1) | 4;
43
13.6M
          pos++;
44
13.6M
          continue;
45
13.6M
        }
46
18.0M
      }
47
19.7M
    }
48
49
6.14M
    if (Test86MSByte(p[4]))
50
4.36M
    {
51
4.36M
      UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]);
52
4.36M
      UInt32 cur = ip + (UInt32)pos;
53
4.36M
      pos += 5;
54
4.36M
      if (encoding)
55
2.17M
        v += cur;
56
2.18M
      else
57
2.18M
        v -= cur;
58
4.36M
      if (mask != 0)
59
380k
      {
60
380k
        unsigned sh = (mask & 6) << 2;
61
380k
        if (Test86MSByte((Byte)(v >> sh)))
62
5.83k
        {
63
5.83k
          v ^= (((UInt32)0x100 << sh) - 1);
64
5.83k
          if (encoding)
65
2.76k
            v += cur;
66
3.07k
          else
67
3.07k
            v -= cur;
68
5.83k
        }
69
380k
        mask = 0;
70
380k
      }
71
4.36M
      p[1] = (Byte)v;
72
4.36M
      p[2] = (Byte)(v >> 8);
73
4.36M
      p[3] = (Byte)(v >> 16);
74
4.36M
      p[4] = (Byte)(0 - ((v >> 24) & 1));
75
4.36M
    }
76
1.78M
    else
77
1.78M
    {
78
1.78M
      mask = (mask >> 1) | 4;
79
1.78M
      pos++;
80
1.78M
    }
81
6.14M
  }
82
12.8k
}