From 06f739a62390939d78c7cd39493d64ba5be7cc1a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Sep 2013 07:23:37 -0700 Subject: [PATCH 1/6] pass voxelServerConfig from domain-server through Assignment _payload to VoxelServer --- domain-server/src/main.cpp | 5 +- libraries/shared/src/Assignment.cpp | 7 ++- .../voxel-server-library/src/VoxelServer.cpp | 60 ++++++++++++++++++- .../voxel-server-library/src/VoxelServer.h | 4 ++ 4 files changed, 71 insertions(+), 5 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index fa6018b6c6..2ffad2f720 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -167,7 +167,10 @@ int main(int argc, const char* argv[]) { if (voxelServerConfig) { qDebug("Reading Voxel Server Configuration.\n"); qDebug() << " config: " << voxelServerConfig << "\n"; - voxelServerAssignment.setPayload((uchar*)voxelServerConfig, strlen(voxelServerConfig) + 1); + int payloadLength = strlen(voxelServerConfig) + sizeof(char); + uchar* payload = new uchar[payloadLength]; + memcpy(payload, voxelServerConfig, payloadLength); + voxelServerAssignment.setPayload(payload, payloadLength); } // construct a local socket to send with our created assignments to the global AS diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index e2608b230a..2fd5758007 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -85,17 +85,18 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : qDebug("Received a socket that cannot be unpacked!\n"); } } - + if (numBytes > numBytesRead) { _numPayloadBytes = numBytes - numBytesRead; - memcpy(_payload, dataBuffer + numBytesRead, numBytes - numBytesRead); + _payload = new uchar[_numPayloadBytes]; // <<< the code was not allocating _payload + memcpy(_payload, dataBuffer + numBytesRead, _numPayloadBytes); } } Assignment::~Assignment() { delete _attachedPublicSocket; delete _attachedLocalSocket; - delete _payload; + delete _payload; // <<< this probably needs to be delete[]??? _numPayloadBytes = 0; } diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index 257f9b2640..9dafeafeee 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -11,6 +11,9 @@ #include #include +#include +#include + #include #include #include @@ -64,6 +67,7 @@ VoxelServer::VoxelServer(Assignment::Command command, Assignment::Location locat _jurisdictionSender = NULL; _voxelServerPacketProcessor = NULL; _voxelPersistThread = NULL; + _parsedArgV = NULL; } VoxelServer::VoxelServer(const unsigned char* dataBuffer, int numBytes) : Assignment(dataBuffer, numBytes), @@ -86,6 +90,16 @@ VoxelServer::VoxelServer(const unsigned char* dataBuffer, int numBytes) : Assign _jurisdictionSender = NULL; _voxelServerPacketProcessor = NULL; _voxelPersistThread = NULL; + _parsedArgV = NULL; +} + +VoxelServer::~VoxelServer() { + if (_parsedArgV) { + for (int i = 0; i < _argc; i++) { + delete[] _parsedArgV[i]; + } + delete[] _parsedArgV; + } } void VoxelServer::setArguments(int argc, char** argv) { @@ -93,6 +107,44 @@ void VoxelServer::setArguments(int argc, char** argv) { _argv = const_cast(argv); } +void VoxelServer::parsePayload() { + + //uchar* getPayload() { return _payload; } + //int getNumPayloadBytes() const { return _numPayloadBytes; } + + if (getNumPayloadBytes() > 0) { + QString config((const char*)getPayload()); + + QString delimiterPattern(" "); + QStringList configList = config.split(delimiterPattern); + + int argCount = configList.size() + 2; + + printf("VoxelServer::parsePayload()... argCount=%d\n",argCount); + + _parsedArgV = new char*[argCount]; + const char* dummy = "dummy"; + _parsedArgV[0] = new char[strlen(dummy)+1]; + strcpy(_parsedArgV[0], dummy); + + for (int i = 1; i < argCount-1; i++) { + QString configItem = configList.at(i-1); + _parsedArgV[i] = new char[configItem.length() + 1]; + strcpy(_parsedArgV[i], configItem.toLocal8Bit().constData()); + printf("VoxelServer::parsePayload()... _parsedArgV[%d]=%s\n", i, _parsedArgV[i]); + } + _parsedArgV[argCount - 1] = new char[strlen(dummy)+1]; + strcpy(_parsedArgV[argCount - 1], dummy); + + setArguments(argCount, _parsedArgV); + + for (int i = 0; i < argCount; i++) { + printf("_argv[%d]=%s\n", i, _argv[i]); + } + + } +} + void VoxelServer::setupStandAlone(const char* domain, int port) { NodeList::createInstance(NODE_TYPE_VOXEL_SERVER, port); @@ -114,6 +166,12 @@ void VoxelServer::setupStandAlone(const char* domain, int port) { //int main(int argc, const char * argv[]) { void VoxelServer::run() { + + // Now would be a good time to parse our arguments, if we got them as assignment + if (getNumPayloadBytes() > 0) { + parsePayload(); + } + pthread_mutex_init(&_treeLock, NULL); qInstallMessageHandler(sharedMessageHandler); @@ -143,7 +201,7 @@ void VoxelServer::run() { _jurisdiction = new JurisdictionMap(jurisdictionRoot, jurisdictionEndNodes); } } - + // should we send environments? Default is yes, but this command line suppresses sending const char* DUMP_VOXELS_ON_MOVE = "--dumpVoxelsOnMove"; _dumpVoxelsOnMove = cmdOptionExists(_argc, _argv, DUMP_VOXELS_ON_MOVE); diff --git a/libraries/voxel-server-library/src/VoxelServer.h b/libraries/voxel-server-library/src/VoxelServer.h index 6eb412ea68..8ab18d8c46 100644 --- a/libraries/voxel-server-library/src/VoxelServer.h +++ b/libraries/voxel-server-library/src/VoxelServer.h @@ -27,6 +27,8 @@ public: VoxelServer(const unsigned char* dataBuffer, int numBytes); + ~VoxelServer(); + /// runs the voxel server assignment void run(); @@ -61,6 +63,7 @@ public: private: int _argc; const char** _argv; + char** _parsedArgV; bool _dontKillOnMissingDomain; char _voxelPersistFilename[MAX_FILENAME_LENGTH]; @@ -84,6 +87,7 @@ private: NodeWatcher _nodeWatcher; // used to cleanup AGENT data when agents are killed + void parsePayload(); }; #endif // __voxel_server__VoxelServer__ From 642b446d6f8081d9b6db02a55952dc58081a27e6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Sep 2013 07:30:04 -0700 Subject: [PATCH 2/6] tweak to payload parsing --- .../voxel-server-library/src/VoxelServer.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index 9dafeafeee..8e1f19954e 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -105,6 +105,12 @@ VoxelServer::~VoxelServer() { void VoxelServer::setArguments(int argc, char** argv) { _argc = argc; _argv = const_cast(argv); + + printf("VoxelServer::setArguments()\n"); + for (int i = 0; i < _argc; i++) { + printf("_argv[%d]=%s\n", i, _argv[i]); + } + } void VoxelServer::parsePayload() { @@ -118,30 +124,23 @@ void VoxelServer::parsePayload() { QString delimiterPattern(" "); QStringList configList = config.split(delimiterPattern); - int argCount = configList.size() + 2; + int argCount = configList.size() + 1; printf("VoxelServer::parsePayload()... argCount=%d\n",argCount); _parsedArgV = new char*[argCount]; - const char* dummy = "dummy"; + const char* dummy = "config-from-payload"; _parsedArgV[0] = new char[strlen(dummy)+1]; strcpy(_parsedArgV[0], dummy); - for (int i = 1; i < argCount-1; i++) { + for (int i = 1; i < argCount; i++) { QString configItem = configList.at(i-1); _parsedArgV[i] = new char[configItem.length() + 1]; strcpy(_parsedArgV[i], configItem.toLocal8Bit().constData()); printf("VoxelServer::parsePayload()... _parsedArgV[%d]=%s\n", i, _parsedArgV[i]); } - _parsedArgV[argCount - 1] = new char[strlen(dummy)+1]; - strcpy(_parsedArgV[argCount - 1], dummy); setArguments(argCount, _parsedArgV); - - for (int i = 0; i < argCount; i++) { - printf("_argv[%d]=%s\n", i, _argv[i]); - } - } } From 6355f677f7e0349451f953335e75725500f49de5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Sep 2013 13:19:19 -0700 Subject: [PATCH 3/6] have voxel server create assignments for child voxel servers --- .../voxel-server-library/src/VoxelServer.cpp | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index 8e1f19954e..8e78597041 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -115,14 +115,37 @@ void VoxelServer::setArguments(int argc, char** argv) { void VoxelServer::parsePayload() { - //uchar* getPayload() { return _payload; } - //int getNumPayloadBytes() const { return _numPayloadBytes; } - if (getNumPayloadBytes() > 0) { - QString config((const char*)getPayload()); + QString multiConfig((const char*)getPayload()); + QStringList multiConfigList = multiConfig.split(";"); + + // There there are multiple configs, then this instance will run the first + // config, and launch Assignment requests for the additional configs. + if (multiConfigList.size() > 1) { + printf("VoxelServer::parsePayload()... multiple Configs... config count=%d\n", multiConfigList.size()); - QString delimiterPattern(" "); - QStringList configList = config.split(delimiterPattern); + + // skip 0 - that's the one we'll run + for (int i = 1; i < multiConfigList.size(); i++) { + QString config = multiConfigList.at(i); + + printf(" config[%d]=%s\n", i, config.toLocal8Bit().constData()); + + Assignment voxelServerAssignment(Assignment::CreateCommand, + Assignment::VoxelServerType, + getLocation()); // use same location as we were created in. + + int payloadLength = config.length() + sizeof(char); + voxelServerAssignment.setPayload((uchar*)config.toLocal8Bit().constData(), payloadLength); + + printf(">>>>> SENDING ASSIGNMENT >>>>>>\n"); + NodeList::getInstance()->sendAssignment(voxelServerAssignment); + } + } + + // Now, parse the first config + QString config = multiConfigList.at(0); + QStringList configList = config.split(" "); int argCount = configList.size() + 1; From 65625c8e76d6b17cd0cb964a726975e832bf1096 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Sep 2013 13:23:34 -0700 Subject: [PATCH 4/6] match setPayload() behavior --- domain-server/src/main.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 698d732059..3e92be4003 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -156,9 +156,7 @@ int main(int argc, const char* argv[]) { qDebug("Reading Voxel Server Configuration.\n"); qDebug() << " config: " << voxelServerConfig << "\n"; int payloadLength = strlen(voxelServerConfig) + sizeof(char); - uchar* payload = new uchar[payloadLength]; - memcpy(payload, voxelServerConfig, payloadLength); - voxelServerAssignment.setPayload(payload, payloadLength); + voxelServerAssignment.setPayload((const uchar*)voxelServerConfig, payloadLength); } // construct a local socket to send with our created assignments to the global AS From ded7a9504ba17be036997f94625a4b0dafa6041c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Sep 2013 13:28:50 -0700 Subject: [PATCH 5/6] moved printf to qDebug --- .../voxel-server-library/src/VoxelServer.cpp | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index 8e78597041..6214005b0f 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -106,9 +107,9 @@ void VoxelServer::setArguments(int argc, char** argv) { _argc = argc; _argv = const_cast(argv); - printf("VoxelServer::setArguments()\n"); + qDebug("VoxelServer::setArguments()\n"); for (int i = 0; i < _argc; i++) { - printf("_argv[%d]=%s\n", i, _argv[i]); + qDebug("_argv[%d]=%s\n", i, _argv[i]); } } @@ -122,14 +123,13 @@ void VoxelServer::parsePayload() { // There there are multiple configs, then this instance will run the first // config, and launch Assignment requests for the additional configs. if (multiConfigList.size() > 1) { - printf("VoxelServer::parsePayload()... multiple Configs... config count=%d\n", multiConfigList.size()); - + qDebug("Voxel Server received assignment for multiple Configs... config count=%d\n", multiConfigList.size()); // skip 0 - that's the one we'll run for (int i = 1; i < multiConfigList.size(); i++) { QString config = multiConfigList.at(i); - printf(" config[%d]=%s\n", i, config.toLocal8Bit().constData()); + qDebug(" config[%d]=%s\n", i, config.toLocal8Bit().constData()); Assignment voxelServerAssignment(Assignment::CreateCommand, Assignment::VoxelServerType, @@ -138,7 +138,7 @@ void VoxelServer::parsePayload() { int payloadLength = config.length() + sizeof(char); voxelServerAssignment.setPayload((uchar*)config.toLocal8Bit().constData(), payloadLength); - printf(">>>>> SENDING ASSIGNMENT >>>>>>\n"); + qDebug("Requesting additional Voxel Server assignment to handle config %d\n", i); NodeList::getInstance()->sendAssignment(voxelServerAssignment); } } @@ -149,7 +149,7 @@ void VoxelServer::parsePayload() { int argCount = configList.size() + 1; - printf("VoxelServer::parsePayload()... argCount=%d\n",argCount); + qDebug("VoxelServer::parsePayload()... argCount=%d\n",argCount); _parsedArgV = new char*[argCount]; const char* dummy = "config-from-payload"; @@ -160,7 +160,7 @@ void VoxelServer::parsePayload() { QString configItem = configList.at(i-1); _parsedArgV[i] = new char[configItem.length() + 1]; strcpy(_parsedArgV[i], configItem.toLocal8Bit().constData()); - printf("VoxelServer::parsePayload()... _parsedArgV[%d]=%s\n", i, _parsedArgV[i]); + qDebug("VoxelServer::parsePayload()... _parsedArgV[%d]=%s\n", i, _parsedArgV[i]); } setArguments(argCount, _parsedArgV); @@ -174,7 +174,7 @@ void VoxelServer::setupStandAlone(const char* domain, int port) { const char* local = "--local"; _wantLocalDomain = strcmp(domain, local) == 0; if (_wantLocalDomain) { - printf("Local Domain MODE!\n"); + qDebug("Local Domain MODE!\n"); NodeList::getInstance()->setDomainIPToLocalhost(); } else { if (domain) { @@ -201,22 +201,22 @@ void VoxelServer::run() { const char* JURISDICTION_FILE = "--jurisdictionFile"; const char* jurisdictionFile = getCmdOption(_argc, _argv, JURISDICTION_FILE); if (jurisdictionFile) { - printf("jurisdictionFile=%s\n", jurisdictionFile); + qDebug("jurisdictionFile=%s\n", jurisdictionFile); - printf("about to readFromFile().... jurisdictionFile=%s\n", jurisdictionFile); + qDebug("about to readFromFile().... jurisdictionFile=%s\n", jurisdictionFile); _jurisdiction = new JurisdictionMap(jurisdictionFile); - printf("after readFromFile().... jurisdictionFile=%s\n", jurisdictionFile); + qDebug("after readFromFile().... jurisdictionFile=%s\n", jurisdictionFile); } else { const char* JURISDICTION_ROOT = "--jurisdictionRoot"; const char* jurisdictionRoot = getCmdOption(_argc, _argv, JURISDICTION_ROOT); if (jurisdictionRoot) { - printf("jurisdictionRoot=%s\n", jurisdictionRoot); + qDebug("jurisdictionRoot=%s\n", jurisdictionRoot); } const char* JURISDICTION_ENDNODES = "--jurisdictionEndNodes"; const char* jurisdictionEndNodes = getCmdOption(_argc, _argv, JURISDICTION_ENDNODES); if (jurisdictionEndNodes) { - printf("jurisdictionEndNodes=%s\n", jurisdictionEndNodes); + qDebug("jurisdictionEndNodes=%s\n", jurisdictionEndNodes); } if (jurisdictionRoot || jurisdictionEndNodes) { @@ -227,21 +227,21 @@ void VoxelServer::run() { // should we send environments? Default is yes, but this command line suppresses sending const char* DUMP_VOXELS_ON_MOVE = "--dumpVoxelsOnMove"; _dumpVoxelsOnMove = cmdOptionExists(_argc, _argv, DUMP_VOXELS_ON_MOVE); - printf("dumpVoxelsOnMove=%s\n", debug::valueOf(_dumpVoxelsOnMove)); + qDebug("dumpVoxelsOnMove=%s\n", debug::valueOf(_dumpVoxelsOnMove)); // should we send environments? Default is yes, but this command line suppresses sending const char* DONT_SEND_ENVIRONMENTS = "--dontSendEnvironments"; bool dontSendEnvironments = getCmdOption(_argc, _argv, DONT_SEND_ENVIRONMENTS); if (dontSendEnvironments) { - printf("Sending environments suppressed...\n"); + qDebug("Sending environments suppressed...\n"); _sendEnvironments = false; } else { // should we send environments? Default is yes, but this command line suppresses sending const char* MINIMAL_ENVIRONMENT = "--MinimalEnvironment"; _sendMinimalEnvironment = getCmdOption(_argc, _argv, MINIMAL_ENVIRONMENT); - printf("Using Minimal Environment=%s\n", debug::valueOf(_sendMinimalEnvironment)); + qDebug("Using Minimal Environment=%s\n", debug::valueOf(_sendMinimalEnvironment)); } - printf("Sending environments=%s\n", debug::valueOf(_sendEnvironments)); + qDebug("Sending environments=%s\n", debug::valueOf(_sendEnvironments)); NodeList* nodeList = NodeList::getInstance(); nodeList->setOwnerType(NODE_TYPE_VOXEL_SERVER); @@ -257,26 +257,26 @@ void VoxelServer::run() { const char* DISPLAY_VOXEL_STATS = "--displayVoxelStats"; _displayVoxelStats = getCmdOption(_argc, _argv, DISPLAY_VOXEL_STATS); - printf("displayVoxelStats=%s\n", debug::valueOf(_displayVoxelStats)); + qDebug("displayVoxelStats=%s\n", debug::valueOf(_displayVoxelStats)); const char* DEBUG_VOXEL_SENDING = "--debugVoxelSending"; _debugVoxelSending = getCmdOption(_argc, _argv, DEBUG_VOXEL_SENDING); - printf("debugVoxelSending=%s\n", debug::valueOf(_debugVoxelSending)); + qDebug("debugVoxelSending=%s\n", debug::valueOf(_debugVoxelSending)); const char* DEBUG_VOXEL_RECEIVING = "--debugVoxelReceiving"; _debugVoxelReceiving = getCmdOption(_argc, _argv, DEBUG_VOXEL_RECEIVING); - printf("debugVoxelReceiving=%s\n", debug::valueOf(_debugVoxelReceiving)); + qDebug("debugVoxelReceiving=%s\n", debug::valueOf(_debugVoxelReceiving)); const char* WANT_ANIMATION_DEBUG = "--shouldShowAnimationDebug"; _shouldShowAnimationDebug = getCmdOption(_argc, _argv, WANT_ANIMATION_DEBUG); - printf("shouldShowAnimationDebug=%s\n", debug::valueOf(_shouldShowAnimationDebug)); + qDebug("shouldShowAnimationDebug=%s\n", debug::valueOf(_shouldShowAnimationDebug)); // By default we will voxel persist, if you want to disable this, then pass in this parameter const char* NO_VOXEL_PERSIST = "--NoVoxelPersist"; if (getCmdOption(_argc, _argv, NO_VOXEL_PERSIST)) { _wantVoxelPersist = false; } - printf("wantVoxelPersist=%s\n", debug::valueOf(_wantVoxelPersist)); + qDebug("wantVoxelPersist=%s\n", debug::valueOf(_wantVoxelPersist)); // if we want Voxel Persistence, load the local file now... bool persistantFileRead = false; @@ -292,7 +292,7 @@ void VoxelServer::run() { strcpy(_voxelPersistFilename, LOCAL_VOXELS_PERSIST_FILE); } - printf("loading voxels from file: %s...\n", _voxelPersistFilename); + qDebug("loading voxels from file: %s...\n", _voxelPersistFilename); persistantFileRead = _serverTree.readFromSVOFile(_voxelPersistFilename); if (persistantFileRead) { @@ -301,15 +301,15 @@ void VoxelServer::run() { // after done inserting all these voxels, then reaverage colors _serverTree.reaverageVoxelColors(_serverTree.rootNode); - printf("Voxels reAveraged\n"); + qDebug("Voxels reAveraged\n"); } _serverTree.clearDirtyBit(); // the tree is clean since we just loaded it - printf("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead)); + qDebug("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead)); unsigned long nodeCount = _serverTree.rootNode->getSubTreeNodeCount(); unsigned long internalNodeCount = _serverTree.rootNode->getSubTreeInternalNodeCount(); unsigned long leafNodeCount = _serverTree.rootNode->getSubTreeLeafNodeCount(); - printf("Nodes after loading scene %lu nodes %lu internal %lu leaves\n", nodeCount, internalNodeCount, leafNodeCount); + qDebug("Nodes after loading scene %lu nodes %lu internal %lu leaves\n", nodeCount, internalNodeCount, leafNodeCount); // now set up VoxelPersistThread _voxelPersistThread = new VoxelPersistThread(&_serverTree, _voxelPersistFilename); @@ -334,7 +334,7 @@ void VoxelServer::run() { if (_packetsPerClientPerInterval < 1) { _packetsPerClientPerInterval = 1; } - printf("packetsPerSecond=%s PACKETS_PER_CLIENT_PER_INTERVAL=%d\n", packetsPerSecond, _packetsPerClientPerInterval); + qDebug("packetsPerSecond=%s PACKETS_PER_CLIENT_PER_INTERVAL=%d\n", packetsPerSecond, _packetsPerClientPerInterval); } // for now, initialize the environments with fixed values @@ -417,7 +417,7 @@ void VoxelServer::run() { } else if (_voxelServerPacketProcessor) { _voxelServerPacketProcessor->queueReceivedPacket(senderAddress, packetData, packetLength); } else { - printf("unknown packet ignored... packetData[0]=%c\n", packetData[0]); + qDebug("unknown packet ignored... packetData[0]=%c\n", packetData[0]); } } } From 80b1b810cefff4123bc7e78406ea108bab1708e7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Sep 2013 16:13:13 -0500 Subject: [PATCH 6/6] spacing fix --- libraries/voxel-server-library/src/VoxelServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index 6214005b0f..f9f61d1a35 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -153,12 +153,12 @@ void VoxelServer::parsePayload() { _parsedArgV = new char*[argCount]; const char* dummy = "config-from-payload"; - _parsedArgV[0] = new char[strlen(dummy)+1]; + _parsedArgV[0] = new char[strlen(dummy) + sizeof(char)]; strcpy(_parsedArgV[0], dummy); for (int i = 1; i < argCount; i++) { QString configItem = configList.at(i-1); - _parsedArgV[i] = new char[configItem.length() + 1]; + _parsedArgV[i] = new char[configItem.length() + sizeof(char)]; strcpy(_parsedArgV[i], configItem.toLocal8Bit().constData()); qDebug("VoxelServer::parsePayload()... _parsedArgV[%d]=%s\n", i, _parsedArgV[i]); }