iraf-v216 · Code · Issues (50) · Pull requests (81)
iraf.net Issue #129
noao.digiphot.photcal parser buggy on 64 bit
 closed olebole opened this issue on 2018-01-31
olebole commented on 2018-01-31
The code in noao$digiphot/photcal/prcode.x and noao$digiphot/photcal/preval.gx intermix access to the Memi and Memr fields with the same pointers. For example the following lines in prcode.x:
Memi[code + cp - 1] = PEV_NUMBER  
cp = cp + 1  
Memr[code + cp - 1] = value  
or in preval.gx:
case PEV_NUMBER:  
    ip = ip + 1  
    sp = sp + 1  
    stack[sp] = Memr[code + ip]  
    if (IS_INDEFR (stack[sp]))  
        break  
  
case PEV_CATVAR:  
    ip = ip + 1  
    sp = sp + 1  
    stack[sp] = vdata[Memi[code + ip]]  
    if (IS_INDEFR (stack[sp]))  
        break  
This works on 32 bit, when the length of real and int are equal (4 bytes). On 64 bit (ILP64), however, real is still 4 bytes, while int has 8 bytes, and so one cannot use Memr and Memi access from the same pointer: Memr[ptr] will get the value from a different place in memory than Memi[ptr]. Depending on how the pointer was created, either the first or the second will cause an illegal memory access.
On 64 bit, this could be avoided by accessing Memd instead of Memr, since double also has a length of 8 bytes. This, however, does not solve #128; therefore it is an independent bug.
Fixed in #130
Last updated on 2018-02-01