Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
b2a7b81b
Commit
b2a7b81b
authored
Nov 17, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tiff: return meaningful error codes.
parent
26a161a1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
27 deletions
+27
-27
tiff.c
libavcodec/tiff.c
+27
-27
No files found.
libavcodec/tiff.c
View file @
b2a7b81b
...
@@ -112,7 +112,7 @@ static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
...
@@ -112,7 +112,7 @@ static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t *src,
static
int
tiff_unpack_strip
(
TiffContext
*
s
,
uint8_t
*
dst
,
int
stride
,
static
int
tiff_unpack_strip
(
TiffContext
*
s
,
uint8_t
*
dst
,
int
stride
,
const
uint8_t
*
src
,
int
size
,
int
lines
)
const
uint8_t
*
src
,
int
size
,
int
lines
)
{
{
int
c
,
line
,
pixels
,
code
;
int
c
,
line
,
pixels
,
code
,
ret
;
const
uint8_t
*
ssrc
=
src
;
const
uint8_t
*
ssrc
=
src
;
int
width
=
((
s
->
width
*
s
->
bpp
)
+
7
)
>>
3
;
int
width
=
((
s
->
width
*
s
->
bpp
)
+
7
)
>>
3
;
...
@@ -134,7 +134,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -134,7 +134,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
"Uncompressing failed (%lu of %lu) with error %d
\n
"
,
outlen
,
"Uncompressing failed (%lu of %lu) with error %d
\n
"
,
outlen
,
(
unsigned
long
)
width
*
lines
,
ret
);
(
unsigned
long
)
width
*
lines
,
ret
);
av_free
(
zbuf
);
av_free
(
zbuf
);
return
-
1
;
return
AVERROR_UNKNOWN
;
}
}
src
=
zbuf
;
src
=
zbuf
;
for
(
line
=
0
;
line
<
lines
;
line
++
)
{
for
(
line
=
0
;
line
<
lines
;
line
++
)
{
...
@@ -147,9 +147,9 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -147,9 +147,9 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
}
}
#endif
#endif
if
(
s
->
compr
==
TIFF_LZW
)
{
if
(
s
->
compr
==
TIFF_LZW
)
{
if
(
ff_lzw_decode_init
(
s
->
lzw
,
8
,
src
,
size
,
FF_LZW_TIFF
)
<
0
)
{
if
(
(
ret
=
ff_lzw_decode_init
(
s
->
lzw
,
8
,
src
,
size
,
FF_LZW_TIFF
)
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Error initializing LZW decoder
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Error initializing LZW decoder
\n
"
);
return
-
1
;
return
ret
;
}
}
}
}
if
(
s
->
compr
==
TIFF_CCITT_RLE
||
s
->
compr
==
TIFF_G3
if
(
s
->
compr
==
TIFF_CCITT_RLE
||
s
->
compr
==
TIFF_G3
...
@@ -167,7 +167,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -167,7 +167,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Uncompressed fax mode is not supported (yet)
\n
"
);
"Uncompressed fax mode is not supported (yet)
\n
"
);
av_free
(
src2
);
av_free
(
src2
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
!
s
->
fill_order
)
{
if
(
!
s
->
fill_order
)
{
memcpy
(
src2
,
src
,
size
);
memcpy
(
src2
,
src
,
size
);
...
@@ -190,7 +190,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -190,7 +190,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
for
(
line
=
0
;
line
<
lines
;
line
++
)
{
for
(
line
=
0
;
line
<
lines
;
line
++
)
{
if
(
src
-
ssrc
>
size
)
{
if
(
src
-
ssrc
>
size
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Source data overread
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Source data overread
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
switch
(
s
->
compr
)
{
switch
(
s
->
compr
)
{
case
TIFF_RAW
:
case
TIFF_RAW
:
...
@@ -213,7 +213,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -213,7 +213,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
if
(
pixels
+
code
>
width
)
{
if
(
pixels
+
code
>
width
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Copy went out of bounds
\n
"
);
"Copy went out of bounds
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
memcpy
(
dst
+
pixels
,
src
,
code
);
memcpy
(
dst
+
pixels
,
src
,
code
);
src
+=
code
;
src
+=
code
;
...
@@ -223,7 +223,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -223,7 +223,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
if
(
pixels
+
code
>
width
)
{
if
(
pixels
+
code
>
width
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Run went out of bounds
\n
"
);
"Run went out of bounds
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
c
=
*
src
++
;
c
=
*
src
++
;
memset
(
dst
+
pixels
,
c
,
code
);
memset
(
dst
+
pixels
,
c
,
code
);
...
@@ -236,7 +236,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
...
@@ -236,7 +236,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
if
(
pixels
<
width
)
{
if
(
pixels
<
width
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Decoded only %i bytes of %i
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Decoded only %i bytes of %i
\n
"
,
pixels
,
width
);
pixels
,
width
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
break
;
break
;
}
}
...
@@ -308,7 +308,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -308,7 +308,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
const
uint8_t
*
rp
,
*
gp
,
*
bp
;
const
uint8_t
*
rp
,
*
gp
,
*
bp
;
if
(
end_buf
-
buf
<
12
)
if
(
end_buf
-
buf
<
12
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
tag
=
tget_short
(
&
buf
,
s
->
le
);
tag
=
tget_short
(
&
buf
,
s
->
le
);
type
=
tget_short
(
&
buf
,
s
->
le
);
type
=
tget_short
(
&
buf
,
s
->
le
);
count
=
tget_long
(
&
buf
,
s
->
le
);
count
=
tget_long
(
&
buf
,
s
->
le
);
...
@@ -352,7 +352,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -352,7 +352,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
if
(
buf
&&
(
buf
<
start
||
buf
>
end_buf
))
{
if
(
buf
&&
(
buf
<
start
||
buf
>
end_buf
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Tag referencing position outside the image
\n
"
);
"Tag referencing position outside the image
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
switch
(
tag
)
{
switch
(
tag
)
{
...
@@ -368,7 +368,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -368,7 +368,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"This format is not supported (bpp=%d, %d components)
\n
"
,
"This format is not supported (bpp=%d, %d components)
\n
"
,
s
->
bpp
,
count
);
s
->
bpp
,
count
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
count
==
1
)
if
(
count
==
1
)
s
->
bpp
=
value
;
s
->
bpp
=
value
;
...
@@ -418,17 +418,17 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -418,17 +418,17 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
break
;
break
;
#else
#else
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Deflate: ZLib not compiled in
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Deflate: ZLib not compiled in
\n
"
);
return
-
1
;
return
AVERROR
(
ENOSYS
)
;
#endif
#endif
case
TIFF_JPEG
:
case
TIFF_JPEG
:
case
TIFF_NEWJPEG
:
case
TIFF_NEWJPEG
:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"JPEG compression is not supported
\n
"
);
"JPEG compression is not supported
\n
"
);
return
-
1
;
return
AVERROR_PATCHWELCOME
;
default:
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Unknown compression method %i
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Unknown compression method %i
\n
"
,
s
->
compr
);
s
->
compr
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
break
;
break
;
case
TIFF_ROWSPERSTRIP
:
case
TIFF_ROWSPERSTRIP
:
...
@@ -437,7 +437,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -437,7 +437,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
if
(
value
<
1
)
{
if
(
value
<
1
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Incorrect value of rows per strip
\n
"
);
"Incorrect value of rows per strip
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
s
->
rps
=
value
;
s
->
rps
=
value
;
break
;
break
;
...
@@ -454,7 +454,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -454,7 +454,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
if
(
s
->
stripdata
>
end_buf
)
{
if
(
s
->
stripdata
>
end_buf
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Tag referencing position outside the image
\n
"
);
"Tag referencing position outside the image
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
break
;
break
;
case
TIFF_STRIP_SIZE
:
case
TIFF_STRIP_SIZE
:
...
@@ -470,7 +470,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -470,7 +470,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
if
(
s
->
stripsizes
>
end_buf
)
{
if
(
s
->
stripsizes
>
end_buf
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Tag referencing position outside the image
\n
"
);
"Tag referencing position outside the image
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
break
;
break
;
case
TIFF_PREDICTOR
:
case
TIFF_PREDICTOR
:
...
@@ -490,7 +490,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -490,7 +490,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
default:
default:
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Color mode %d is not supported
\n
"
,
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Color mode %d is not supported
\n
"
,
value
);
value
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
break
;
break
;
case
TIFF_FILL_ORDER
:
case
TIFF_FILL_ORDER
:
...
@@ -505,7 +505,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -505,7 +505,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
pal
=
(
uint32_t
*
)
s
->
palette
;
pal
=
(
uint32_t
*
)
s
->
palette
;
off
=
type_sizes
[
type
];
off
=
type_sizes
[
type
];
if
(
count
/
3
>
256
||
end_buf
-
buf
<
count
/
3
*
off
*
3
)
if
(
count
/
3
>
256
||
end_buf
-
buf
<
count
/
3
*
off
*
3
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
rp
=
buf
;
rp
=
buf
;
gp
=
buf
+
count
/
3
*
off
;
gp
=
buf
+
count
/
3
*
off
;
bp
=
buf
+
count
/
3
*
off
*
2
;
bp
=
buf
+
count
/
3
*
off
*
2
;
...
@@ -521,7 +521,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
...
@@ -521,7 +521,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start,
case
TIFF_PLANAR
:
case
TIFF_PLANAR
:
if
(
value
==
2
)
{
if
(
value
==
2
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Planar format is not supported
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Planar format is not supported
\n
"
);
return
-
1
;
return
AVERROR_PATCHWELCOME
;
}
}
break
;
break
;
case
TIFF_T4OPTIONS
:
case
TIFF_T4OPTIONS
:
...
@@ -566,7 +566,7 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -566,7 +566,7 @@ static int decode_frame(AVCodecContext *avctx,
le
=
0
;
le
=
0
;
else
{
else
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"TIFF header not found
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"TIFF header not found
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
s
->
le
=
le
;
s
->
le
=
le
;
s
->
invert
=
0
;
s
->
invert
=
0
;
...
@@ -577,7 +577,7 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -577,7 +577,7 @@ static int decode_frame(AVCodecContext *avctx,
if
(
tget_short
(
&
buf
,
le
)
!=
42
)
{
if
(
tget_short
(
&
buf
,
le
)
!=
42
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"The answer to life, universe and everything is not correct!
\n
"
);
"The answer to life, universe and everything is not correct!
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
// Reset these pointers so we can tell if they were set this frame
// Reset these pointers so we can tell if they were set this frame
s
->
stripsizes
=
s
->
stripdata
=
NULL
;
s
->
stripsizes
=
s
->
stripdata
=
NULL
;
...
@@ -590,13 +590,13 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -590,13 +590,13 @@ static int decode_frame(AVCodecContext *avctx,
buf
=
orig_buf
+
off
;
buf
=
orig_buf
+
off
;
entries
=
tget_short
(
&
buf
,
le
);
entries
=
tget_short
(
&
buf
,
le
);
for
(
i
=
0
;
i
<
entries
;
i
++
)
{
for
(
i
=
0
;
i
<
entries
;
i
++
)
{
if
(
tiff_decode_tag
(
s
,
orig_buf
,
buf
,
end_buf
)
<
0
)
if
(
(
ret
=
tiff_decode_tag
(
s
,
orig_buf
,
buf
,
end_buf
)
)
<
0
)
return
-
1
;
return
ret
;
buf
+=
12
;
buf
+=
12
;
}
}
if
(
!
s
->
stripdata
&&
!
s
->
stripoff
)
{
if
(
!
s
->
stripdata
&&
!
s
->
stripoff
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Image data is missing
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Image data is missing
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
/* now we have the data and may start decoding */
/* now we have the data and may start decoding */
if
((
ret
=
init_image
(
s
))
<
0
)
if
((
ret
=
init_image
(
s
))
<
0
)
...
@@ -625,7 +625,7 @@ static int decode_frame(AVCodecContext *avctx,
...
@@ -625,7 +625,7 @@ static int decode_frame(AVCodecContext *avctx,
if
(
soff
>
buf_size
||
ssize
>
buf_size
-
soff
)
{
if
(
soff
>
buf_size
||
ssize
>
buf_size
-
soff
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid strip size/offset
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid strip size/offset
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
tiff_unpack_strip
(
s
,
dst
,
stride
,
orig_buf
+
soff
,
ssize
,
if
(
tiff_unpack_strip
(
s
,
dst
,
stride
,
orig_buf
+
soff
,
ssize
,
FFMIN
(
s
->
rps
,
s
->
height
-
i
))
<
0
)
FFMIN
(
s
->
rps
,
s
->
height
-
i
))
<
0
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment