void __inc_creation(const char *zeKey, const char *zeFile, long zeLine, const char *zeMsg, const void *zePtr, int zeSize) { __show_trace(zeKey, zeFile, zeLine, zeMsg, zePtr); __creation()[zeKey]++; __sizeof()[zeKey] = zeSize; }
void __dumpObjects(void) { unsigned int nb_err = 0; int total_size = 0; char fillChar = '_'; int widthColLibelle = 50; int widthColSizeOf = 5; int widthColItemsNumber = 8; std::cout << std::setfill('=') << "|" << std::setw(widthColLibelle + 2) << "" << "|" << std::setw(widthColSizeOf + 4) << "" << "|" << std::setw(widthColItemsNumber + 2) << "" << "|" << std::setw(widthColItemsNumber + 2) << "" << "|" << std::endl; std::cout << std::setfill(' ') << "| " << std::left << std::setw(widthColLibelle) << "Class Name" << std::right << " | " << std::setw(widthColSizeOf) << "Size" << " | " << std::setw(widthColItemsNumber) << "#Const" << " | " << std::setw(widthColItemsNumber) << "#Dest" << " |" << std::endl; std::cout << std::setfill('-') << "|" << std::setw(widthColLibelle + 2) << "" << "|" << std::setw(widthColSizeOf + 4) << "" << "|" << std::setw(widthColItemsNumber + 2) << "" << "|" << std::setw(widthColItemsNumber + 2) << "" << "|" << std::endl; // list of created objects std::map<std::string, std::string> res; for (DEBUG_MAP::const_iterator xx = __creation().begin(); xx != __creation().end(); ++xx) { std::stringstream stream; int zeCreatedObjs = xx->second; int zeDeletedObjts = -1; int size = __sizeof()[xx->first]; stream << std::setfill(fillChar = (fillChar == '_') ? ' ' : '_') << "| " << std::setw(widthColLibelle) << std::left << xx->first << " | " << std::right << std::setw(widthColSizeOf) << size << " o | " << std::setw(widthColItemsNumber) << zeCreatedObjs << " | "; if (size > 0) total_size += zeCreatedObjs * size; try { zeDeletedObjts = __deletion()[xx->first]; stream << std::setfill(fillChar) << std::setw(widthColItemsNumber) << zeDeletedObjts; } catch (NotFound &) { stream << std::setfill(fillChar) << std::setw(widthColItemsNumber) << "?????"; } stream << " |"; ; if (zeCreatedObjs != zeDeletedObjts) { nb_err += std::abs(zeDeletedObjts - zeCreatedObjs); stream << "<--- failed"; } res.insert(make_pair(xx->first, stream.str())); // res.push_back( stream.str() ); } // list of deleted objects, but not created (?) for (DEBUG_MAP::const_iterator xx = __deletion().begin(); xx != __deletion().end(); ++xx) { try { __creation()[xx->first]; } catch (NotFound &) { std::stringstream stream; fillChar = (fillChar == '_') ? ' ' : '_'; stream << std::setfill(fillChar = (fillChar == '_') ? ' ' : '_') << "| " << std::setw(widthColLibelle) << std::left << xx->first + " " << " | " << std::right << std::setw(widthColSizeOf) << __sizeof()[xx->first] << " o | " << std::setw(widthColItemsNumber) << "?????" << " | " << std::setw(widthColItemsNumber) << xx->second << " |<--- failed"; res.insert(make_pair(xx->first, stream.str())); // res.push_back( stream.str() ); nb_err += xx->second; } } for (const auto iter : res) { std::cout << iter.second << std::endl; } std::cout << std::setfill('-'); std::cout << "|-" << std::setw(widthColLibelle) << "" << "-|-" << std::setw(widthColSizeOf + 2) << "" << "-|-" << std::setw(widthColItemsNumber) << "" << "-|-" << std::setw(widthColItemsNumber) << "" << "-|" << std::endl; std::cout << std::setfill(' '); if (nb_err == 0) { std::cout << "| " << std::setw(widthColLibelle) << "NO MEMORY LEAK !" << " | " << std::setw(widthColSizeOf + widthColItemsNumber * 2 + 9) << "" << "|" << std::endl; } else { std::cout << "| " << std::setw(widthColLibelle) << "Memory leaks found " << "" << " | " << std::setw(widthColSizeOf + widthColItemsNumber * 2 - 6) << nb_err << " object(s) " << "|" << std::endl; } std::cout << "| " << std::setw(widthColLibelle) << "total " << " | " << std::setw(widthColSizeOf + widthColItemsNumber * 2 - 4) << total_size << " octet(s) " << "|" << std::endl; std::cout << std::setfill('=') << "|" << std::setw(widthColLibelle + 2) << "" << "|" << std::setw(widthColSizeOf + widthColItemsNumber * 2 + 10) << "" << "|" << std::endl; }
static int __zip_find_disk_trailer(int fd, off_t filesize, struct zip_disk_trailer *trailer, off_t *start) { char *buf, *end, *tail; off_t offset = 0, bufsize; struct zip_root_dirent dirent; uint32_t u_rootseek, shift = 0; int i; if(!trailer) { cli_errmsg("Unzip: __zip_find_disk_trailer: trailer == NULL\n"); return CL_ENULLARG; } if(filesize < __sizeof(struct zip_disk_trailer)) { cli_errmsg("Unzip: __zip_find_disk_trailer: File too short\n"); return CL_EFORMAT; } if(!(buf = cli_malloc(ZIPBUFSIZ))) return CL_EMEM; offset = filesize; while(1) { if(offset <= 0) { cli_dbgmsg("Unzip: __zip_find_disk_trailer: Central directory not found\n"); free(buf); return CL_EFORMAT; } if(offset >= ZIPBUFSIZ) { if(offset == filesize) offset -= ZIPBUFSIZ; else offset -= ZIPBUFSIZ - sizeof(struct zip_disk_trailer); bufsize = ZIPBUFSIZ; } else { if(filesize < ZIPBUFSIZ) bufsize = offset; else bufsize = ZIPBUFSIZ; offset = 0; } if(lseek(fd, offset, SEEK_SET) < 0) { cli_errmsg("Unzip: __zip_find_disk_trailer: Can't lseek descriptor %d\n", fd); free(buf); return CL_EIO; } if(cli_readn(fd, buf, (size_t) bufsize) < (ssize_t) bufsize) { cli_errmsg("Unzip: __zip_find_disk_trailer: Can't read %u bytes\n", (unsigned int) bufsize); free(buf); return CL_EIO; } end = buf + bufsize; for(tail = end - 1; tail >= buf; tail--) { if((*tail == 'P') && (end - tail >= __sizeof(struct zip_disk_trailer) - 2) && cli_readint32(tail) == ZIP_DISK_TRAILER_MAGIC) { if(end - tail >= __sizeof(struct zip_disk_trailer)) { memcpy(trailer, tail, sizeof(struct zip_disk_trailer)); } else { memcpy(trailer, tail, sizeof(struct zip_disk_trailer) - 2); trailer->z_comment = 0; } __fixup_rootseek(offset + tail - buf, trailer); u_rootseek = EC32(trailer->z_rootseek); if(u_rootseek > (uint32_t) filesize) { cli_dbgmsg("Unzip: __zip_find_disk_trailer: u_rootseek > filesize, continue search\n"); continue; } for(i = 0; i < 2; i++) { if(u_rootseek + shift + sizeof(dirent) < (uint32_t) filesize) { if(lseek(fd, u_rootseek + shift, SEEK_SET) < 0) { cli_errmsg("Unzip: __zip_find_disk_trailer: Can't lseek descriptor %d\n", fd); free(buf); return CL_EIO; } if(cli_readn(fd, &dirent, sizeof(dirent)) < __sizeof(dirent)) { cli_errmsg("Unzip: __zip_find_disk_trailer: Can't read %u bytes\n", (unsigned int) bufsize); free(buf); return CL_EIO; } if(EC32(dirent.z_magic) == ZIP_ROOT_DIRENT_MAGIC) { cli_dbgmsg("Unzip: __zip_find_disk_trailer: found file header at %u, shift %u\n", u_rootseek + shift, shift); free(buf); *start = shift; return CL_SUCCESS; } shift = *start; } } } } }