Ignore:
Timestamp:
Apr 30, 2000, 6:31:47 PM (25 years ago)
Author:
sandervl
Message:

LocalGetFlags bugfix + some extra checks for invalid pointers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/os2heap.cpp

    r2803 r3464  
    1 /* $Id: os2heap.cpp,v 1.14 2000-02-16 14:25:43 sandervl Exp $ */
     1/* $Id: os2heap.cpp,v 1.15 2000-04-30 16:31:47 sandervl Exp $ */
    22
    33/*
     
    2727#include "vmutex.h"
    2828#include "initterm.h"
     29#include <odin32validate.h>
    2930
    3031#define DBG_LOCALLOG    DBG_os2heap
     
    181182 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    182183
    183   if(lpMem == NULL)
    184     return(FALSE);
     184  if((ULONG)lpMem > ADDRESS_SPACE_LIMIT) {
     185        //SvL: Some apps lock and unlock gdi handles; just ignore this here
     186        dprintf(("Lock: invalid address %x", lpMem));
     187        return FALSE;
     188  }
     189
     190  if(lpMem == NULL)
     191        return(FALSE);
    185192
    186193  if(helem->magic != MAGIC_NR_HEAP)
    187194  {
    188     dprintf(("OS2Heap::Lock ERROR BAD HEAP POINTER:%X\n", lpMem));
    189     return FALSE;
     195        dprintf(("OS2Heap::Lock ERROR BAD HEAP POINTER:%X\n", lpMem));
     196        return FALSE;
    190197  }
    191198
     
    199206{
    200207 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
     208
     209  if((ULONG)lpMem > ADDRESS_SPACE_LIMIT) {
     210        //SvL: Some apps lock and unlock gdi handles; just ignore this here
     211        dprintf(("Unlock: invalid address %x", lpMem));
     212        return FALSE;
     213  }
    201214
    202215  if(lpMem == NULL)
     
    223236
    224237  if(lpMem == NULL)
    225     return(FALSE);
     238    return(0);
    226239
    227240  if(helem->magic != MAGIC_NR_HEAP)
    228241  {
    229242    dprintf(("OS2Heap::GetFlags ERROR BAD HEAP POINTER:%X\n", lpMem));
    230     return FALSE;
    231   }
    232 
    233   return(helem->flags);
     243    return 0;
     244  }
     245
     246  return(helem->lockCnt | (helem->flags << 8));
    234247}
    235248//******************************************************************************
     
    239252 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    240253
    241   if(lpMem == NULL)
    242     return(666);
     254  if((ULONG)lpMem > ADDRESS_SPACE_LIMIT) {
     255        //SvL: Some apps lock and unlock gdi handles; just ignore this here
     256        dprintf(("GetLockCnt: invalid address %x", lpMem));
     257        return FALSE;
     258  }
     259
     260  if(lpMem == NULL)
     261        return(0);
    243262
    244263  if(helem->magic != MAGIC_NR_HEAP)
    245264  {
    246     dprintf(("OS2Heap::GetLockCnt ERROR BAD HEAP POINTER:%X\n", lpMem));
    247     return FALSE;
     265        dprintf(("OS2Heap::GetLockCnt ERROR BAD HEAP POINTER:%X\n", lpMem));
     266        return 0;
    248267  }
    249268
     
    302321
    303322  if(lpMem == NULL) {
    304     dprintf(("OS2Heap::Free lpMem == NULL\n"));
    305     return(FALSE);
     323        dprintf(("OS2Heap::Free lpMem == NULL\n"));
     324        return(FALSE);
    306325  }
    307326  /* verify lpMem address */
    308327  if (lpMem >= (LPVOID)ulMaxAddr || lpMem < (LPVOID)0x10000)
    309328  {
    310     dprintf(("OS2Heap::Free ERROR BAD HEAP POINTER:%X\n", lpMem));
    311     return FALSE;
     329        dprintf(("OS2Heap::Free ERROR BAD HEAP POINTER:%X\n", lpMem));
     330        return FALSE;
    312331  }
    313332
    314333  if(helem->magic != MAGIC_NR_HEAP)
    315334  {
    316     dprintf(("OS2Heap::Free ERROR BAD HEAP POINTER:%X\n", lpMem));
    317     return FALSE;
     335        dprintf(("OS2Heap::Free ERROR BAD HEAP POINTER:%X\n", lpMem));
     336        return FALSE;
    318337  }
    319338
     
    327346
    328347  if(helem->prev)
    329     helem->prev->next = helem->next;
     348        helem->prev->next = helem->next;
    330349  if(helem->next)
    331     helem->next->prev = helem->prev;
     350        helem->next->prev = helem->prev;
    332351  if(heapelem == helem)
    333     heapelem = heapelem->next;
     352        heapelem = heapelem->next;
    334353
    335354  if(hmutex) {
    336     hmutex->leave();
     355        hmutex->leave();
    337356  }
    338357
Note: See TracChangeset for help on using the changeset viewer.