Coverage Report

Created: 2026-10-31 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/fofi/FoFiBase.cc
Line
Count
Source
1
//========================================================================
2
//
3
// FoFiBase.cc
4
//
5
// Copyright 1999-2003 Glyph & Cog, LLC
6
//
7
//========================================================================
8
9
#include <aconf.h>
10
11
#include <stdio.h>
12
#include <limits.h>
13
#include "gmem.h"
14
#include "gmempp.h"
15
#include "FoFiBase.h"
16
17
//------------------------------------------------------------------------
18
// FoFiBase
19
//------------------------------------------------------------------------
20
21
19.2k
FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) {
22
19.2k
  fileData = file = (Guchar *)fileA;
23
19.2k
  len = lenA;
24
19.2k
  freeFileData = freeFileDataA;
25
19.2k
}
26
27
19.2k
FoFiBase::~FoFiBase() {
28
19.2k
  if (freeFileData) {
29
11.6k
    gfree(fileData);
30
11.6k
  }
31
19.2k
}
32
33
10.5k
char *FoFiBase::readFile(char *fileName, int *fileLen) {
34
10.5k
  FILE *f;
35
10.5k
  char *buf;
36
10.5k
  int n;
37
38
10.5k
  if (!(f = fopen(fileName, "rb"))) {
39
0
    return NULL;
40
0
  }
41
10.5k
  fseek(f, 0, SEEK_END);
42
10.5k
  n = (int)ftell(f);
43
10.5k
  if (n < 0) {
44
0
    fclose(f);
45
0
    return NULL;
46
0
  }
47
10.5k
  fseek(f, 0, SEEK_SET);
48
10.5k
  buf = (char *)gmalloc(n);
49
10.5k
  if ((int)fread(buf, 1, n, f) != n) {
50
0
    gfree(buf);
51
0
    fclose(f);
52
0
    return NULL;
53
0
  }
54
10.5k
  fclose(f);
55
10.5k
  *fileLen = n;
56
10.5k
  return buf;
57
10.5k
}
58
59
0
int FoFiBase::getS8(int pos, GBool *ok) {
60
0
  int x;
61
62
0
  if (pos < 0 || pos >= len) {
63
0
    *ok = gFalse;
64
0
    return 0;
65
0
  }
66
0
  x = file[pos];
67
0
  if (x & 0x80) {
68
0
    x |= ~0xff;
69
0
  }
70
0
  return x;
71
0
}
72
73
739M
int FoFiBase::getU8(int pos, GBool *ok) {
74
739M
  if (pos < 0 || pos >= len) {
75
557M
    *ok = gFalse;
76
557M
    return 0;
77
557M
  }
78
182M
  return file[pos];
79
739M
}
80
81
34.1k
int FoFiBase::getS16BE(int pos, GBool *ok) {
82
34.1k
  int x;
83
84
34.1k
  if (pos < 0 || pos > INT_MAX - 1 || pos+1 >= len) {
85
50
    *ok = gFalse;
86
50
    return 0;
87
50
  }
88
34.1k
  x = file[pos];
89
34.1k
  x = (x << 8) + file[pos+1];
90
34.1k
  if (x & 0x8000) {
91
10.3k
    x |= ~0xffff;
92
10.3k
  }
93
34.1k
  return x;
94
34.1k
}
95
96
12.9M
int FoFiBase::getU16BE(int pos, GBool *ok) {
97
12.9M
  int x;
98
99
12.9M
  if (pos < 0 || pos > INT_MAX - 1 || pos+1 >= len) {
100
1.03M
    *ok = gFalse;
101
1.03M
    return 0;
102
1.03M
  }
103
11.8M
  x = file[pos];
104
11.8M
  x = (x << 8) + file[pos+1];
105
11.8M
  return x;
106
12.9M
}
107
108
0
int FoFiBase::getS32BE(int pos, GBool *ok) {
109
0
  int x;
110
111
0
  if (pos < 0 || pos > INT_MAX - 3 || pos+3 >= len) {
112
0
    *ok = gFalse;
113
0
    return 0;
114
0
  }
115
0
  x = file[pos];
116
0
  x = (x << 8) + file[pos+1];
117
0
  x = (x << 8) + file[pos+2];
118
0
  x = (x << 8) + file[pos+3];
119
0
  if (x & 0x80000000) {
120
0
    x |= ~0xffffffff;
121
0
  }
122
0
  return x;
123
0
}
124
125
9.37M
Guint FoFiBase::getU32BE(int pos, GBool *ok) {
126
9.37M
  Guint x;
127
128
9.37M
  if (pos < 0 || pos > INT_MAX - 3 || pos+3 >= len) {
129
383k
    *ok = gFalse;
130
383k
    return 0;
131
383k
  }
132
8.99M
  x = file[pos];
133
8.99M
  x = (x << 8) + file[pos+1];
134
8.99M
  x = (x << 8) + file[pos+2];
135
8.99M
  x = (x << 8) + file[pos+3];
136
8.99M
  return x;
137
9.37M
}
138
139
1.06k
Guint FoFiBase::getU32LE(int pos, GBool *ok) {
140
1.06k
  Guint x;
141
142
1.06k
  if (pos < 0 || pos > INT_MAX - 3 || pos+3 >= len) {
143
0
    *ok = gFalse;
144
0
    return 0;
145
0
  }
146
1.06k
  x = file[pos+3];
147
1.06k
  x = (x << 8) + file[pos+2];
148
1.06k
  x = (x << 8) + file[pos+1];
149
1.06k
  x = (x << 8) + file[pos];
150
1.06k
  return x;
151
1.06k
}
152
153
2.93M
Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) {
154
2.93M
  Guint x;
155
2.93M
  int i;
156
157
2.93M
  if (pos < 0 || pos > INT_MAX - size || pos + size > len) {
158
22.8k
    *ok = gFalse;
159
22.8k
    return 0;
160
22.8k
  }
161
2.90M
  x = 0;
162
12.5M
  for (i = 0; i < size; ++i) {
163
9.60M
    x = (x << 8) + file[pos + i];
164
9.60M
  }
165
2.90M
  return x;
166
2.93M
}
167
168
1.54M
GBool FoFiBase::checkRegion(int pos, int size) {
169
1.54M
  return pos >= 0 &&
170
1.54M
         size >= 0 &&
171
1.54M
         size <= INT_MAX - pos &&
172
1.47M
         pos + size <= len;
173
1.54M
}