------------------------------------------------------------------------------------- [BUG/PRB.] VFP 9.0 FIX - CHECK AVAILABLE MEMORY FOR CREATING A BINARY INDEX January 2024 ------------------------------------------------------------------------------------- CCB 1. BUG: If we enable checking available memory for creating a binary index in Visual FoxPro Advanced, but there is not enough memory to create the binary index, it will cause the error "There is not enough memory to complete this operation (Error 43)". It is the startup default for Visual FoxPro Advanced. If we disable checking available memory for creating a binary index in Visual FoxPro Advanced, but there is not enough memory to create the binary index, it will enter an infinite loop, it is the same as Visual FoxPro 9.0 and earlier versions. There is the bug for creating a binary index in Visual FoxPro 9.0. There is no the bug for creating a non-binary index in Visual FoxPro 9.0. There is no the bug in Visual FoxPro 8.0 and earlier versions. 2. CAUSE: To create a binary index in Visual FoxPro, it needs 16 bytes per record. If RECCOUNT()=90000000, it needs 16 * 90000000 = 1440000000 bytes < 1466695680 bytes (the SYS(3050,1) default setting), so it can create the binary index. If RECCOUNT()=100000000, it needs 16 * 100000000 = 1600000000 bytes > 1466695680 bytes (the SYS(3050,1) default setting), so it can't create the binary index. 3. RESOLUTION: We can write some code to fix the BUG. Fun4203bc :: ; proc near mov eax , dword ptr [ Data937584 ] ;0x004203bc : a184759300 mov ecx , dword ptr [ Data9370d4 ] ;0x004203c1 : 8b0dd4709300 push ebx ;0x004203c7 : 53 push ebp ;0x004203c8 : 55 mov ebp , dword ptr [ esp + 12 ] ;0x004203c9 : 8b6c240c mov ebx , dword ptr [ ebp + 24 ] ;0x004203cd : 8b5d18 push esi ;0x004203d0 : 56 sub eax , dword ptr [ Data9392ac ] ;0x004203d1 : 2b05ac929300 add ebx , 04h ;0x004203d7 : 83c304 cmp ecx , eax ;0x004203da : 3bc8 mov dword ptr [ esp + 16 ] , 00h ;0x004203dc : c744241000000000 jb Label5a5bcb ;0x004203e4 : 0f82e1571800 sub ecx , eax ;0x004203ea : 2bc8 Label4203ec :: mov eax , dword ptr [ Data937784 ] ;0x004203ec : a184779300 add eax , ecx ;0x004203f1 : 03c1 mov ecx , eax ;0x004203f3 : 8bc8 shr ecx , 1 ;0x004203f5 : d1e9 cmp eax , 020000h ;0x004203f7 : 3d00000200 jbe Label420485 ;0x004203fc : 0f8683000000 lea esi , dword ptr [ eax + 0FFFE0000h ] ;0x00420402 : 8db00000feff Label420408 :: cmp ecx , esi ;0x00420408 : 3bce ja Label5a5bd2 ;0x0042040a : 0f87c2571800 Label420410 :: test esi , esi ;0x00420410 : 85f6 je Label5a5bd9 ;0x00420412 : 0f84c1571800 mov ecx , dword ptr [ ebp + 28 ] ;0x00420418 : 8b4d1c mov eax , ecx ;0x0042041b : 8bc1 imul eax , ebx ;0x0042041d : 0fafc3 cmp eax , 01h ;0x00420420 : 83f801 jbe Label5a5be3 ;0x00420423 : 0f86ba571800 Label420429 :: ; ; -------------------------------------------------------------------------- ; VFP 9.0 FIX - CHECK AVAILABLE MEMORY FOR CREATING A BINARY INDEX ; September 2020 ; -------------------------------------------------------------------------- ; CCB ; ; Check available memory for creating a binary index. ; ; 2020/9/21, by ccb ; cmp dword ptr vfpa_sys9036_data,00h je Label42042a cmp dword ptr [ esp + 0Ch ] , offset Label41eae2 ;; Fun41ea8e .. ; proc near jne Label42042a cmp dword ptr [ esp + 0Ch + (4+08h+74h) ] , offset Label422b9b ;; Fun422926 .. ; proc near jne Label42042a test byte ptr [ ebp + 66 ] , 02h je Label42042a cmp eax , esi ja Label5a5bd9 Label42042a :: dec eax ;0x00420429 : 48 xor edx , edx ;0x0042042a : 33d2 div esi ;0x0042042c : f7f6 push edi ;0x0042042e : 57 pushd 00h ;0x0042042f : 6a00 mov esi , eax ;0x00420431 : 8bf0 mov eax , ecx ;0x00420433 : 8bc1 inc esi ;0x00420435 : 46 cdq ;0x00420436 : 99 idiv esi ;0x00420437 : f7fe mov esi , eax ;0x00420439 : 8bf0 add esi , 02h ;0x0042043b : 83c602 mov edi , esi ;0x0042043e : 8bfe imul edi , ebx ;0x00420440 : 0faffb call Fun42db6a ;0x00420443 : e822d70000 test eax , eax ;0x00420448 : 85c0 mov dword ptr [ ebp + 36 ] , eax ;0x0042044a : 894524 je Label5a5bed ;0x0042044d : 0f849a571800 Label420453 :: mov ecx , dword ptr [ ebp + 36 ] ;0x00420453 : 8b4d24 xor eax , eax ;0x00420456 : 33c0 test esi , esi ;0x00420458 : 85f6 pop edi ;0x0042045a : 5f jle Label5a5c25 ;0x0042045b : 0f8ec4571800 mov eax , esi ;0x00420461 : 8bc6 nop ;0x00420463 : 90 Label420464 :: mov edx , dword ptr [ esp + 16 ] ;0x00420464 : 8b542410 mov dword ptr [ecx] , edx ;0x00420468 : 8911 mov dword ptr [ esp + 16 ] , ecx ;0x0042046a : 894c2410 add ecx , ebx ;0x0042046e : 03cb dec eax ;0x00420470 : 48 jne Label420464 ;0x00420471 : 75f1 mov eax , dword ptr [ esp + 16 ] ;0x00420473 : 8b442410 mov ecx , dword ptr [ esp + 20 ] ;0x00420477 : 8b4c2414 mov dword ptr [ecx] , eax ;0x0042047b : 8901 mov eax , esi ;0x0042047d : 8bc6 pop esi ;0x0042047f : 5e pop ebp ;0x00420480 : 5d pop ebx ;0x00420481 : 5b ret 08h ;0x00420482 : c20800 4. APPLIES TO: 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_vfp9fix125.asp 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |