------------------------------------------------------------
                        [BUG/PRB.] VFP 9.0 FIX - SET COVERAGE COMMAND
                                  August 2024
                 ------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9, in the coverage profiler log file, if the width of the execution time > 15,
     it will cause a buffer overflow, VFP will crash.

     In vfp8 (and vfp6, vfp7), in the coverage profiler log file, if the width of the execution time > 15,
     it will cause a buffer overflow, but VFP will not crash.


2. CAUSE:

     In VFP 9.0 and earlier versions, in the coverage profiler log file,
     usually the field type of the execution time is N(11,6),
     if the width of the execution time > 15,
     it will cause a buffer overflow, VFP will crash (in vfp9).
     
     In VFP Advanced, in the coverage profiler log file,
     if the width of the execution time > 15, VFP will save 15 characters in the execution time,
     so there is no the bug.

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Label5c77a5 ::
             mov eax ,  dword ptr [ Data9370e8 ]                             ;0x005c77a5 :        a1e8709300
             sub  eax , dword ptr [ Data937104 ]                             ;0x005c77aa :        2b0504719300
             pushd 038h                                                      ;0x005c77b0 :        6a38
             cdq                                                             ;0x005c77b2 :        99
             pop esi                                                         ;0x005c77b3 :        5e
             idiv esi                                                        ;0x005c77b4 :        f7fe
             mov esi , eax                                                   ;0x005c77b6 :        8bf0
             mov eax ,  dword ptr [ Data936d1c ]                             ;0x005c77b8 :        a11c6d9300
             shl esi , 04h                                                   ;0x005c77bd :        c1e604
             add  esi , dword ptr [eax]                                      ;0x005c77c0 :        0330
             cmp  dword ptr [esi] , 00h                                      ;0x005c77c2 :        833e00
             jne Label4cec3b                                                 ;0x005c77c5 :        0f857074f0ff
             mov eax ,  dword ptr [ Data93757c ]                             ;0x005c77cb :        a17c759300
             imul ecx , ecx , 038h                                           ;0x005c77d0 :        6bc938
             lea eax ,  dword ptr [ eax + ecx + 4 ]                          ;0x005c77d3 :        8d440804
             mov  ecx , dword ptr [ esi + 4 ]                                ;0x005c77d7 :        8b4e04
             mov  edi , dword ptr [eax]                                      ;0x005c77da :        8b38
             mov  dword ptr [eax] , ecx                                      ;0x005c77dc :        8908
             cmp  dword ptr [ Data931e00 ] , 01h                             ;0x005c77de :        833d001e930001
             jne Label5c780c                                                 ;0x005c77e5 :        7525
             cmp  dword ptr [ Data931e04 ] , 00h                             ;0x005c77e7 :        833d041e930000
             jne Label5c780c                                                 ;0x005c77ee :        751c
             call Fun42e3f9                                                  ;0x005c77f0 :        e8046ce6ff
             sub  eax , dword ptr [ esi + 8 ]                                ;0x005c77f5 :        2b4608
             sbb edx , [ esi + 12 ]                                          ;0x005c77f8 :        1b560c
             mov  dword ptr [ ebp - 32 ] , eax                               ;0x005c77fb :        8945e0
             mov  dword ptr [ ebp - 28 ] , edx                               ;0x005c77fe :        8955e4
             fild qword ptr [ ebp - 32 ]                                     ;0x005c7801 :        df6de0
             fmul qword ptr [ Data91a398 ]                                   ;0x005c7804 :        dc0d98a39100
             jmp Label5c7826                                                 ;0x005c780a :        eb1a

     Label5c780c ::
             lea eax ,  dword ptr [ ebp - 40 ]                               ;0x005c780c :        8d45d8
             push eax                                                        ;0x005c780f :        50
             call  QueryPerformanceCounter                     ;0x005c7810 :        ff1520709100
             fild qword ptr [ ebp - 40 ]                                     ;0x005c7816 :        df6dd8
             fild qword ptr [ esi + 8 ]                                      ;0x005c7819 :        df6e08
             fsubp st(1) , st(0)                                             ;0x005c781c :        dee9
             fild qword ptr [ Data931e00 ]                                   ;0x005c781e :        df2d001e9300
             fdivp st(1) , st(0)                                             ;0x005c7824 :        def9

     Label5c7826 ::


     ;
     ;                 -------------------------------------------------
     ;                        VFP 9.0 FIX - SET COVERAGE COMMAND
     ;                                  August 2024
     ;                 -------------------------------------------------
     ;                                     CCB
     ;
     ; In the coverage profiler log file, if the width of the execution time > 15, VFP will crash.
     ;
     ; 2024/8/8, by ccb
     ;

     ;         push ecx                                                        ;0x005c7826 :        51
     ;         push ecx                                                        ;0x005c7827 :        51
     ;         fstp qword ptr [ esp ]                                          ;0x005c7828 :        dd1c24
     ;         lea eax ,  dword ptr [ ebp - 20 ]                               ;0x005c782b :        8d45ec
     ;         pushd offset Data92a790                                                  ;0x005c782e :        6890a79200
     ;         push eax                                                        ;0x005c7833 :        50
     ;         call Fun43089c                                                  ;0x005c7834 :        e86390e6ff

             cmp dword ptr vfpa_sys9161_data,00h
             jne Label5c7827
             push ecx                                                        ;0x005c7826 :        51
             push ecx                                                        ;0x005c7827 :        51
             fstp qword ptr [ esp ]                                          ;0x005c7828 :        dd1c24
             lea eax ,  dword ptr [ ebp - 20 ]                               ;0x005c782b :        8d45ec
             pushd offset Data92a790                                                  ;0x005c782e :        6890a79200
             push eax                                                        ;0x005c7833 :        50
             call Fun43089c                                                  ;0x005c7834 :        e86390e6ff
             jmp Label5c7839
     Label5c7827 ::
             sub esp , 100h
             lea eax ,  dword ptr [ esp + 00h ]
             push ecx                                                        ;0x005c7826 :        51
             push ecx                                                        ;0x005c7827 :        51
             fstp qword ptr [ esp ]                                          ;0x005c7828 :        dd1c24
             pushd offset Data92a790                                                  ;0x005c782e :        6890a79200
             push eax                                                        ;0x005c7833 :        50
             call Fun43089c                                                  ;0x005c7834 :        e86390e6ff
             lea ecx ,  dword ptr [ esp + 00h ][10h]
             lea eax ,  dword ptr [ ebp - 20 ]
             push 10h
             push ecx
             push eax
             call lstrcpynA
             add esp , 100h
             jmp Label5c7839


     Label5c7839 ::
             lea eax ,  dword ptr [ ebp - 20 ]                               ;0x005c7839 :        8d45ec
             pushd 02Ch                                                      ;0x005c783c :        6a2c
             push eax                                                        ;0x005c783e :        50
             call  _mbschr = qword ptr [ Data9370b0 ]                                  ;0x005c783f :        ff15b0709300
             add esp , 018h                                                  ;0x005c7845 :        83c418
             test eax , eax                                                  ;0x005c7848 :        85c0
             je Label5c784f                                                  ;0x005c784a :        7403
             mov  byte ptr [eax] , 02Eh                                      ;0x005c784c :        c6002e

     Label5c784f ::
             lea eax ,  dword ptr [ ebp - 20 ]                               ;0x005c784f :        8d45ec
             lea edx ,  dword ptr [ eax + 1 ]                                ;0x005c7852 :        8d5001

     Label5c7855 ::
             mov  cl , byte ptr [eax]                                        ;0x005c7855 :        8a08
             inc eax                                                         ;0x005c7857 :        40
             test cl , cl                                                    ;0x005c7858 :        84c9
             jne Label5c7855                                                 ;0x005c785a :        75f9
             sub eax , edx                                                   ;0x005c785c :        2bc2
             mov  byte ptr [ ebp + eax - 20 ] , 02Ch                         ;0x005c785e :        c64405ec2c
             inc eax                                                         ;0x005c7863 :        40
             push eax                                                        ;0x005c7864 :        50
             lea eax ,  dword ptr [ ebp - 20 ]                               ;0x005c7865 :        8d45ec
             push eax                                                        ;0x005c7868 :        50
             push  dword ptr [ Data936c08 ]                                  ;0x005c7869 :        ff35086c9300
             call Fun431e4d                                                  ;0x005c786f :        e8d9a5e6ff
             mov eax ,  dword ptr [ Data936c08 ]                             ;0x005c7874 :        a1086c9300
             mov  ecx , dword ptr [ Data93757c ]                             ;0x005c7879 :        8b0d7c759300
             imul eax , eax , 038h                                           ;0x005c787f :        6bc038
             mov  dword ptr [ eax + ecx + 4 ] , edi                          ;0x005c7882 :        897c0804
             mov  dword ptr [esi] , 01h                                      ;0x005c7886 :        c70601000000
             jmp Label4cec3b                                                 ;0x005c788c :        e9aa73f0ff


4. APPLIES TO:

     VFP 6.0.8167.0
     VFP 6.0.8961.0 (SP5)

     VFP 7.0.0.9262
     VFP 7.0.0.9465 (SP1)

     VFP 8.0.0.2521
     VFP 8.0.0.3117 (SP1)

     VFP 9.0.0.2412
     VFP 9.0.0.3504 (SP1)
     VFP 9.0.0.4611 (SP2)
     VFP 9.0.0.5015 (SP2)
     VFP 9.0.0.5411 (SP2)
     VFP 9.0.0.5721 (SP2)
     VFP 9.0.0.5815 (SP2)
     VFP 9.0.0.6303 (SP2)
     VFP 9.0.0.6602 (SP2)
     VFP 9.0.0.7423 (SP2)

     The bug has been fixed in VFP Advanced.


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix332.asp


6. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please send me an email at ccb2000@163.com.