summaryrefslogtreecommitdiffstats
path: root/contrib/libdvdnav/A07-missing-menu.patch
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libdvdnav/A07-missing-menu.patch')
-rw-r--r--contrib/libdvdnav/A07-missing-menu.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/contrib/libdvdnav/A07-missing-menu.patch b/contrib/libdvdnav/A07-missing-menu.patch
new file mode 100644
index 000000000..078f4748e
--- /dev/null
+++ b/contrib/libdvdnav/A07-missing-menu.patch
@@ -0,0 +1,110 @@
+diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
+--- libdvdnav.orig/src/vm/vm.c 2009-10-29 09:10:44.836643320 -0700
++++ libdvdnav/src/vm/vm.c 2009-11-16 11:10:07.527247268 -0800
+@@ -585,6 +585,9 @@
+ switch(menuid) {
+ case DVD_MENU_Title:
+ case DVD_MENU_Escape:
++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++ goto fail;
++ }
+ (vm->state).domain = VMGM_DOMAIN;
+ break;
+ case DVD_MENU_Root:
+@@ -592,6 +595,9 @@
+ case DVD_MENU_Audio:
+ case DVD_MENU_Angle:
+ case DVD_MENU_Part:
++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++ goto fail;
++ }
+ (vm->state).domain = VTSM_DOMAIN;
+ break;
+ }
+@@ -606,6 +612,7 @@
+ break;
+ }
+
++fail:
+ return 0;
+ }
+
+@@ -1488,6 +1495,10 @@
+ /* Allowed from anywhere except the VTS Title domain */
+ /* Stop SPRM9 Timer and any GPRM counters */
+ assert((vm->state).domain != VTS_DOMAIN); /* ?? */
++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
+ (vm->state).domain = VMGM_DOMAIN;
+ if(!set_MENU(vm, link_values.data1))
+ assert(0);
+@@ -1504,14 +1515,22 @@
+ if (link_values.data1 != (vm->state).vtsN) {
+ /* the normal case */
+ assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
+- (vm->state).domain = VTSM_DOMAIN;
+ if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1)) /* Also sets (vm->state).vtsN */
+ assert(0);
++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
++ (vm->state).domain = VTSM_DOMAIN;
+ } else {
+ /* This happens on some discs like "Captain Scarlet & the Mysterons" or
+ * the German RC2 of "Anatomie" in VTSM. */
+ assert((vm->state).domain == VTSM_DOMAIN ||
+ (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
+ (vm->state).domain = VTSM_DOMAIN;
+ }
+ } else {
+@@ -1533,6 +1552,10 @@
+ /* set_PGCN:data1 */
+ /* Stop SPRM9 Timer and any GPRM counters */
+ assert((vm->state).domain != VTS_DOMAIN); /* ?? */
++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
+ (vm->state).domain = VMGM_DOMAIN;
+ if(!set_PGCN(vm, link_values.data1))
+ assert(0);
+@@ -1552,6 +1575,10 @@
+ /* set_RSMinfo:data2 */
+ assert((vm->state).domain == VTS_DOMAIN); /* ?? */
+ /* Must be called before domain is changed */
++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
+ set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
+ (vm->state).domain = VMGM_DOMAIN;
+ if(!set_MENU(vm, link_values.data1))
+@@ -1563,6 +1590,10 @@
+ /* set_RSMinfo:data2 */
+ assert((vm->state).domain == VTS_DOMAIN); /* ?? */
+ /* Must be called before domain is changed */
++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
+ set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
+ (vm->state).domain = VTSM_DOMAIN;
+ if(!set_MENU(vm, link_values.data1))
+@@ -1574,6 +1605,10 @@
+ /* set_RSMinfo:data2 */
+ assert((vm->state).domain == VTS_DOMAIN); /* ?? */
+ /* Must be called before domain is changed */
++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
++ link_values.command = Exit;
++ break;
++ }
+ set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
+ (vm->state).domain = VMGM_DOMAIN;
+ if(!set_PGCN(vm, link_values.data1))