strncmp: Fix issues related to very large n values.
This fixes the following issues: *If n was 0x80000000 or greater, strncmp would return 0 without performing a comparison. *If n was 0x1000000 or greater, strncmp might compare fewer characters than it should because the high byte of n was effectively ignored, causing it to return 0 when it should not. Here is an example demonstrating these issues: #pragma memorymodel 1 #include <stdlib.h> #include <string.h> #include <stdio.h> #define LEN 100000 int main(void) { char *s1 = malloc(LEN+1); char *s2 = malloc(LEN+1); if (!s1 || !s2) return 0; for (unsigned long i = 0; i < LEN; i++) { s2[i] = s1[i] = '0' + (i & 0x07); } s1[LEN] = 'x'; return strncmp(s1,s2,0xFFFFFFFF); }
This commit is contained in:
parent
bbfad1e299
commit
9d42552756
|
@ -1070,7 +1070,6 @@ flag equ 1 return flag
|
||||||
|
|
||||||
ldy #0 scan until the end of string is reached
|
ldy #0 scan until the end of string is reached
|
||||||
ldx n+2 or a difference is found
|
ldx n+2 or a difference is found
|
||||||
bmi equal
|
|
||||||
bne lb0
|
bne lb0
|
||||||
ldx n
|
ldx n
|
||||||
beq equal
|
beq equal
|
||||||
|
@ -1082,9 +1081,11 @@ lb1 lda [s1],Y
|
||||||
bne lb3
|
bne lb3
|
||||||
dex
|
dex
|
||||||
bne lb1a
|
bne lb1a
|
||||||
lda n+2
|
ldx n+2
|
||||||
beq equal
|
beq equal
|
||||||
dec n+2
|
dex
|
||||||
|
stx n+2
|
||||||
|
ldx #0
|
||||||
lb1a iny
|
lb1a iny
|
||||||
bne lb1
|
bne lb1
|
||||||
inc s1+2
|
inc s1+2
|
||||||
|
|
Loading…
Reference in New Issue