diff --git a/source/amx/amxdbg.c b/source/amx/amxdbg.c index b100d28..224d1c7 100644 --- a/source/amx/amxdbg.c +++ b/source/amx/amxdbg.c @@ -64,7 +64,8 @@ int AMXAPI dbg_LoadInfo(AMX_DBG *amxdbg, FILE *fp) memset(&amxhdr, 0, sizeof amxhdr); fseek(fp, 0L, SEEK_SET); - fread(&amxhdr, sizeof amxhdr, 1, fp); + if (fread(&amxhdr, sizeof amxhdr, 1, fp) == 0) + return AMX_ERR_FORMAT; #if BYTE_ORDER==BIG_ENDIAN amx_Align32((uint32_t*)&amxhdr.size); amx_Align16(&amxhdr.magic); @@ -77,7 +78,8 @@ int AMXAPI dbg_LoadInfo(AMX_DBG *amxdbg, FILE *fp) fseek(fp, amxhdr.size, SEEK_SET); memset(&dbghdr, 0, sizeof(AMX_DBG_HDR)); - fread(&dbghdr, sizeof(AMX_DBG_HDR), 1, fp); + if (fread(&dbghdr, sizeof(AMX_DBG_HDR), 1, fp) == 0) + return AMX_ERR_FORMAT; #if BYTE_ORDER==BIG_ENDIAN amx_Align32((uint32_t*)&dbghdr.size); @@ -119,7 +121,10 @@ int AMXAPI dbg_LoadInfo(AMX_DBG *amxdbg, FILE *fp) /* load the entire symbolic information block into memory */ memcpy(amxdbg->hdr, &dbghdr, sizeof dbghdr); - fread(amxdbg->hdr + 1, 1, (size_t)(dbghdr.size - sizeof dbghdr), fp); + if (fread(amxdbg->hdr + 1, 1, (size_t)(dbghdr.size - sizeof dbghdr), fp) == 0) { + dbg_FreeInfo(amxdbg); + return AMX_ERR_FORMAT; + } /* if */ /* run through the file, fix alignment issues and set up table pointers */ ptr = (unsigned char *)(amxdbg->hdr + 1); diff --git a/source/compiler/pawndisasm.c b/source/compiler/pawndisasm.c index b592f4b..6f62966 100644 --- a/source/compiler/pawndisasm.c +++ b/source/compiler/pawndisasm.c @@ -21,6 +21,7 @@ * Version: $Id$ */ #include +#include #include #include #include @@ -227,7 +228,8 @@ void print_funcname(FILE *ftxt,cell address) { int idx,numpublics; AMX_FUNCSTUBNT func; - char name[sNAMEMAX+1]={'\0'}; + char name[sNAMEMAX+1]; + size_t namelen=0; const char *dbgname; /* first look up the address in the debug info and, if failed, find it @@ -238,15 +240,16 @@ void print_funcname(FILE *ftxt,cell address) numpublics=(amxhdr.natives-amxhdr.publics)/sizeof(AMX_FUNCSTUBNT); fseek(fpamx,amxhdr.publics,SEEK_SET); for (idx=0; idx0) + if (namelen>0) fprintf(ftxt,"\t; %s",name); } @@ -324,25 +327,26 @@ cell do_sysreq(FILE *ftxt,const cell *params,cell opcode,cell cip) int idx,numnatives,nameoffset; AMX_FUNCSTUBNT func; char name[sNAMEMAX+1]; + size_t namelen=0; nameoffset=-1; - name[0]='\0'; /* find the address in the native function table */ numnatives=(amxhdr.libraries-amxhdr.natives)/sizeof(AMX_FUNCSTUBNT); fseek(fpamx,amxhdr.natives,SEEK_SET); for (idx=0; idx=0) { fseek(fpamx,nameoffset,SEEK_SET); - fread(name,1,sNAMEMAX+1,fpamx); + namelen=fread(name,1,sNAMEMAX+1,fpamx); } /* if */ print_opcode(ftxt,opcode,cip); fprintf(ftxt,"%08"PRIxC,*params); - if (strlen(name)>0) + if (namelen>0) fprintf(ftxt,"\t; %s",name); fprintf(ftxt,"\n"); return 2; @@ -381,7 +385,7 @@ cell do_symbol(FILE *ftxt,const cell *params,cell opcode,cell cip) return 0; } -static void expand(unsigned char *code, long codesize, long memsize) +static void expand(unsigned char *code,long codesize,long memsize) { ucell c; struct { @@ -488,7 +492,11 @@ int main(int argc,char *argv[]) /* load header */ fseek(fpamx,0,SEEK_SET); - fread(&amxhdr,sizeof amxhdr,1,fpamx); + if (fread(&amxhdr,sizeof amxhdr,1,fpamx)==0) { + printf("Unable to read AMX header: %s\n", + feof(fpamx) ? "End of file reached" : strerror(errno)); + return 1; + } /* if */ if (amxhdr.magic!=AMX_MAGIC) { printf("Not a valid AMX file\n"); return 1; @@ -513,9 +521,13 @@ int main(int argc,char *argv[]) /* read and expand the file */ fseek(fpamx,amxhdr.cod,SEEK_SET); - fread(code,1,codesize,fpamx); + if (fread(code,1,codesize,fpamx)