[Bug 48006] Final Fantasy XIV Launcher stuck on splash screen

WineHQ Bugzilla wine-bugs at winehq.org
Wed Jan 27 15:49:02 CST 2021


https://bugs.winehq.org/show_bug.cgi?id=48006

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |focht at gmx.net
     Ever confirmed|0                           |1
          Component|-unknown                    |jscript
                URL|http://gdl.square-enix.com/ |https://web.archive.org/web
                   |ffxiv/inst/ffxivsetup.exe   |/20190701092018/http://gdl.
                   |                            |square-enix.com/ffxiv/inst/
                   |                            |ffxivsetup.exe
             Status|UNCONFIRMED                 |NEW
           Severity|minor                       |normal

--- Comment #12 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

confirming. There are multiple jscript and mshtml/Wine-Gecko bugs at play here.

Adding stable link via Internet Archive:

https://web.archive.org/web/20190701092018/http://gdl.square-enix.com/ffxiv/inst/ffxivsetup.exe

The launcher gets stuck in a live-loop without any overrides.

--- snip ---
$ pwd
/home/focht/.wine/drive_c/Program Files (x86)/SquareEnix/FINAL FANTASY XIV - A
Realm Reborn/boot

$ WINEDEBUG=+mshtml,+jscript wine ./ffxivboot.exe >>log.txt 2>&
...
0118:trace:mshtml:HTMLWindow2_QueryInterface (02E30ED8)->(IID_IDispatchEx
0031EC64)
0118:trace:mshtml:HTMLWindow2_AddRef (02E30ED8) ref=19
0118:trace:jscript:Array_reduce
0118:fixme:jscript:Array_reduce Could not get length
0118:trace:mshtml:HTMLWindow2_Release (02E30ED8) ref=18
0118:trace:jscript:DispatchEx_Release (10B7E428) ref=4
0118:warn:jscript:unwind_exception Exception 800a1396 undefined in:
0118:warn:jscript:print_backtrace 0    [unnamed]()
0118:warn:jscript:print_backtrace 1    [unnamed](L"t"=obj(10B7E510))
0118:warn:jscript:print_backtrace 2    [unnamed](L"t"=str(L"reduce"))
0118:warn:jscript:print_backtrace 3    10B7C590->[unnamed](L"t"=obj(10B7CB78),
L"r"=obj(10B7C590), L"n"=obj(10ADC330))
0118:warn:jscript:print_backtrace 4    L"i"(L"t"=428.000000)
0118:warn:jscript:print_backtrace 5    10AE2DD8->[unnamed](L"A"=obj(10AE2D10),
L"g"=obj(10AE2DD8), L"B"=obj(10ADC330))
0118:warn:jscript:print_backtrace 6    L"i"(L"t"=640.000000)
0118:warn:jscript:print_backtrace 7    L"r"()
0118:warn:jscript:print_backtrace 8    [unnamed](L"e"=obj(10A8C400))
0118:warn:jscript:print_backtrace 9    [unnamed]([detached frame])
0118:warn:jscript:print_backtrace 10    [native code]
0118:trace:jscript:throw_error 800a1396
0118:trace:jscript:set_error_location source L"r.call(null,n||function(){throw
1},1)}))}},function(t,n){t.exports=function(t,n,r){if(!(t instanceof n))throw
TypeError(\"Incorrect \"+(r?r+\" \":\"\")+\"invocation\");return
t}},,,function(t,n,r){var
e=r(225),o=r(183).concat(\"length\",\"prototype\");n.f=Object.getOwnPropertyNames||funct"...
in
L"(window.webpackJsonp=window.webpackJsonp||[]).push([[8],[,,,,function(t,n,r){var
e=r(9),o=r(36).f,i=r(41),u=r(38),c=r(179),f=r(223),a=r(121);t.exports=function(t,n){var
r,s,p,l,v,h=t.target,y=t.global,d=t.stat;if(r=y?e:d?e[h]||c(h,{}):(e[h]||{}).prototype)for(s
in n){if(l=n[s],p=t.noTarge"...
0118:trace:jscript:DispatchEx_Release (10B7E928) ref=1
0118:trace:jscript:DispatchEx_Release (10B7E428) ref=2
0118:trace:jscript:detach_variable_object detaching 10B7E7F8
0118:trace:jscript:prop_get L"prototype" ret obj(02EA41A0)
0118:trace:jscript:DispatchEx_Release (02EA41A0) ref=2
0118:trace:jscript:init_dispex 10B2AB50 (02EA41A0)
0118:trace:jscript:jsdisp_define_property L"number" = -2146823274.000000
0118:trace:jscript:jsdisp_define_property L"message" = str(L"JScript object
expected")
0118:trace:jscript:jsdisp_define_property L"description" = str(L"JScript object
expected")
0118:trace:jscript:init_dispex 10B7EAF8 (00000000)
0118:trace:jscript:ensure_prop_name creating prop L"t" flags 1c00 
...
0118:trace:jscript:jsdisp_define_property L"1" = accessor { get: 10B19D78 set:
00000000 }
0118:trace:jscript:DispatchEx_Release (10AE3368) ref=3
0118:trace:jscript:interp_pop 5
0118:trace:jscript:DispatchEx_Release (10B850E0) ref=1
0118:trace:jscript:DispatchEx_Release (10B85018) ref=3
0118:trace:jscript:DispatchEx_Release (10AE3368) ref=1
0118:trace:jscript:interp_push_acc 
0118:trace:jscript:interp_setret 
0118:trace:jscript:interp_ret 
0118:trace:jscript:DispatchEx_Release (10B851C8) ref=1
0118:trace:jscript:jsdisp_free (10B851C8)
0118:trace:jscript:interp_pop 5
0118:trace:jscript:DispatchEx_Release (10B850E0) ref=0
0118:trace:jscript:jsdisp_free (10B850E0)
0118:trace:jscript:DispatchEx_Release (10B19D78) ref=7
0118:trace:jscript:DispatchEx_Release (10B85018) ref=2
0118:trace:jscript:DispatchEx_Release (10B19A78) ref=2
0118:trace:jscript:interp_push_acc 
0118:trace:jscript:interp_jmp 2689
0118:trace:jscript:interp_pop 1
0118:trace:jscript:DispatchEx_Release (10B85018) ref=1
0118:trace:jscript:interp_ident L"r"
0118:trace:jscript:identifier_eval L"r"
0118:trace:jscript:jsdisp_get_id not found L"r"
0118:trace:jscript:identifier_eval returning ref 74 for 0
0118:trace:jscript:interp_str L"call"
0118:trace:jscript:interp_memberid 0
0118:trace:jscript:DispatchEx_Release (10B84BC8) ref=3
0118:trace:jscript:interp_local 0: L"t"
0118:trace:jscript:interp_ident L"s"
0118:trace:jscript:identifier_eval L"s"
0118:trace:jscript:jsdisp_get_id not found L"s"
0118:trace:jscript:identifier_eval returning ref 76 for 2
0118:trace:jscript:interp_ident L"p"
0118:trace:jscript:identifier_eval L"p"
0118:trace:jscript:jsdisp_get_id not found L"p"
0118:trace:jscript:identifier_eval returning ref 77 for 3
0118:trace:jscript:interp_call_member 3 0
0118:trace:jscript:Function_call 
0118:trace:jscript:Array_splice 
0118:trace:jscript:prop_get L"length" ret -1.000000

<live-loop in jscript code, churning 100% cpu>
--- snip ---

I've attached a debugger to dump the callstack of the main thread which churns
all the cpu:

--- snip ---
jscript.Array_splice+444                 
jscript.NativeFunction_call+CE           
jscript.Function_call+BC                 
jscript.invoke_prop_func+2ED             
jscript.invoke_prop_func+128             
jscript.disp_call+264                    
jscript.exprval_call+6F                  
jscript.interp_call_member+F9            
jscript.exec_source+B82                  
jscript.JScriptParse_ParseScriptText+2C4 
mshtml.parse_elem_text+AA                
mshtml.doc_insert_script+59              
mshtml.run_insert_script+17C             
mshtml.nsRunnable_Run+15                 
...
--- snip ---

Using the strings in memory I found the executed jscript code on disk. A huge
one-liner. I "beautified" it using https://beautifier.io/

The relevant part, where it live-looped in 'jscript.Array_splice' without
returning, called from function r().

--- snip ---
function(e) {

    function t(t) {
        for (var o, i, l = t[0], c = t[1], s = t[2], d = 0, b = []; d <
l.length; d++) i = l[d], Object.prototype.hasOwnProperty.call(n, i) && n[i] &&
b.push(n[i][0]), n[i] = 0;
        for (o in c) Object.prototype.hasOwnProperty.call(c, o) && (e[o] =
c[o]);
        for (u && u(t); b.length;) b.shift()();
        return a.push.apply(a, s || []), r()
    }

    function r() {
        for (var e, t = 0; t < a.length; t++) {
            for (var r = a[t], o = !0, l = 1; l < r.length; l++) {
                var c = r[l];
                0 !== n[c] && (o = !1)
            }
            o && (a.splice(t--, 1), e = i(i.s = r[0]))
        }
        return e
    }
    var o = {},
        n = {
            4: 0
        },
        a = [];

    function i(t) {
        if (o[t]) return o[t].exports;
        var r = o[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return e[t].call(r.exports, r, r.exports, i), r.l = !0, r.exports
    }
...
--- snip ---

I didn't debug further. It shouldn't be hard to figure out why the array splice
doesn't return.

Using 'winetricks -q jscript' prevents the live-loop, only to run into next
problems, mshtml insufficiencies.

BTW there are many Final Fantasy (XIV) bug reports in Wine Bugzilla that are
out of date, invalid, fixed and dupes. Quite a mess. I have no energy /
interest to go through all of them indivually. It will likely destroy a good
mood for sure.

$ sha1sum ffxivsetup.exe 
10601e45ccbcaec81c8d0fda720cb8afc5a1f01b  ffxivsetup.exe

$ du -sh ffxivsetup.exe 
27M    ffxivsetup.exe

$ wine --version
wine-6.0-250-gacd1b068a34

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.


More information about the wine-bugs mailing list