Skip to content

Commit 96ed432

Browse files
authored
* Validate dimensions in the SIZ marker segment after reading it from a codestream (#253)
Validate SIZ marker segment content after reading it from a codestream.
1 parent 9c4961b commit 96ed432

6 files changed

Lines changed: 101 additions & 44 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -232,24 +232,11 @@ install(FILES "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc"
232232
)
233233

234234
################################################################################################
235-
# Testing (OJPH_BUILD_TESTS)
235+
# Testing and fuzzing (OJPH_BUILD_TESTS)
236236
################################################################################################
237237

238238
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND OJPH_BUILD_TESTS)
239239
enable_testing()
240240
add_subdirectory(tests)
241-
endif()
242-
243-
################################################################################################
244-
# Fuzzing
245-
################################################################################################
246-
247-
if(OJPH_BUILD_FUZZER)
248-
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
249-
message(FATAL_ERROR "Fuzzing requires a Clang toolchain.")
250-
endif()
251-
252-
message(STATUS "Building fuzzer target")
253-
254241
add_subdirectory(fuzzing)
255-
endif()
242+
endif()

fuzzing/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
link_libraries($ENV{LIB_FUZZING_ENGINE})
1+
if(DEFINED ENV{LIB_FUZZING_ENGINE})
2+
link_libraries($ENV{LIB_FUZZING_ENGINE})
3+
else()
4+
add_compile_definitions(OJPH_FUZZ_TARGET_MAIN)
5+
endif()
26

37
add_executable(ojph_expand_fuzz_target fuzz_targets/ojph_expand_fuzz_target.cpp)
48
target_link_libraries(ojph_expand_fuzz_target PRIVATE openjph)

fuzzing/fuzz_targets/ojph_expand_fuzz_target.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@
3333
// Date: 17 February 2026
3434
//***************************************************************************/
3535

36-
#include <unistd.h>
37-
#include <stdlib.h>
3836
#include <cstdint>
37+
#include <cstdio>
38+
#include <cstdlib>
39+
#include <vector>
3940

4041
#include <ojph_arch.h>
4142
#include <ojph_file.h>
@@ -94,3 +95,27 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
9495
}
9596
return 0;
9697
}
98+
99+
#ifdef OJPH_FUZZ_TARGET_MAIN
100+
int main(int argc, char **argv) {
101+
if (argc != 2) {
102+
return -1;
103+
}
104+
FILE *f = fopen(argv[1], "rb");
105+
if (!f) { return -1; }
106+
fseek(f, 0, SEEK_END);
107+
long len = ftell(f);
108+
if (len < 0) {
109+
return -1;
110+
}
111+
rewind(f);
112+
std::vector<uint8_t> buf(len);
113+
size_t n = fread(buf.data(), 1, len, f);
114+
if(n != static_cast<size_t>(len)) {
115+
return -1;
116+
}
117+
fclose(f);
118+
LLVMFuzzerTestOneInput(buf.data(), buf.size());
119+
return 0;
120+
}
121+
#endif

