-
Notifications
You must be signed in to change notification settings - Fork 0
/
ValidJpeg.cc
121 lines (101 loc) · 1.88 KB
/
ValidJpeg.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "ValidJpeg.hh"
#include <arpa/inet.h>
bool valid_jpeg_debug = false;
static void debug(const char * msg)
{
if (valid_jpeg_debug)
puts(msg);
}
bool ValidJpeg::open( const char * fn )
{
if (fh != 0)
fclose (fh);
fh = fopen( fn, "r" );
if (fh == 0)
return false;
else
return true;
}
int ValidJpeg::short_jpeg ()
{
if( fseek(fh,-2,SEEK_END) )
return -1;
unsigned char bytes[2];
int n_read = fread(bytes, 1, 2, fh);
if ( (n_read==2) and (bytes[0]==0xff) and (bytes[1]==0xd9) )
return 0;
return 1;
}
int ValidJpeg::valid_jpeg (bool seek_over_entropy)
{
char in_entropy=0;
while (! feof(fh))
{
unsigned char marker=0;
if ( fread(&marker, 1, 1, fh) < 1 )
return short_file;
if (marker != 0xff)
{
if (! in_entropy)
return missing_ff;
continue;
}
if ( fread(&marker, 1, 1, fh) < 1 )
return short_file;
if (marker != 0)
{
in_entropy = 0;
}
else
{
if (! in_entropy)
return stray_0;
continue;
}
if (marker == 0xd8)
debug("got start");
else if (marker == 0xd9)
{
unsigned char junk;
fread(&junk, 1, 1, fh);
if (feof(fh))
return ok;
else
return trailing_junk;
}
else if ( (marker >= 0xd0) && (marker <= 0xd7) )
debug("got RST");
else
{
unsigned short length;
if (marker == 0xda) {
if ( seek_over_entropy )
{
if( fseek(fh,-2,SEEK_END) )
return -1;
else
continue;
}
else
{
in_entropy = 1;
}
}
fread(&length, 2, 1, fh);
length = ntohs(length);
if (valid_jpeg_debug) printf ("Length is %d\n", length);
#if 1
if (length > 512)
fseek(fh,length-2,SEEK_CUR);
else
#endif
for (int j=2; j<length; ++j)
{
char junk;
if ( fread(&junk, 1, 1, fh) < 1 )
return short_file;
}
}
}
return short_file;
}