Petri Hintukainen pushed to branch master at VideoLAN / libbluray
Commits:
4d5c25e7 by Petri Hintukainen at 2026-01-19T23:01:52+02:00
hdmv_vm: avoid integer overflow in GOTO
- - - - -
3626f53c by Petri Hintukainen at 2026-01-20T00:13:53+02:00
Fix possible integer overflow
when adding to uint32_t
- - - - -
d6ff1bb2 by Petri Hintukainen at 2026-01-20T00:16:33+02:00
Check for empty playlist
- - - - -
676f5e00 by Petri Hintukainen at 2026-01-20T00:19:37+02:00
Use correct type for extension data start address
Address is read as uint32_t from file
- - - - -
a5bcac55 by Petri Hintukainen at 2026-01-20T00:27:24+02:00
Fix end-of-file return value when reading directory from libudfread
- - - - -
19706ab9 by Petri Hintukainen at 2026-01-20T00:33:43+02:00
Use real function pointer instead of void*
- - - - -
30d32610 by Petri Hintukainen at 2026-01-20T00:33:43+02:00
meson: fix BD-J build when java files have been changed
Ant was never called again in existing build directory, so changed
java files were not recompiled.
- - - - -
13 changed files:
- src/libbluray/bdj/meson.build
- src/libbluray/bdnav/clpi_parse.c
- src/libbluray/bdnav/extdata_parse.c
- src/libbluray/bdnav/extdata_parse.h
- src/libbluray/bdnav/mpls_parse.c
- src/libbluray/bdnav/navigation.c
- src/libbluray/disc/aacs.c
- src/libbluray/disc/aacs.h
- src/libbluray/disc/bdplus.c
- src/libbluray/disc/bdplus.h
- src/libbluray/disc/dec.c
- src/libbluray/disc/udf_fs.c
- src/libbluray/hdmv/hdmv_vm.c
Changes:
=====================================
src/libbluray/bdj/meson.build
=====================================
@@ -40,6 +40,7 @@ custom_target('bdj-jar',
f'-Djava_version_bdj=@java_src_version@'],
output: [f'libbluray-@bdj_type@-@[email protected]',
f'libbluray-awt-@bdj_type@-@[email protected]'],
+ build_always_stale: true,
install: true,
install_tag: 'runtime',
install_dir: get_option('datadir') / 'java',
=====================================
src/libbluray/bdnav/clpi_parse.c
=====================================
@@ -342,7 +342,7 @@ _parse_ep_map_stream(BITSTREAM *bits, CLPI_EP_MAP_ENTRY *ee)
coarse[ii].spn_ep = bs_read(bits, 32);
}
- if (bs_seek_byte(bits, ee->ep_map_stream_start_addr+fine_start) < 0) {
+ if (bs_seek_byte(bits, (int64_t)ee->ep_map_stream_start_addr+fine_start) <
0) {
return 0;
}
=====================================
src/libbluray/bdnav/extdata_parse.c
=====================================
@@ -27,7 +27,7 @@
#include <stdint.h>
int bdmv_parse_extension_data(BITSTREAM *bits,
- int start_address,
+ uint32_t start_address,
int (*handler)(BITSTREAM*, int, int, void*),
void *handle)
{
@@ -35,7 +35,7 @@ int bdmv_parse_extension_data(BITSTREAM *bits,
int num_entries, n;
if (start_address < 1) return 0;
- if (start_address > bits->end - 12) return 0;
+ if ((int64_t)start_address + 12 > bits->end) return 0;
if (bs_seek_byte(bits, start_address) < 0) {
return 0;
@@ -47,7 +47,9 @@ int bdmv_parse_extension_data(BITSTREAM *bits,
bs_skip(bits, 24); /* padding */
num_entries = bs_read(bits, 8);
- if (start_address > bits->end - 12 - num_entries * 12) return 0;
+ if ((int64_t)start_address + 12 + num_entries * 12 > bits->end) {
+ return 0;
+ }
for (n = 0; n < num_entries; n++) {
uint16_t id1 = bs_read(bits, 16);
@@ -59,7 +61,7 @@ int bdmv_parse_extension_data(BITSTREAM *bits,
if (ext_start + start_address + ext_len > bits->end) return 0;
- if (bs_seek_byte(bits, start_address + ext_start) >= 0) {
+ if (bs_seek_byte(bits, (int64_t)start_address + ext_start) >= 0) {
(handler)(bits, id1, id2, handle);
}
=====================================
src/libbluray/bdnav/extdata_parse.h
=====================================
@@ -26,7 +26,7 @@
#include <stdint.h>
BD_PRIVATE int bdmv_parse_extension_data(BITSTREAM *bits,
- int start_address,
+ uint32_t start_address,
int (*handler)(BITSTREAM*, int, int,
void*),
void *handle);
=====================================
src/libbluray/bdnav/mpls_parse.c
=====================================
@@ -897,7 +897,7 @@ _parse_pip_metadata_block(BITSTREAM *bits, uint32_t
start_address, MPLS_PIP_META
data_address = bs_read(bits, 32);
pos = bs_pos(bits) / 8;
- if (bs_seek_byte(bits, start_address + data_address) < 0) {
+ if (bs_seek_byte(bits, (int64_t)start_address + data_address) < 0) {
return 0;
}
result = _parse_pip_data(bits, data);
=====================================
src/libbluray/bdnav/navigation.c
=====================================
@@ -833,6 +833,11 @@ const NAV_CLIP* nav_chapter_search(const NAV_TITLE *title,
unsigned chapter,
{
const NAV_CLIP *clip;
+ if (title->pl->list_count < 1) {
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "nav_chapter_search() failed: empty
playlist\n");
+ return NULL;
+ }
+
if (chapter > title->chap_list.count) {
clip = &title->clip_list.clip[0];
*clip_pkt = clip->start_pkt;
@@ -875,6 +880,11 @@ const NAV_CLIP* nav_mark_search(const NAV_TITLE *title,
unsigned mark,
{
const NAV_CLIP *clip;
+ if (title->pl->list_count < 1) {
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "nav_mark_search() failed: empty
playlist\n");
+ return NULL;
+ }
+
if (mark > title->mark_list.count) {
clip = &title->clip_list.clip[0];
*clip_pkt = clip->start_pkt;
@@ -919,6 +929,12 @@ const NAV_CLIP* nav_packet_search(const NAV_TITLE *title,
uint32_t pkt,
*out_time = 0;
pos = 0;
+
+ if (title->pl->list_count < 1) {
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "nav_packet_search() failed: empty
playlist\n");
+ return NULL;
+ }
+
for (ii = 0; ii < title->pl->list_count; ii++) {
clip = &title->clip_list.clip[ii];
len = clip->end_pkt - clip->start_pkt;
@@ -1042,6 +1058,10 @@ void nav_clip_time_search(const NAV_CLIP *clip, uint32_t
tick, uint32_t *clip_pk
*/
const NAV_CLIP* nav_next_clip(const NAV_TITLE *title, const NAV_CLIP *clip)
{
+ if (title->clip_list.count < 1) {
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "nav_next_clip() failed: empty
playlist\n");
+ return NULL;
+ }
if (clip == NULL) {
return &title->clip_list.clip[0];
}
=====================================
src/libbluray/disc/aacs.c
=====================================
@@ -163,7 +163,7 @@ BD_AACS *libaacs_load(int force_mmbd)
}
int libaacs_open(BD_AACS *p, const char *device,
- void *file_open_handle, void *file_open_fp,
+ void *file_open_handle, AACS_FILE_OPEN2 file_open_fp,
const char *keyfile_path)
{
=====================================
src/libbluray/disc/aacs.h
=====================================
@@ -24,13 +24,15 @@
#include <stdint.h>
+struct bd_file_s;
+typedef struct bd_file_s * (*AACS_FILE_OPEN2)(void *handle, const char*
filename);
typedef struct bd_aacs BD_AACS;
BD_PRIVATE int libaacs_required(void *h, int (*have_file)(void *, const char
*, const char *));
BD_PRIVATE BD_AACS *libaacs_load(int force_mmbd);
BD_PRIVATE int libaacs_open(BD_AACS *p, const char *device,
- void *file_open_handle, void *file_open_fp,
+ void *file_open_handle, AACS_FILE_OPEN2
file_open_fp,
const char *keyfile_path);
BD_PRIVATE void libaacs_unload(BD_AACS **p);
=====================================
src/libbluray/disc/bdplus.c
=====================================
@@ -178,7 +178,7 @@ BD_BDPLUS *libbdplus_load()
}
int libbdplus_init(BD_BDPLUS *p, const char *root, const char *device,
- void *file_open_handle, void *file_open_fp,
+ void *file_open_handle, BDPLUS_FILE_OPEN file_open_fp,
const uint8_t *vid, const uint8_t *mk)
{
fptr_p_void bdplus_init;
=====================================
src/libbluray/disc/bdplus.h
=====================================
@@ -24,6 +24,8 @@
#include <stdint.h>
+struct bd_file_s;
+typedef struct bd_file_s *(*BDPLUS_FILE_OPEN)(void *handle, const char
*filename);
typedef struct bd_bdplus BD_BDPLUS;
@@ -31,7 +33,7 @@ BD_PRIVATE int libbdplus_required(void *have_file_handle,
int (*have_file)(void
BD_PRIVATE BD_BDPLUS *libbdplus_load(void);
BD_PRIVATE int libbdplus_is_mmbd(BD_BDPLUS *);
BD_PRIVATE int libbdplus_init(BD_BDPLUS *p, const char *root, const char
*device,
- void *open_file_handle, void *open_file_fp,
+ void *file_open_handle, BDPLUS_FILE_OPEN
file_open_fp,
const uint8_t *vid, const uint8_t *mk);
BD_PRIVATE void libbdplus_unload(BD_BDPLUS **p);
=====================================
src/libbluray/disc/dec.c
=====================================
@@ -183,7 +183,7 @@ static int _libaacs_init(BD_DEC *dec, struct dec_dev *dev,
return 0;
}
- result = libaacs_open(dec->aacs, dev->device, dev->file_open_vfs_handle,
(void*)dev->pf_file_open_vfs, keyfile_path);
+ result = libaacs_open(dec->aacs, dev->device, dev->file_open_vfs_handle,
dev->pf_file_open_vfs, keyfile_path);
i->aacs_error_code = result;
i->aacs_handled = !result;
@@ -219,7 +219,7 @@ static int _libbdplus_init(BD_DEC *dec, struct dec_dev *dev,
return 0;
}
- if (libbdplus_init(dec->bdplus, dev->root, dev->device,
dev->file_open_bdrom_handle, (void*)dev->pf_file_open_bdrom, vid, mk)) {
+ if (libbdplus_init(dec->bdplus, dev->root, dev->device,
dev->file_open_bdrom_handle, dev->pf_file_open_bdrom, vid, mk)) {
BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bdplus_init() failed\n");
i->bdplus_handled = 0;
=====================================
src/libbluray/disc/udf_fs.c
=====================================
@@ -112,7 +112,7 @@ static int _dir_read(BD_DIR_H *dir, BD_DIRENT *entry)
struct udfread_dirent e;
if (!udfread_readdir((UDFDIR*)dir->internal, &e)) {
- return -1;
+ return 1;
}
strncpy(entry->d_name, e.d_name, sizeof(entry->d_name));
=====================================
src/libbluray/hdmv/hdmv_vm.c
=====================================
@@ -1083,7 +1083,7 @@ static int _hdmv_step(HDMV_VM *p)
}
switch (insn->branch_opt) {
case INSN_NOP: break;
- case INSN_GOTO: p->pc = dst - 1; break;
+ case INSN_GOTO: p->pc = dst; inc_pc = 0; break;
case INSN_BREAK: p->pc = 1 << 17; break;
default:
BD_DEBUG(DBG_HDMV|DBG_CRIT, "unknown BRANCH/GOTO
option %d in opcode 0x%08x\n",
View it on GitLab:
https://code.videolan.org/videolan/libbluray/-/compare/e106dd9c0b5a7cd3e02da13df6d71c2c3bb56b18...30d32610f4426317c1d92b52923d41db9e23b2a0
--
View it on GitLab:
https://code.videolan.org/videolan/libbluray/-/compare/e106dd9c0b5a7cd3e02da13df6d71c2c3bb56b18...30d32610f4426317c1d92b52923d41db9e23b2a0
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance_______________________________________________
libbluray-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/libbluray-devel