src/core/codestream/ojph_codestream_local.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,15 @@ namespace ojph {
548548
ui32 num_comments)
549549
{
550550
//finalize
551-
siz.check_validity(cod);
551+
siz.set_cod(cod);
552+
// set the tile size if it was not set by the user
553+
size tile_size = siz.get_tile_size();
554+
if (tile_size.h == 0 && tile_size.w == 0)
555+
{
556+
point img_offset = siz.get_image_offset();
557+
siz.set_tile_size(size(tile_size.w + img_offset.x, tile_size.h + img_offset.y));
558+
}
559+
siz.check_validity();
552560
cod.check_validity(siz);
553561
cod.update_atk(&atk);
554562
qcd.check_validity(siz, cod);

src/core/codestream/ojph_params.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -58,29 +58,25 @@ namespace ojph {
5858
////////////////////////////////////////////////////////////////////////////
5959
void param_siz::set_image_extent(point dims)
6060
{
61-
state->Xsiz = dims.x;
62-
state->Ysiz = dims.y;
61+
state->set_image_extent(dims);
6362
}
6463

6564
////////////////////////////////////////////////////////////////////////////
6665
void param_siz::set_tile_size(size s)
6766
{
68-
state->XTsiz = s.w;
69-
state->YTsiz = s.h;
67+
state->set_tile_size(s);
7068
}
7169

7270
////////////////////////////////////////////////////////////////////////////
7371
void param_siz::set_image_offset(point offset)
74-
{ // WARNING need to check if these are valid
75-
state->XOsiz = offset.x;
76-
state->YOsiz = offset.y;
72+
{
73+
state->set_image_offset(offset);
7774
}
7875

7976
////////////////////////////////////////////////////////////////////////////
8077
void param_siz::set_tile_offset(point offset)
81-
{ // WARNING need to check if these are valid
82-
state->XTOsiz = offset.x;
83-
state->YTOsiz = offset.y;
78+
{
79+
state->set_tile_offset(offset);
8480
}
8581

8682
////////////////////////////////////////////////////////////////////////////
@@ -703,24 +699,24 @@ namespace ojph {
703699
if (file->read(&Ysiz, 4) != 4)
704700
OJPH_ERROR(0x00050046, "error reading SIZ marker");
705701
Ysiz = swap_byte(Ysiz);
706-
if (file->read(&XOsiz, 4) != 4)
702+
ui32 t_XOsiz, t_YOsiz;
703+
if (file->read(&t_XOsiz, 4) != 4)
707704
OJPH_ERROR(0x00050047, "error reading SIZ marker");
708-
XOsiz = swap_byte(XOsiz);
709-
if (file->read(&YOsiz, 4) != 4)
705+
if (file->read(&t_YOsiz, 4) != 4)
710706
OJPH_ERROR(0x00050048, "error reading SIZ marker");
711-
YOsiz = swap_byte(YOsiz);
712-
if (file->read(&XTsiz, 4) != 4)
707+
set_image_offset(point(swap_byte(t_XOsiz), swap_byte(t_YOsiz)));
708+
ui32 t_XTsiz, t_YTsiz;
709+
if (file->read(&t_XTsiz, 4) != 4)
713710
OJPH_ERROR(0x00050049, "error reading SIZ marker");
714-
XTsiz = swap_byte(XTsiz);
715-
if (file->read(&YTsiz, 4) != 4)
711+
if (file->read(&t_YTsiz, 4) != 4)
716712
OJPH_ERROR(0x0005004A, "error reading SIZ marker");
717-
YTsiz = swap_byte(YTsiz);
718-
if (file->read(&XTOsiz, 4) != 4)
713+
set_tile_size(size(swap_byte(t_XTsiz), swap_byte(t_YTsiz)));
714+
ui32 t_XTOsiz, t_YTOsiz;
715+
if (file->read(&t_XTOsiz, 4) != 4)
719716
OJPH_ERROR(0x0005004B, "error reading SIZ marker");
720-
XTOsiz = swap_byte(XTOsiz);
721-
if (file->read(&YTOsiz, 4) != 4)
717+
if (file->read(&t_YTOsiz, 4) != 4)
722718
OJPH_ERROR(0x0005004C, "error reading SIZ marker");
723-
YTOsiz = swap_byte(YTOsiz);
719+
set_tile_offset(point(swap_byte(t_XTOsiz), swap_byte(t_YTOsiz)));
724720
if (file->read(&Csiz, 2) != 2)
725721
OJPH_ERROR(0x0005004D, "error reading SIZ marker");
726722
Csiz = swap_byte(Csiz);
@@ -745,6 +741,8 @@ namespace ojph {
745741

746742
ws_kern_support_needed = (Rsiz & 0x20) != 0;
747743
dfs_support_needed = (Rsiz & 0x80) != 0;
744+
745+
check_validity();
748746
}
749747

750748
//////////////////////////////////////////////////////////////////////////

src/core/codestream/ojph_params_local.h

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,47 @@ namespace ojph {
217217
cptr[comp_num].YRsiz = (ui8)downsampling.y;
218218
}
219219

220-
void check_validity(const param_cod& cod)
220+
void set_image_extent(point dims)
221+
{
222+
Xsiz = dims.x;
223+
Ysiz = dims.y;
224+
}
225+
226+
void set_tile_size(size s)
227+
{
228+
XTsiz = s.w;
229+
YTsiz = s.h;
230+
}
231+
232+
size get_tile_size() const
233+
{
234+
return size(XTsiz, YTsiz);
235+
}
236+
237+
void set_image_offset(point offset)
238+
{
239+
XOsiz = offset.x;
240+
YOsiz = offset.y;
241+
}
242+
243+
point get_image_offset() const
244+
{
245+
return point(XOsiz, YOsiz);
246+
}
247+
248+
void set_tile_offset(point offset)
249+
{
250+
XTOsiz = offset.x;
251+
YTOsiz = offset.y;
252+
}
253+
254+
void set_cod(const param_cod& cod)
221255
{
222256
this->cod = &cod;
257+
}
223258

224-
if (XTsiz == 0 && YTsiz == 0)
225-
{ XTsiz = Xsiz + XOsiz; YTsiz = Ysiz + YOsiz; }
259+
void check_validity()
260+
{
226261
if (Xsiz == 0 || Ysiz == 0 || XTsiz == 0 || YTsiz == 0)
227262
OJPH_ERROR(0x00040001,
228263
"You cannot set image extent nor tile size to zero");

0 commit comments

Comments
 (0)