| 196 | } |
| 197 | |
| 198 | omError_t omDoCheckBinAddr(void* addr, void* bin_size, omTrackFlags_t flags, char level, |
| 199 | omError_t report, OM_FLR_DECL) |
| 200 | { |
| 201 | omBinPage page = omGetBinPageOfAddr(addr); |
| 202 | omBinPageRegion region = page->region; |
| 203 | omBin bin = omGetBinOfPage(page); |
| 204 | |
| 205 | omAssume(omIsBinPageAddr(addr)); |
| 206 | omAssume(! omCheckPtr(addr, 0, OM_FLR)); |
| 207 | |
| 208 | omAddrCheckReturnCorrupted(! omIsKnownTopBin(bin, ! omIsBinAddrTrackAddr(addr))); |
| 209 | |
| 210 | if (flags & OM_FBINADDR && flags & OM_FSIZE) |
| 211 | omAddrCheckReturnError(bin->sizeW*SIZEOF_LONG != (size_t) bin_size, omError_WrongSize); |
| 212 | |
| 213 | if (level > 1) |
| 214 | { |
| 215 | omAddrCheckReturnError(omIsAddrOnFreeBinPage(addr), omError_FreedAddr); |
| 216 | omAddrCheckReturnError(omFindRegionOfAddr(addr) != region, omError_FreedAddrOrMemoryCorrupted); |
| 217 | omAddrCheckReturnError(!omIsOnGList(bin->last_page, prev, page), omError_FreedAddrOrMemoryCorrupted); |
| 218 | |
| 219 | if (flags & OM_FUSED) |
| 220 | { |
| 221 | omAddrCheckReturnError(omIsOnList(page->current, addr), omError_FreedAddr); |
| 222 | omAddrCheckReturnError((level > 1) && omIsInKeptAddrList(addr), omError_FreedAddr); |
| 223 | } |
| 224 | } |
| 225 | else |
| 226 | { |
| 227 | omAddrCheckReturnError(omCheckPtr(region, omError_MaxError, OM_FLR_VAL), omError_FreedAddrOrMemoryCorrupted); |
| 228 | } |
| 229 | |
| 230 | |
| 231 | /* Check that addr is aligned within page of bin */ |
| 232 | omAddrCheckReturnError((bin->max_blocks >= 1) && |
| 233 | ( ( ( (unsigned long) addr) |
| 234 | - ((unsigned long) page) |
| 235 | - SIZEOF_OM_BIN_PAGE_HEADER) |
| 236 | % (bin->sizeW * SIZEOF_VOIDP) |
| 237 | != 0), omError_FalseAddr); |
| 238 | |
| 239 | /* Check that specified bin or size is correct */ |
| 240 | omAddrCheckReturnError((flags & OM_FBIN) && bin_size != NULL |
| 241 | && ((omBin) bin_size) != omGetTopBinOfAddr(addr), omError_WrongBin); |
| 242 | |
| 243 | if ((flags & OM_FSIZE) && (!(flags & OM_FSLOPPY) || (size_t) bin_size > 0)) |
| 244 | { |
| 245 | size_t size = (size_t) bin_size; |
| 246 | omAssume(!omIsBinAddrTrackAddr(addr)); |
| 247 | omAddrCheckReturnError((bin->sizeW << LOG_SIZEOF_LONG) < OM_ALIGN_SIZE(size), omError_WrongSize); |
| 248 | } |
| 249 | |
| 250 | return omError_NoError; |
| 251 | } |
| 252 | |
| 253 | omError_t omDoCheckBin(omBin bin, int normal_bin, char level, |
| 254 | omError_t report, OM_FLR_DECL) |
no test coverage detected