short MEM_freeN(void *vmemh) /* anders compileertie niet meer */ { short error = 0; MemTail *memt; MemHead *memh= vmemh; const char *name; if (memh == NULL){ MemorY_ErroR("free","attempt to free NULL pointer"); /* print_error(err_stream, "%d\n", (memh+4000)->tag1); */ return(-1); } if(sizeof(intptr_t)==8) { if (((intptr_t) memh) & 0x7) { MemorY_ErroR("free","attempt to free illegal pointer"); return(-1); } } else { if (((intptr_t) memh) & 0x3) { MemorY_ErroR("free","attempt to free illegal pointer"); return(-1); } } memh--; if(memh->tag1 == MEMFREE && memh->tag2 == MEMFREE) { MemorY_ErroR(memh->name,"double free"); return(-1); } mem_lock_thread(); if ((memh->tag1 == MEMTAG1) && (memh->tag2 == MEMTAG2) && ((memh->len & 0x3) == 0)) { memt = (MemTail *)(((char *) memh) + sizeof(MemHead) + memh->len); if (memt->tag3 == MEMTAG3){ memh->tag1 = MEMFREE; memh->tag2 = MEMFREE; memt->tag3 = MEMFREE; /* after tags !!! */ rem_memblock(memh); mem_unlock_thread(); return(0); } error = 2; MemorY_ErroR(memh->name,"end corrupt"); name = check_memlist(memh); if (name != NULL){ if (name != memh->name) MemorY_ErroR(name,"is also corrupt"); } } else{ error = -1; name = check_memlist(memh); if (name == NULL) MemorY_ErroR("free","pointer not in memlist"); else MemorY_ErroR(name,"error in header"); } totblock--; /* here a DUMP should happen */ mem_unlock_thread(); return(error); }
static const char *check_memlist(MemHead *memh) { MemHead *forw,*back,*forwok,*backok; const char *name; forw = membase->first; if (forw) forw = MEMNEXT(forw); forwok = NULL; while(forw){ if (forw->tag1 != MEMTAG1 || forw->tag2 != MEMTAG2) break; forwok = forw; if (forw->next) forw = MEMNEXT(forw->next); else forw = NULL; } back = (MemHead *) membase->last; if (back) back = MEMNEXT(back); backok = NULL; while(back){ if (back->tag1 != MEMTAG1 || back->tag2 != MEMTAG2) break; backok = back; if (back->prev) back = MEMNEXT(back->prev); else back = NULL; } if (forw != back) return ("MORE THAN 1 MEMORYBLOCK CORRUPT"); if (forw == NULL && back == NULL){ /* geen foute headers gevonden dan maar op zoek naar memblock*/ forw = membase->first; if (forw) forw = MEMNEXT(forw); forwok = NULL; while(forw){ if (forw == memh) break; if (forw->tag1 != MEMTAG1 || forw->tag2 != MEMTAG2) break; forwok = forw; if (forw->next) forw = MEMNEXT(forw->next); else forw = NULL; } if (forw == NULL) return NULL; back = (MemHead *) membase->last; if (back) back = MEMNEXT(back); backok = NULL; while(back){ if (back == memh) break; if (back->tag1 != MEMTAG1 || back->tag2 != MEMTAG2) break; backok = back; if (back->prev) back = MEMNEXT(back->prev); else back = NULL; } } if (forwok) name = forwok->nextname; else name = "No name found"; if (forw == memh){ /* voor alle zekerheid wordt dit block maar uit de lijst gehaald */ if (forwok){ if (backok){ forwok->next = (MemHead *)&backok->next; backok->prev = (MemHead *)&forwok->next; forwok->nextname = backok->name; } else{ forwok->next = NULL; membase->last = (struct localLink *) &forwok->next; /* membase->last = (struct Link *) &forwok->next; */ } } else{ if (backok){ backok->prev = NULL; membase->first = &backok->next; } else{ membase->first = membase->last = NULL; } } } else{ MemorY_ErroR(name,"Additional error in header"); return("Additional error in header"); } return(name); }
short MEM_freeN(void *vmemh) /* anders compileertie niet meer */ { short error = 0; MemTail *memt; MemHead *memh= (MemHead*)vmemh; // (MemHead*) Added by Swanny 19/05/05 char *name; if (memh == 0){ MemorY_ErroR("free","attempt to free NULL pointer"); /* print_error(err_stream, "%d\n", (memh+4000)->tag1); */ return(-1); } if(sizeof(long)==8) { if (((long) memh) & 0x7) { MemorY_ErroR("free","attempt to free illegal pointer"); return(-1); } } else { if (((long) memh) & 0x3) { MemorY_ErroR("free","attempt to free illegal pointer"); return(-1); } } memh--; if(memh->tag1 == MEMFREE && memh->tag2 == MEMFREE) { MemorY_ErroR(memh->name,"double free"); return(-1); } if ((memh->tag1 == MEMTAG1) && (memh->tag2 == MEMTAG2) && ((memh->len & 0x3) == 0)) { memt = (MemTail *)(((char *) memh) + sizeof(MemHead) + memh->len); if (memt->tag3 == MEMTAG3){ memh->tag1 = MEMFREE; memh->tag2 = MEMFREE; memt->tag3 = MEMFREE; /* na tags !!! */ rem_memblock(memh); return(0); } error = 2; MemorY_ErroR(memh->name,"end corrupt"); name = check_memlist(memh); if (name != 0){ if (name != memh->name) MemorY_ErroR(name,"is also corrupt"); } } else{ error = -1; name = check_memlist(memh); if (name == 0) MemorY_ErroR("free","pointer not in memlist"); else MemorY_ErroR(name,"error in header"); } totblock--; /* hier moet een DUMP plaatsvinden */ return(error); }