libbluray | branch: master | hpi1 <[email protected]> | Mon Feb  9 13:55:14 
2015 +0200| [60c023f3056caf47a9ca566c387ec619186c4967] | committer: hpi1

HDMV: detect infinite looping between graphics controller and HDMV VM

Fixes live lock with "Butterfly on the Wheel" by aborting playback.
The disc is broken:
UO mask allows jumping to root menu from language selection menu.
This skips on-disc menu initialization code, causing infinite loop
in root menu.

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=60c023f3056caf47a9ca566c387ec619186c4967
---

 ChangeLog              |    2 ++
 src/libbluray/bluray.c |   11 +++++++++++
 2 files changed, 13 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index f3b0a1e..c72545b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+- Fix infinite loop with some broken HDMV menus
+
 2015-01-26: Version 0.7.0
 - Add player setting for BD-J persistent storage and cache paths.
 - Add support for system fonts. BD-J fonts in jre/lib/fonts/ are not required 
anymore.
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index 8ec1fb0..37cb198 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -3169,6 +3169,7 @@ static int _read_ext(BLURAY *bd, unsigned char *buf, int 
len, BD_EVENT *event)
     /* run HDMV VM ? */
     if (bd->title_type == title_hdmv) {
 
+        int loops = 0;
         while (!bd->hdmv_suspended) {
 
             if (_run_hdmv(bd) < 0) {
@@ -3176,6 +3177,16 @@ static int _read_ext(BLURAY *bd, unsigned char *buf, int 
len, BD_EVENT *event)
                 bd->title_type = title_undef;
                 return -1;
             }
+            if (loops++ > 100) {
+                /* Detect infinite loops.
+                 * Broken disc may cause infinite loop between graphics 
controller and HDMV VM.
+                 * This happens ex. with "Butterfly on a Wheel":
+                 * Triggering unmasked "Menu Call" UO in language selection 
menu skips
+                 * menu system initialization code, resulting in infinite loop 
in root menu.
+                 */
+                BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bd_read_ext(): detected 
possible HDMV mode live lock (%d loops)\n", loops);
+                _queue_event(bd, BD_EVENT_ERROR, BD_ERROR_HDMV);
+            }
             if (_get_event(bd, event)) {
                 return 0;
             }

_______________________________________________
libbluray-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/libbluray-devel

Reply via email to