fixed possible paramblock memory overwrite in EXE_Load
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@244
This commit is contained in:
parent
80ac7ce34a
commit
0e36af0899
1 changed files with 10 additions and 5 deletions
|
@ -297,7 +297,7 @@ static bool COM_Load(char * name,ParamBlock * block,Bit8u flag) {
|
|||
}
|
||||
|
||||
|
||||
static bool EXE_Load(char * name,ParamBlock * block,Bit8u flag) {
|
||||
static bool EXE_Load(char * name,ParamBlock* _block,Bit8u flag) {
|
||||
|
||||
EXE_Header header;
|
||||
Bit16u fhandle;Bit32u i;
|
||||
|
@ -305,12 +305,17 @@ static bool EXE_Load(char * name,ParamBlock * block,Bit8u flag) {
|
|||
Bit16u envseg,pspseg,exeseg;
|
||||
Bit32u imagesize,headersize;
|
||||
|
||||
// During loading process, th param-block-mem might be overwritten (HostPt!) and
|
||||
// therefore change the relocation address, so save these values.
|
||||
ParamBlock block;
|
||||
memcpy(&block,_block,sizeof(ParamBlock));
|
||||
|
||||
PSP * callpsp=(PSP *)HostMake(dos.psp,0);
|
||||
|
||||
if (!DOS_OpenFile(name,OPEN_READ,&fhandle)) return false;
|
||||
if (flag!=OVERLAY) {
|
||||
/* Allocate a new Environment */
|
||||
envseg=block->exec.envseg;
|
||||
envseg=block.exec.envseg;
|
||||
if (!MakeEnv(name,&envseg)) return false;
|
||||
};
|
||||
|
||||
|
@ -345,11 +350,11 @@ static bool EXE_Load(char * name,ParamBlock * block,Bit8u flag) {
|
|||
return false;
|
||||
}
|
||||
SetupPSP(pspseg,size,envseg);
|
||||
SetupCMDLine(pspseg,block);
|
||||
SetupCMDLine(pspseg,&block);
|
||||
exeseg=pspseg+16;
|
||||
} else {
|
||||
/* For OVERLAY */
|
||||
exeseg=block->overlay.loadseg;
|
||||
exeseg=block.overlay.loadseg;
|
||||
}
|
||||
/* Load the image in 32k blocks */
|
||||
DOS_SeekFile(fhandle,&headersize,0);
|
||||
|
@ -384,7 +389,7 @@ static bool EXE_Load(char * name,ParamBlock * block,Bit8u flag) {
|
|||
PhysPt address=Real2Phys(RealMake(RealSeg(reloc)+exeseg,RealOff(reloc)));
|
||||
Bit16u change=mem_readw(address);
|
||||
if (flag==OVERLAY) {
|
||||
change+=block->overlay.relocation;
|
||||
change+=block.overlay.relocation;
|
||||
} else {
|
||||
change+=exeseg;
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue