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

Reply via email to