Marked internal menu commands as safe

This fixes soundfont/patchset/config selection menus in advanced sound options
This commit is contained in:
alexey.lysiuk 2018-01-30 16:02:30 +02:00
parent c8b6e5719e
commit d9323b9740
3 changed files with 9 additions and 3 deletions

View file

@ -692,7 +692,8 @@ DEFINE_ACTION_FUNCTION(DOptionMenuItemCommand, DoCommand)
if (CurrentMenu == nullptr) return 0; if (CurrentMenu == nullptr) return 0;
PARAM_PROLOGUE; PARAM_PROLOGUE;
PARAM_STRING(cmd); PARAM_STRING(cmd);
UnsafeExecutionScope scope; PARAM_BOOL(unsafe);
UnsafeExecutionScope scope(unsafe);
C_DoCommand(cmd); C_DoCommand(cmd);
return 0; return 0;
} }

View file

@ -58,6 +58,7 @@
#include "vm.h" #include "vm.h"
#include "events.h" #include "events.h"
#include "gl/renderer/gl_renderer.h" // for menu blur #include "gl/renderer/gl_renderer.h" // for menu blur
#include "scripting/types.h"
// //
// Todo: Move these elsewhere // Todo: Move these elsewhere
@ -1180,6 +1181,8 @@ DMenuItemBase * CreateOptionMenuItemCommand(const char *label, FName cmd, bool c
VMValue params[] = { p, &namestr, cmd.GetIndex(), centered }; VMValue params[] = { p, &namestr, cmd.GetIndex(), centered };
auto f = dyn_cast<PFunction>(c->FindSymbol("Init", false)); auto f = dyn_cast<PFunction>(c->FindSymbol("Init", false));
VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0); VMCall(f->Variants[0].Implementation, params, countof(params), nullptr, 0);
auto unsafe = dyn_cast<PField>(c->FindSymbol("mUnsafe", false));
unsafe->Type->SetValue(reinterpret_cast<uint8_t*>(p) + unsafe->Offset, 0);
return (DMenuItemBase*)p; return (DMenuItemBase*)p;
} }

View file

@ -128,16 +128,18 @@ class OptionMenuItemCommand : OptionMenuItemSubmenu
{ {
private String ccmd; // do not allow access to this from the outside. private String ccmd; // do not allow access to this from the outside.
bool mCloseOnSelect; bool mCloseOnSelect;
private bool mUnsafe;
OptionMenuItemCommand Init(String label, Name command, bool centered = false, bool closeonselect = false) OptionMenuItemCommand Init(String label, Name command, bool centered = false, bool closeonselect = false)
{ {
Super.Init(label, command, 0, centered); Super.Init(label, command, 0, centered);
ccmd = command; ccmd = command;
mCloseOnSelect = closeonselect; mCloseOnSelect = closeonselect;
mUnsafe = true;
return self; return self;
} }
private native static void DoCommand(String cmd); // This is very intentionally limited to this menu item to prevent abuse. private native static void DoCommand(String cmd, bool unsafe); // This is very intentionally limited to this menu item to prevent abuse.
override bool Activate() override bool Activate()
{ {
@ -151,7 +153,7 @@ class OptionMenuItemCommand : OptionMenuItemSubmenu
if (m.GetItem(mAction) != self) return false; if (m.GetItem(mAction) != self) return false;
} }
Menu.MenuSound("menu/choose"); Menu.MenuSound("menu/choose");
DoCommand(ccmd); DoCommand(ccmd, mUnsafe);
if (mCloseOnSelect) if (mCloseOnSelect)
{ {
let curmenu = Menu.GetCurrentMenu(); let curmenu = Menu.GetCurrentMenu();