# HG changeset patch # User William Astle # Date 1478230577 21600 # Node ID 9f0448022f1fd69422120672c3974dd50bf7cf77 # Parent 3aad0ff3c3be03088c3ff2e968122800dcc0eeb8 Fix address overflows in SREC and IHEX file formats Thanks to hider for pointing out an overflow that caused 16 bit addresses to be output as 5 hex digits in cases where an address counter wrapped. Simply mask the addresses down to 16 bits. diff -r 3aad0ff3c3be -r 9f0448022f1f lwasm/output.c --- a/lwasm/output.c Thu Sep 22 19:26:04 2016 -0600 +++ b/lwasm/output.c Thu Nov 03 21:36:17 2016 -0600 @@ -396,7 +396,7 @@ // if address jump or xxx0 address, start new line if ((rc == -1) || ((rc == 1) && (outaddr % RECLEN == 0))) { - fprintf(of, "\r\n%04X:", (unsigned int)outaddr); + fprintf(of, "\r\n%04X:", (unsigned int)(outaddr & 0xffff)); fprintf(of, "%02X", (unsigned char)outbyte); rc = -1; } @@ -459,7 +459,7 @@ if (recdlen > 0) { recsum = recdlen + 3; - fprintf(of, "S1%02X%04X", recdlen + 3, recaddr); + fprintf(of, "S1%02X%04X", recdlen + 3, recaddr & 0xffff); for (i = 0; i < recdlen; i++) { fprintf(of, "%02X", (unsigned char)recdata[i]); @@ -487,7 +487,7 @@ if (recdlen > 0) { recsum = recdlen + 3; - fprintf(of, "S1%02X%04X", recdlen + 3, recaddr); + fprintf(of, "S1%02X%04X", recdlen + 3, recaddr & 0xffff); for (i = 0; i < recdlen; i++) { fprintf(of, "%02X", (unsigned char)recdata[i]); @@ -513,7 +513,7 @@ recsum = 3; recsum += (as -> execaddr >> 8) & 0xFF; recsum += (as -> execaddr) & 0xFF; - fprintf(of, "S903%04X", as -> execaddr); + fprintf(of, "S903%04X", as -> execaddr & 0xffff); fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); } } @@ -548,7 +548,7 @@ if (recdlen > 0) { recsum = recdlen; - fprintf(of, ":%02X%04X00", recdlen, recaddr); + fprintf(of, ":%02X%04X00", recdlen, recaddr & 0xffff); for (i = 0; i < recdlen; i++) { fprintf(of, "%02X", (unsigned char)recdata[i]); @@ -576,7 +576,7 @@ if (recdlen > 0) { recsum = recdlen; - fprintf(of, ":%02X%04X00", recdlen, recaddr); + fprintf(of, ":%02X%04X00", recdlen, recaddr & 0xffff); for (i = 0; i < recdlen; i++) { fprintf(of, "%02X", (unsigned char)recdata[i]); diff -r 3aad0ff3c3be -r 9f0448022f1f lwlink/output.c --- a/lwlink/output.c Thu Sep 22 19:26:04 2016 -0600 +++ b/lwlink/output.c Thu Nov 03 21:36:17 2016 -0600 @@ -198,7 +198,7 @@ recdlen = (SRECLEN>remainingcodebytes)?remainingcodebytes:SRECLEN; recsum = recdlen + 3; codeaddr = recaddr - sectlist[sn].ptr -> loadaddress; - fprintf(of, "S1%02X%04X", recdlen + 3, recaddr); + fprintf(of, "S1%02X%04X", recdlen + 3, recaddr & 0xffff); for (i = 0; i < recdlen; i++) { fprintf(of, "%02X", sectcode[codeaddr+i]);