diff --git a/source/g3d_viewer/renderer.cpp b/source/g3d_viewer/renderer.cpp index 45393b08..86266a09 100644 --- a/source/g3d_viewer/renderer.cpp +++ b/source/g3d_viewer/renderer.cpp @@ -14,7 +14,7 @@ #include "graphics_factory_gl.h" #include "graphics_interface.h" #include "config.h" -//#include +#include "platform_common.h" #include using namespace Shared::Graphics; diff --git a/source/glest_game/ai/path_finder.cpp b/source/glest_game/ai/path_finder.cpp index c916c97e..6a371557 100644 --- a/source/glest_game/ai/path_finder.cpp +++ b/source/glest_game/ai/path_finder.cpp @@ -195,10 +195,10 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStu UnitPathInterface *path= unit->getPath(); if(path->isEmpty() == false) { - if(dynamic_cast(path) != NULL) { + UnitPathBasic *basic_path = dynamic_cast(path); + if(basic_path != NULL) { //route cache - UnitPathBasic *basicPath = dynamic_cast(path); - Vec2i pos= basicPath->pop(frameIndex < 0); + Vec2i pos= basic_path->pop(frameIndex < 0); if(map->canMove(unit, unit->getPos(), pos)) { if(frameIndex < 0) { diff --git a/source/glest_game/facilities/game_util.cpp b/source/glest_game/facilities/game_util.cpp index 265f8b48..d810647c 100644 --- a/source/glest_game/facilities/game_util.cpp +++ b/source/glest_game/facilities/game_util.cpp @@ -318,8 +318,8 @@ string getGameReadWritePath(string lookupKey) { } } - if(path == "" && getenv("GLESTHOME") != NULL) { - path = getenv("GLESTHOME"); + if(path == "") { + path = safeCharPtrCopy(getenv("GLESTHOME"),8095); if(path != "" && EndsWith(path, "/") == false && EndsWith(path, "\\") == false) { path += "/"; } diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index 1bed1bb9..62772e18 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -3987,7 +3987,7 @@ void Renderer::MapRenderer::load(float coordStep) { //printf("Total # of layers for this map = %d totalCellCount = %d overall render reduction ratio = %d times\n",layers.size(),totalCellCount,(totalCellCount / layers.size())); } -template void* _bindVBO(GLuint vbo,std::vector buf,int target=GL_ARRAY_BUFFER_ARB) { +template void* _bindVBO(GLuint vbo,std::vector &buf,int target=GL_ARRAY_BUFFER_ARB) { void* result = NULL; if(vbo) { glBindBuffer(target,vbo); @@ -4025,25 +4025,6 @@ void Renderer::MapRenderer::Layer::renderVisibleLayer() { glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(Renderer::baseTexUnit); glDisableClientState(GL_TEXTURE_COORD_ARRAY); - - - - -// glVertexPointer(3,GL_FLOAT,0,_bindVBO(vbo_vertices,vertices)); -// glNormalPointer(GL_FLOAT,0,_bindVBO(vbo_normals,normals)); -// -// glClientActiveTexture(Renderer::fowTexUnit); -// glTexCoordPointer(2,GL_FLOAT,0,_bindVBO(vbo_fowTexCoords,fowTexCoords)); -// -// glClientActiveTexture(Renderer::baseTexUnit); -// glBindTexture(GL_TEXTURE_2D,textureHandle); -// glTexCoordPointer(2,GL_FLOAT,0,_bindVBO(vbo_surfTexCoords,surfTexCoords)); -// -// //glDrawElements(GL_TRIANGLES,indexCount,GL_UNSIGNED_INT,_bindVBO(vbo_indices,indices,GL_ELEMENT_ARRAY_BUFFER_ARB)); -// glDrawArrays(GL_TRIANGLE_STRIP, 0, vertices.size()); -// //unsigned short faceIndices[4] = {0, 1, 2, 3}; -// //glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, &faceIndices[0]); - } void Renderer::MapRenderer::Layer::render(VisibleQuadContainerCache &qCache) { diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index f5c308c4..97d80366 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -1757,7 +1757,8 @@ void MenuStateCustomGame::PlayNow(bool saveGame) { for(unsigned int j = 0; j < languageList.size(); ++j) { char szMsg[8096]=""; if(lang.hasString("NetworkSlotUnassignedError",languageList[j]) == true) { - strcpy(szMsg,lang.getString("NetworkSlotUnassignedError").c_str()); + string msg_string = lang.getString("NetworkSlotUnassignedError"); + strncpy(szMsg,msg_string.c_str(),std::min((int)msg_string.length(),8095)); } else { strcpy(szMsg,"Cannot start game, some player(s) are not in a network game slot!"); @@ -3512,8 +3513,10 @@ void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings,bool force gameSettings->setTeam(slotIndex, listBoxTeams[i].getSelectedItemIndex()); gameSettings->setStartLocationIndex(slotIndex, i); - if(listBoxControls[i].getSelectedItemIndex() == ctNetwork || listBoxControls[i].getSelectedItemIndex() == ctNetworkUnassigned) { - if(serverInterface->getSlot(i) != NULL && + if(listBoxControls[i].getSelectedItemIndex() == ctNetwork || + listBoxControls[i].getSelectedItemIndex() == ctNetworkUnassigned) { + if(serverInterface != NULL && + serverInterface->getSlot(i) != NULL && serverInterface->getSlot(i)->isConnected()) { gameSettings->setNetworkPlayerStatuses(slotIndex,serverInterface->getSlot(i)->getNetworkPlayerStatus()); diff --git a/source/glest_game/network/network_message.cpp b/source/glest_game/network/network_message.cpp index 77199671..2af29c37 100644 --- a/source/glest_game/network/network_message.cpp +++ b/source/glest_game/network/network_message.cpp @@ -2262,32 +2262,32 @@ bool NetworkMessageSynchNetworkGameDataStatus::receive(Socket* socket) { if(result == true && data.header.techCRCFileCount > 0) { fromEndianHeader(); // Here we loop possibly multiple times - int packetLoopCount = 1; + uint32 packetLoopCount = 1; if(data.header.techCRCFileCount > (uint32)NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount) { - packetLoopCount = (data.header.techCRCFileCount / NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount); - if(data.header.techCRCFileCount % NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount > 0) { + packetLoopCount = (data.header.techCRCFileCount / (uint32)NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount); + if(data.header.techCRCFileCount % (uint32)NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount > 0) { packetLoopCount++; } } if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] packetLoopCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,packetLoopCount); - for(int iPacketLoop = 0; iPacketLoop < packetLoopCount; ++iPacketLoop) { + for(uint32 iPacketLoop = 0; iPacketLoop < packetLoopCount; ++iPacketLoop) { - int packetIndex = iPacketLoop * NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount; - int maxFileCountPerPacket = maxFileCRCPacketCount; - int packetFileCount = min((uint32)maxFileCountPerPacket,data.header.techCRCFileCount - packetIndex); + uint32 packetIndex = iPacketLoop * (uint32)NetworkMessageSynchNetworkGameDataStatus::maxFileCRCPacketCount; + uint32 maxFileCountPerPacket = (uint32)maxFileCRCPacketCount; + uint32 packetFileCount = min((uint32)maxFileCountPerPacket,data.header.techCRCFileCount - packetIndex); - if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] iPacketLoop = %d, packetIndex = %d, packetFileCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,iPacketLoop,packetIndex,packetFileCount); + if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] iPacketLoop = %u, packetIndex = %u, packetFileCount = %u\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,iPacketLoop,packetIndex,packetFileCount); - result = NetworkMessage::receive(socket, &data.detail.techCRCFileList[packetIndex], (DetailSize1 * packetFileCount),true); + result = NetworkMessage::receive(socket, &data.detail.techCRCFileList[packetIndex], ((uint32)DetailSize1 * packetFileCount),true); if(result == true) { for(int i = 0; i < (int)data.header.techCRCFileCount; ++i) { data.detail.techCRCFileList[i].nullTerminate(); } // Wait a max of x seconds for this message - result = NetworkMessage::receive(socket, &data.detail.techCRCFileCRCList[packetIndex], (DetailSize2 * packetFileCount),true); + result = NetworkMessage::receive(socket, &data.detail.techCRCFileCRCList[packetIndex], ((uint32)DetailSize2 * packetFileCount),true); } } fromEndianDetail(); diff --git a/source/glest_game/types/faction_type.cpp b/source/glest_game/types/faction_type.cpp index f5be6762..bd8ae23f 100644 --- a/source/glest_game/types/faction_type.cpp +++ b/source/glest_game/types/faction_type.cpp @@ -450,6 +450,9 @@ std::vector FactionType::validateFactionType() { // exist in this faction if(cmdType->getClass() == ccBuild) { const BuildCommandType *build = dynamic_cast(cmdType); + if(build == NULL) { + throw megaglest_runtime_error("build == NULL"); + } for(int k = 0; k < build->getBuildingCount(); ++k) { const UnitType *buildUnit = build->getBuilding(k); diff --git a/source/glest_game/types/upgrade_type.h b/source/glest_game/types/upgrade_type.h index 4a9937d8..23a77121 100644 --- a/source/glest_game/types/upgrade_type.h +++ b/source/glest_game/types/upgrade_type.h @@ -81,6 +81,26 @@ protected: std::map prodSpeedMorphIsMultiplierValueList; public: + UpgradeTypeBase() { + maxHp = 0;; + maxHpIsMultiplier = false; + maxHpRegeneration = 0; + sight = 0; + sightIsMultiplier = false; + maxEp = 0;; + maxEpIsMultiplier = false; + maxEpRegeneration = 0; + armor = 0; + armorIsMultiplier = false; + attackStrength = 0; + attackStrengthIsMultiplier = false; + attackRange = 0; + attackRangeIsMultiplier = false; + moveSpeed = 0; + moveSpeedIsMultiplier = false; + prodSpeed = 0; + prodSpeedIsMultiplier = false; + } virtual ~UpgradeTypeBase() {} int getMaxHp() const {return maxHp;} diff --git a/source/glest_game/world/minimap.cpp b/source/glest_game/world/minimap.cpp index e8533e3b..f7d6d1d0 100644 --- a/source/glest_game/world/minimap.cpp +++ b/source/glest_game/world/minimap.cpp @@ -71,19 +71,19 @@ void Minimap::init(int w, int h, const World *world, bool fogOfWar) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - fowPixmap0->setPixels(&f); + fowPixmap0->setPixels(&f,1); if((this->gameSettings->getFlagTypes1() & ft1_show_map_resources) == ft1_show_map_resources) { f = 0.f; - fowPixmap1->setPixels(&f); + fowPixmap1->setPixels(&f,1); f = 0.5f; for (int y=1; y < scaledH - 1; ++y) { for (int x=1; x < scaledW - 1; ++x) { - fowPixmap1->setPixel(x, y, &f); + fowPixmap1->setPixel(x, y, &f,1); } } } else { - fowPixmap1->setPixels(&f); + fowPixmap1->setPixels(&f,1); } } @@ -99,8 +99,7 @@ void Minimap::init(int w, int h, const World *world, bool fogOfWar) { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] scaledW = %d, scaledH = %d, potW = %d, potH = %d\n",__FILE__,__FUNCTION__,__LINE__,scaledW,scaledH,potW,potH); fowTex->getPixmap()->init(potW, potH, 1); - const float *fPtr = &f; - fowTex->getPixmap()->setPixels(fPtr); + fowTex->getPixmap()->setPixels(&f,1); } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -269,7 +268,7 @@ void Minimap::computeTexture(const World *world) { const Map *map= world->getMap(); if(tex) { - tex->getPixmap()->setPixels(Vec4f(1.f, 1.f, 1.f, 0.1f).ptr()); + tex->getPixmap()->setPixels(Vec4f(1.f, 1.f, 1.f, 0.1f).ptr(),tex->getPixmap()->getComponents()); for(int j=0; jgetPixmap()->getH(); ++j){ for(int i=0; igetPixmap()->getW(); ++i){ diff --git a/source/shared_lib/include/graphics/pixmap.h b/source/shared_lib/include/graphics/pixmap.h index 110d2859..4bf388e7 100644 --- a/source/shared_lib/include/graphics/pixmap.h +++ b/source/shared_lib/include/graphics/pixmap.h @@ -272,8 +272,8 @@ public: float getComponentf(int x, int y, int component) const; //set data - void setPixel(int x, int y, const uint8 *value); - void setPixel(int x, int y, const float32 *value); + void setPixel(int x, int y, const uint8 *value, int arraySize); + void setPixel(int x, int y, const float32 *value, int arraySize); void setComponent(int x, int y, int component, uint8 value); void setComponent(int x, int y, int component, float32 value); @@ -283,8 +283,8 @@ public: void setPixel(int x, int y, float p); //mass set - void setPixels(const uint8 *value); - void setPixels(const float32 *value); + void setPixels(const uint8 *value, int arraySize); + void setPixels(const float32 *value, int arraySize); void setComponents(int component, uint8 value); void setComponents(int component, float32 value); diff --git a/source/shared_lib/include/platform/common/platform_common.h b/source/shared_lib/include/platform/common/platform_common.h index a46ac4f2..fdaf1a23 100644 --- a/source/shared_lib/include/platform/common/platform_common.h +++ b/source/shared_lib/include/platform/common/platform_common.h @@ -303,6 +303,8 @@ bool valid_utf8_file(const char* file_name); string getFileTextContents(string path); +string safeCharPtrCopy(const char *ptr, int maxLength=-1); + class ValueCheckerVault { protected: diff --git a/source/shared_lib/sources/compression/compression_utils.cpp b/source/shared_lib/sources/compression/compression_utils.cpp index b3818108..33b1d599 100644 --- a/source/shared_lib/sources/compression/compression_utils.cpp +++ b/source/shared_lib/sources/compression/compression_utils.cpp @@ -205,6 +205,7 @@ int zipfile_tool(int argc, const char *argv[]) { if (inflateInit(&stream)) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("inflateInit() failed!\n"); + if(pInfile) fclose(pInfile); return EXIT_FAILURE; } @@ -243,6 +244,7 @@ int zipfile_tool(int argc, const char *argv[]) { } else if (status != Z_OK) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("inflate() failed with status %i!\n", status); + if(pOutfile) fclose(pOutfile); return EXIT_FAILURE; } } diff --git a/source/shared_lib/sources/feathery_ftp/ftpAccount.c b/source/shared_lib/sources/feathery_ftp/ftpAccount.c index e592894c..b6419ddb 100644 --- a/source/shared_lib/sources/feathery_ftp/ftpAccount.c +++ b/source/shared_lib/sources/feathery_ftp/ftpAccount.c @@ -35,9 +35,9 @@ */ typedef struct { - char name[MAXLEN_USERNAME]; ///< user name - char passw[MAXLEN_PASSWORD]; ///< password of the account - char ftpRoot[MAX_PATH_LEN]; ///< root path of the user account on the server + char name[MAXLEN_USERNAME+1]; ///< user name + char passw[MAXLEN_PASSWORD+1]; ///< password of the account + char ftpRoot[MAX_PATH_LEN+1]; ///< root path of the user account on the server int ftpRootLen; ///< length of ftpRoot int accRights; ///< access rights of a account diff --git a/source/shared_lib/sources/feathery_ftp/ftpSession.c b/source/shared_lib/sources/feathery_ftp/ftpSession.c index 64d71479..2aa96380 100644 --- a/source/shared_lib/sources/feathery_ftp/ftpSession.c +++ b/source/shared_lib/sources/feathery_ftp/ftpSession.c @@ -257,7 +257,8 @@ const char* ftpGetRealPath(int id, const char* path, int normalize) int ftpRootLen; int len; - strcpy(ftpRoot,ftpGetRoot(sessions[id].userId, &len)); + const char *ftp_rootget = ftpGetRoot(sessions[id].userId, &len); + snprintf(ftpRoot,2047,"%s",ftp_rootget); ftpRootLen = strlen(ftpRoot); if(ftpRootLen > 0 && ftpRoot[ftpRootLen-1] != '/') { strcat(ftpRoot,"/"); @@ -313,7 +314,7 @@ if(VERBOSE_MODE_ENABLED) printf("ftpChangeDir path [%s] realPath [%s] sessions[i if(ftpStat(realPath, &fileInfo) || (fileInfo.type != TYPE_DIR)) // directory accessible? return -2; - strncpy(sessions[id].workingDir, &realPath[len], MAX_PATH_LEN); // apply path + strncpy(sessions[id].workingDir, &realPath[len], MAX_PATH_LEN-1); // apply path if(sessions[id].workingDir[0] == '\0') strcpy(sessions[id].workingDir, "/"); diff --git a/source/shared_lib/sources/feathery_ftp/ftpTargetWin32.c b/source/shared_lib/sources/feathery_ftp/ftpTargetWin32.c index f10f51be..758cd75c 100644 --- a/source/shared_lib/sources/feathery_ftp/ftpTargetWin32.c +++ b/source/shared_lib/sources/feathery_ftp/ftpTargetWin32.c @@ -97,7 +97,7 @@ void* ftpOpenDir(const char* path) if(p) { p->findHandle = INVALID_HANDLE_VALUE; - strcpy(p->path, path); + strncpy(p->path, path,strlen(path)); } return p; } @@ -281,7 +281,7 @@ socket_t ftpEstablishDataConnection(int passive, ip_t *ip, port_t *port, int ses BOOL on = 1; unsigned len; dataSocket = socket(AF_INET, SOCK_STREAM, 0); - if(dataSocket < 0) + if(dataSocket == INVALID_SOCKET) return -1; if(!passive) @@ -308,6 +308,8 @@ socket_t ftpEstablishDataConnection(int passive, ip_t *ip, port_t *port, int ses clientAddr.sin_family = AF_INET; clientAddr.sin_addr.s_addr = htonl(*ip); clientAddr.sin_port = htons(*port); + clientAddr.sin_zero[0] = 0; + if(connect(dataSocket, (struct sockaddr *)&clientAddr, sizeof(clientAddr))) { if(VERBOSE_MODE_ENABLED) printf("In ftpEstablishDataConnection #3 about to Close socket = %d, for sessionId = %d\n",dataSocket, sessionId); @@ -325,6 +327,7 @@ socket_t ftpEstablishDataConnection(int passive, ip_t *ip, port_t *port, int ses myAddr.sin_family = AF_INET; myAddr.sin_addr.s_addr = INADDR_ANY; myAddr.sin_port = htons(passivePort); + myAddr.sin_zero[0] = 0; //myAddr.sin_port = htons(ftpGetPassivePort() + sessionId); if(setsockopt(dataSocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on))) @@ -388,10 +391,10 @@ socket_t ftpAcceptDataConnection(socket_t listner) len = sizeof(clientinfo); dataSocket = accept(listner, (struct sockaddr *)&clientinfo, &len); - if(dataSocket < 0) + if(dataSocket == INVALID_SOCKET) { if(VERBOSE_MODE_ENABLED) printf("ERROR In ftpAcceptDataConnection accept failed, dataSocket = %d, listner = %d\n", dataSocket,listner); - dataSocket = -1; + //dataSocket = -1; } else { @@ -410,7 +413,7 @@ socket_t ftpAcceptDataConnection(socket_t listner) ftpUntrackSocket(dataSocket); ftpCloseSocket(&dataSocket); - dataSocket = -1; + dataSocket = INVALID_SOCKET; } return (socket_t)dataSocket; @@ -424,28 +427,27 @@ socket_t ftpCreateServerSocket(int portNumber) int val = 1; theServer = socket(AF_INET, SOCK_STREAM, 0); - if(theServer < 0) + if(theServer == INVALID_SOCKET) return -1; serverinfo.sin_family = AF_INET; serverinfo.sin_addr.s_addr = INADDR_ANY; serverinfo.sin_port = htons(portNumber); + serverinfo.sin_zero[0] = 0; len = sizeof(serverinfo); - setsockopt(theServer, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val)); + int opt_result = setsockopt(theServer, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val)); - if(bind(theServer, (struct sockaddr *)&serverinfo, len)) - { - if(VERBOSE_MODE_ENABLED) printf("\nERROR In ftpCreateServerSocket bind FAILED about to close listener socket = %d\n",theServer); + if(bind(theServer, (struct sockaddr *)&serverinfo, len)) { + if(VERBOSE_MODE_ENABLED) printf("\nERROR In ftpCreateServerSocket bind FAILED about to close listener socket = %d opt_result = %d\n",theServer,opt_result); ftpUntrackSocket(theServer); ftpCloseSocket(&theServer); return -2; } - if(listen(theServer, 100)) - { - if(VERBOSE_MODE_ENABLED) printf("\nERROR In ftpCreateServerSocket listen FAILED about to close listener socket = %d\n",theServer); + if(listen(theServer, 100)) { + if(VERBOSE_MODE_ENABLED) printf("\nERROR In ftpCreateServerSocket listen FAILED about to close listener socket = %d opt_result = %d\n",theServer,opt_result); ftpUntrackSocket(theServer); ftpCloseSocket(&theServer); diff --git a/source/shared_lib/sources/graphics/font.cpp b/source/shared_lib/sources/graphics/font.cpp index 2b62e805..ee7c7a4b 100644 --- a/source/shared_lib/sources/graphics/font.cpp +++ b/source/shared_lib/sources/graphics/font.cpp @@ -639,14 +639,14 @@ void CHECK_FONT_PATH(const char *filename,const char *fontFamily,const char **fo } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#1 Searching for font file [%s] result [%s]\n",(*path != NULL ? *path : "null"),(*font != NULL ? *font : "null")); if( *font == NULL && fontFamily != NULL && strlen(fontFamily) > 0) { - if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 Searching for font [%s] family [%s]\n",(*font != NULL ? *font : "null"),(fontFamily != NULL ? fontFamily : "null")); + if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 Searching for font [%s] family [%s]\n",(*font != NULL ? *font : "null"),fontFamily); string fileFound = findFontFamily(*font, fontFamily); if(fileFound != "") { - *path = fileFound.c_str(); + //*path = fileFound.c_str(); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 candidate font file found [%s]\n",fileFound.c_str()); - if( *path != NULL && strlen(*path) > 0 && fileExists(*path) == true ) { + if( fileFound.length() > 0 && fileExists(fileFound) == true ) { if(*font) free((void*)*font); - *font = strdup(*path); + *font = strdup(fileFound.c_str()); if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 candidate font file has been set[%s]\n",(*font != NULL ? *font : "null")); } *path = NULL; @@ -677,10 +677,11 @@ const char* findFont(const char *firstFontToTry,const char *firstFontFamilyToTry } // Get user-specified font path - if(getenv("MEGAGLEST_FONT") != NULL || getenv("MEGAGLEST_FONT_FAMILY") != NULL) { - - if(getenv("MEGAGLEST_FONT") != NULL) { - tryFont = getenv("MEGAGLEST_FONT"); + string megaglest_font = safeCharPtrCopy(getenv("MEGAGLEST_FONT"),8095); + string megaglest_font_family = safeCharPtrCopy(getenv("MEGAGLEST_FONT_FAMILY"),8095); + if(megaglest_font != "" || megaglest_font_family != "") { + if(megaglest_font != "") { + tryFont = megaglest_font; if(Text::DEFAULT_FONT_PATH_ABSOLUTE != "") { tryFont = Text::DEFAULT_FONT_PATH_ABSOLUTE + "/" + extractFileFromDirectoryPath(tryFont); @@ -689,10 +690,10 @@ const char* findFont(const char *firstFontToTry,const char *firstFontFamilyToTry replaceAll(tryFont, "/", "\\"); #endif - CHECK_FONT_PATH(tryFont.c_str(),getenv("MEGAGLEST_FONT_FAMILY"),&font,&path); + CHECK_FONT_PATH(tryFont.c_str(),megaglest_font_family.c_str(),&font,&path); } else { - CHECK_FONT_PATH(NULL,getenv("MEGAGLEST_FONT_FAMILY"),&font,&path); + CHECK_FONT_PATH(NULL,megaglest_font_family.c_str(),&font,&path); } } diff --git a/source/shared_lib/sources/graphics/model.cpp b/source/shared_lib/sources/graphics/model.cpp index 7c0e61fa..f5bc089a 100644 --- a/source/shared_lib/sources/graphics/model.cpp +++ b/source/shared_lib/sources/graphics/model.cpp @@ -1216,7 +1216,7 @@ void Model::loadG3d(const string &path, bool deletePixMapAfterLoad, f = NULL; char fileType[4]=""; memset(&fileType[0],0,4); - memcpy(&fileType[0],fileHeader.id,4); + memcpy(&fileType[0],fileHeader.id,3); printf("In [%s::%s] file = [%s] fileheader.id = [%s][%c]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,path.c_str(),fileType,fileHeader.id[0]); throw megaglest_runtime_error("Not a valid G3D model",true); } @@ -1270,7 +1270,7 @@ void Model::loadG3d(const string &path, bool deletePixMapAfterLoad, } meshCount = Shared::PlatformByteOrder::fromCommonEndian(meshCount); - if(SystemFlags::VERBOSE_MODE_ENABLED) printf("meshCount = %d\n",meshCount); + if(SystemFlags::VERBOSE_MODE_ENABLED) printf("meshCount = %u\n",meshCount); try { meshes= new Mesh[meshCount]; diff --git a/source/shared_lib/sources/graphics/pixmap.cpp b/source/shared_lib/sources/graphics/pixmap.cpp index 80f48099..bc05d509 100644 --- a/source/shared_lib/sources/graphics/pixmap.cpp +++ b/source/shared_lib/sources/graphics/pixmap.cpp @@ -1154,9 +1154,14 @@ float Pixmap2D::getComponentf(int x, int y, int component) const { return c; } -void Pixmap2D::setPixel(int x, int y, const uint8 *value) { - for(int i=0; i components) { + char szBuf[8096]; + snprintf(szBuf,8096,"Invalid pixmap arraySize: %d for [%s], h = %d, w = %d, components = %d x = %d y = %d\n",arraySize,path.c_str(),h,w,components,x,y); + throw megaglest_runtime_error(szBuf); + } + for(int i = 0; i < components; ++i) { + int index = (w * y + x) * components + i; if(index < 0 || (unsigned int)index >= getPixelByteCount()) { char szBuf[8096]; snprintf(szBuf,8096,"Invalid pixmap index: %d for [%s], h = %d, w = %d, components = %d x = %d y = %d\n",index,path.c_str(),h,w,components,x,y); @@ -1168,8 +1173,14 @@ void Pixmap2D::setPixel(int x, int y, const uint8 *value) { CalculatePixelsCRC(pixels,getPixelByteCount(), crc); } -void Pixmap2D::setPixel(int x, int y, const float32 *value) { - for(int i=0; i components) { + char szBuf[8096]; + snprintf(szBuf,8096,"Invalid pixmap arraySize: %d for [%s], h = %d, w = %d, components = %d x = %d y = %d\n",arraySize,path.c_str(),h,w,components,x,y); + throw megaglest_runtime_error(szBuf); + } + + for(int i = 0; i < components; ++i) { int index = (w*y+x)*components+i; if(index < 0 || (unsigned int)index >= getPixelByteCount()) { char szBuf[8096]; @@ -1244,19 +1255,19 @@ void Pixmap2D::setPixel(int x, int y, float p) { CalculatePixelsCRC(pixels,getPixelByteCount(), crc); } -void Pixmap2D::setPixels(const uint8 *value){ - for(int i=0; igetW(); ++i){ - for(int j=0; jgetH(); ++j){ + for(int i = 0; i < sourcePixmap->getW(); ++i) { + for(int j = 0; j < sourcePixmap->getH(); ++j) { sourcePixmap->getPixel(i, j, pixel); - setPixel(i+x, j+y, pixel); + setPixel(i+x, j+y, pixel, components); } } CalculatePixelsCRC(pixels,getPixelByteCount(), crc); @@ -1393,10 +1404,10 @@ void Pixmap2D::copyImagePart(int x, int y, const Pixmap2D *sourcePixmap){ uint8 *pixel= new uint8[components]; - for(int i=x; igetPixel(i, j, pixel); - setPixel(i-x, j-y, pixel); + setPixel(i-x, j-y, pixel, components); } } CalculatePixelsCRC(pixels,getPixelByteCount(), crc); diff --git a/source/shared_lib/sources/map/map_preview.cpp b/source/shared_lib/sources/map/map_preview.cpp index 3f50c983..3cd5429c 100644 --- a/source/shared_lib/sources/map/map_preview.cpp +++ b/source/shared_lib/sources/map/map_preview.cpp @@ -922,6 +922,7 @@ void MapPreview::saveToFile(const string &path) { strncpy(header.title, title.c_str(), MAX_TITLE_LENGTH); strncpy(header.author, author.c_str(), MAX_AUTHOR_LENGTH); strncpy(header.version2.short_desc, desc.c_str(), MAX_DESCRIPTION_LENGTH_VERSION2); + header.version2.short_desc[MAX_DESCRIPTION_LENGTH_VERSION2] = 0; header.version2.magic= 0x01020304; header.version2.cliffLevel= cliffLevel; header.version2.cameraHeight= cameraHeight; diff --git a/source/shared_lib/sources/platform/common/platform_common.cpp b/source/shared_lib/sources/platform/common/platform_common.cpp index de23be57..269506e8 100644 --- a/source/shared_lib/sources/platform/common/platform_common.cpp +++ b/source/shared_lib/sources/platform/common/platform_common.cpp @@ -348,8 +348,8 @@ void findAll(const string &path, vector &results, bool cutExtension, boo /** Stupid win32 is searching for all files without extension when *. is * specified as wildcard */ - if(mypath.size() >= 2 && mypath.compare(max((size_t)0,mypath.size() - 2), 2, "*.") == 0) { - mypath = mypath.substr(0, max((size_t)0,mypath.size() - 2)); + if((int)mypath.size() >= 2 && mypath.compare(max((int)0,(int)mypath.size() - 2), 2, "*.") == 0) { + mypath = mypath.substr(0, max((int)0,(int)mypath.size() - 2)); mypath += "*"; } @@ -525,7 +525,7 @@ bool EndsWith(const string &str, const string& key) { bool result = false; if (str.length() >= key.length()) { - result = (0 == str.compare(max((size_t)0,str.length() - key.length()), key.length(), key)); + result = (0 == str.compare(max((int)0,(int)str.length() - (int)key.length()), key.length(), key)); } return result; @@ -1017,8 +1017,8 @@ uint32 getFolderTreeContentsCheckSumRecursively(const string &path, const string // Stupid win32 is searching for all files without extension when *. is // specified as wildcard // - if(mypath.size() >= 2 && mypath.compare(max((size_t)0,mypath.size() - 2), 2, "*.") == 0) { - mypath = mypath.substr(0, max((size_t)0,mypath.size() - 2)); + if((int)mypath.size() >= 2 && mypath.compare(max((int)0,(int)mypath.size() - 2), 2, "*.") == 0) { + mypath = mypath.substr(0, max((int)0,(int)mypath.size() - 2)); mypath += "*"; } @@ -1187,8 +1187,8 @@ vector getFolderTreeContentsListRecursively(const string &path, const st /** Stupid win32 is searching for all files without extension when *. is * specified as wildcard */ - if(mypath.size() >= 2 && mypath.compare(max((size_t)0,mypath.size() - 2), 2, "*.") == 0) { - mypath = mypath.substr(0, max((size_t)0,mypath.size() - 2)); + if((int)mypath.size() >= 2 && mypath.compare(max((int)0,(int)mypath.size() - 2), 2, "*.") == 0) { + mypath = mypath.substr(0, max((int)0,(int)mypath.size() - 2)); mypath += "*"; } @@ -1338,8 +1338,8 @@ vector > getFolderTreeContentsCheckSumListRecursively(c /** Stupid win32 is searching for all files without extension when *. is * specified as wildcard */ - if(mypath.size() >= 2 && mypath.compare(max((size_t)0,mypath.size() - 2), 2, "*.") == 0) { - mypath = mypath.substr(0, max((size_t)0,mypath.size() - 2)); + if((int)mypath.size() >= 2 && mypath.compare(max((int)0,(int)mypath.size() - 2), 2, "*.") == 0) { + mypath = mypath.substr(0, max((int)0,(int)mypath.size() - 2)); mypath += "*"; } @@ -2424,17 +2424,29 @@ void ValueCheckerVault::checkItemInVault(const void *ptr,int value) const { string getUserHome() { string home_folder = ""; - const char *homedir = getenv("HOME"); - if (!homedir) { + home_folder = safeCharPtrCopy(getenv("HOME"),8095); + if(home_folder == "") { #if _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED struct passwd *pw = getpwuid(getuid()); - homedir = pw->pw_dir; -#else - homedir = ""; + home_folder = safeCharPtrCopy(pw->pw_dir,8095); #endif } - home_folder = homedir; return home_folder; } +string safeCharPtrCopy(const char *ptr,int maxLength) { + if(ptr == NULL) { + return ""; + } + if(maxLength <= 0) { + maxLength = 8096; + } + + char *pBuffer = new char[maxLength+1]; + memset(pBuffer,0,maxLength+1); + memcpy(pBuffer,ptr,std::min((int)strlen(ptr),maxLength)); + return pBuffer; +} + + }}//end namespace diff --git a/source/shared_lib/sources/platform/posix/ircclient.cpp b/source/shared_lib/sources/platform/posix/ircclient.cpp index fb22d142..2c5863c6 100644 --- a/source/shared_lib/sources/platform/posix/ircclient.cpp +++ b/source/shared_lib/sources/platform/posix/ircclient.cpp @@ -75,7 +75,7 @@ void dump_event (irc_session_t * session, const char * event, const char * origi if ( cnt ) { strcat (buf, "|"); } - strcat (buf, params[cnt]); + strncat (buf, params[cnt],std::min((int)strlen(params[cnt]),511)); } addlog ("Event \"%s\", origin: \"%s\", params: %d [%s]", event, origin ? origin : "NULL", cnt, buf); diff --git a/source/shared_lib/sources/platform/posix/socket.cpp b/source/shared_lib/sources/platform/posix/socket.cpp index 9de53f26..dd1c479c 100644 --- a/source/shared_lib/sources/platform/posix/socket.cpp +++ b/source/shared_lib/sources/platform/posix/socket.cpp @@ -549,17 +549,16 @@ string getNetworkInterfaceBroadcastAddress(string ipAddress) MIB_IPADDRTABLE * ipTable = NULL; { ULONG bufLen = 0; - for (int i=0; i<5; i++) - { + for (int i = 0; i < 5; i++) { DWORD ipRet = GetIpAddrTable(ipTable, &bufLen, false); - if (ipRet == ERROR_INSUFFICIENT_BUFFER) - { + if (ipRet == ERROR_INSUFFICIENT_BUFFER) { free(ipTable); // in case we had previously allocated it ipTable = (MIB_IPADDRTABLE *) malloc(bufLen); } - else if (ipRet == NO_ERROR) break; - else - { + else if(ipRet == NO_ERROR) { + break; + } + else { free(ipTable); ipTable = NULL; break; @@ -567,8 +566,7 @@ string getNetworkInterfaceBroadcastAddress(string ipAddress) } } - if (ipTable) - { + if (ipTable) { // Try to get the Adapters-info table, so we can given useful names to the IP // addresses we are returning. Gotta call GetAdaptersInfo() up to 5 times to handle // the potential race condition between the size-query call and the get-data call. @@ -576,17 +574,16 @@ string getNetworkInterfaceBroadcastAddress(string ipAddress) IP_ADAPTER_INFO * pAdapterInfo = NULL; { ULONG bufLen = 0; - for (int i=0; i<5; i++) - { + for (int i = 0; i < 5; i++) { DWORD apRet = GetAdaptersInfo(pAdapterInfo, &bufLen); - if (apRet == ERROR_BUFFER_OVERFLOW) - { + if (apRet == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); // in case we had previously allocated it pAdapterInfo = (IP_ADAPTER_INFO *) malloc(bufLen); } - else if (apRet == ERROR_SUCCESS) break; - else - { + else if(apRet == ERROR_SUCCESS) { + break; + } + else { free(pAdapterInfo); pAdapterInfo = NULL; break; @@ -594,23 +591,18 @@ string getNetworkInterfaceBroadcastAddress(string ipAddress) } } - for (DWORD i=0; idwNumEntries; i++) - { + for (DWORD i = 0; i < ipTable->dwNumEntries; i++) { const MIB_IPADDRROW & row = ipTable->table[i]; // Now lookup the appropriate adaptor-name in the pAdaptorInfos, if we can find it const char * name = NULL; //const char * desc = NULL; - if (pAdapterInfo) - { + if (pAdapterInfo) { IP_ADAPTER_INFO * next = pAdapterInfo; - while((next)&&(name==NULL)) - { + while((next)&&(name==NULL)) { IP_ADDR_STRING * ipAddr = &next->IpAddressList; - while(ipAddr) - { - if (Inet_AtoN(ipAddr->IpAddress.String) == ntohl(row.dwAddr)) - { + while(ipAddr) { + if (Inet_AtoN(ipAddr->IpAddress.String) == ntohl(row.dwAddr)) { name = next->AdapterName; //desc = next->Description; break; @@ -620,19 +612,23 @@ string getNetworkInterfaceBroadcastAddress(string ipAddress) next = next->Next; } } - if (name == NULL) - { + if (name == NULL) { name = ""; } uint32 ipAddr = ntohl(row.dwAddr); uint32 netmask = ntohl(row.dwMask); uint32 baddr = ipAddr & netmask; - if (row.dwBCastAddr) baddr |= ~netmask; + if (row.dwBCastAddr) { + baddr |= ~netmask; + } - char ifaAddrStr[32]; Ip::Inet_NtoA(ipAddr, ifaAddrStr); - char maskAddrStr[32]; Ip::Inet_NtoA(netmask, maskAddrStr); - char dstAddrStr[32]; Ip::Inet_NtoA(baddr, dstAddrStr); + char ifaAddrStr[32]; + Ip::Inet_NtoA(ipAddr, ifaAddrStr); + char maskAddrStr[32]; + Ip::Inet_NtoA(netmask, maskAddrStr); + char dstAddrStr[32]; + Ip::Inet_NtoA(baddr, dstAddrStr); //printf(" Found interface: name=[%s] desc=[%s] address=[%s] netmask=[%s] broadcastAddr=[%s]\n", name, desc?desc:"unavailable", ifaAddrStr, maskAddrStr, dstAddrStr); if(strcmp(ifaAddrStr,ipAddress.c_str()) == 0) { broadCastAddress = dstAddrStr; @@ -2434,6 +2430,9 @@ Socket *ServerSocket::accept(bool errorOnFail) { throwException(szBuf); } else { + ::close(newSock); + newSock = INVALID_SOCKET; + return NULL; } @@ -2925,7 +2924,8 @@ void BroadCastSocketThread::execute() { strcat(buff,":"); strcat(buff,ipList[idx1].c_str()); strcat(buff,":"); - strcat(buff,intToStr(this->boundPort).c_str()); + string port_string = intToStr(this->boundPort); + strncat(buff,port_string.c_str(),std::min((int)port_string.length(),100)); } if(difftime((long int)time(NULL),elapsed) >= 1 && getQuitStatus() == false) { diff --git a/source/shared_lib/sources/platform/win32/platform_util.cpp b/source/shared_lib/sources/platform/win32/platform_util.cpp index d5ce2c37..c906c9dd 100644 --- a/source/shared_lib/sources/platform/win32/platform_util.cpp +++ b/source/shared_lib/sources/platform/win32/platform_util.cpp @@ -260,6 +260,10 @@ string PlatformExceptionHandler::getStackTrace() { SymCleanup(hProcess); } #endif + +#ifndef __MINGW32__ + delete [] pSym; +#endif return result; } diff --git a/source/tools/glexemel/g2xml.c b/source/tools/glexemel/g2xml.c index 423a8c59..31465fa4 100644 --- a/source/tools/glexemel/g2xml.c +++ b/source/tools/glexemel/g2xml.c @@ -130,7 +130,7 @@ int g3d2xml(FILE *infile, FILE *outfile) struct ModelHeader modelHeader; struct MeshHeader meshHeader; size_t nBytes; - uint8 textureName[NAMESIZE]; + uint8 textureName[NAMESIZE+1]; float32 *fdata; uint32 *idata; unsigned int ii, jj, kk; @@ -226,7 +226,8 @@ int g3d2xml(FILE *infile, FILE *outfile) /* read / write the texture name if present */ if (meshHeader.textures) { - nBytes = sizeof(textureName); + memset(&textureName[0],0,NAMESIZE+1); + nBytes = NAMESIZE; if (fread(&textureName, nBytes, 1, infile) != 1) { printf("Could not read texture name!\n"); diff --git a/source/tools/glexemel/xml2g.c b/source/tools/glexemel/xml2g.c index a935fb36..39b5345c 100644 --- a/source/tools/glexemel/xml2g.c +++ b/source/tools/glexemel/xml2g.c @@ -245,7 +245,7 @@ int processMesh(xmlNode *n, FILE *outfile) float32 color[3]; struct MeshHeader mh; - uint8 texname[NAMESIZE]; + uint8 texname[NAMESIZE+1]; int foundFlag = FALSE; xmlNode *texn = NULL; @@ -304,7 +304,7 @@ int processMesh(xmlNode *n, FILE *outfile) printf("Could not find element!\n"); return FALSE; } - memset(texname, 0, NAMESIZE); + memset(texname, 0, NAMESIZE+1); strncpy((char*)texname, (char*)xmlGetProp(texn, (xmlChar*)"name"), NAMESIZE); fwrite(texname, NAMESIZE, 1, outfile);