diff --git a/tool/CommandDownload.cpp b/tool/CommandDownload.cpp index 169be24c..0dfc2588 100644 --- a/tool/CommandDownload.cpp +++ b/tool/CommandDownload.cpp @@ -176,8 +176,8 @@ void CommandDownload::execute(const StringVector &args) data.data = new uint8_t[data.data_size + 1]; try { - data.data_size = interpretAsType( - dataType, contents, data.data, data.data_size); + data.data_size = interpretAsType(dataType, contents, data.data, + data.data_size + 1); } catch (SizeException &e) { delete [] data.data; throwCommandException(e.what()); @@ -197,8 +197,8 @@ void CommandDownload::execute(const StringVector &args) data.data = new uint8_t[data.data_size + 1]; try { - data.data_size = interpretAsType( - dataType, args[valueIndex], data.data, data.data_size); + data.data_size = interpretAsType(dataType, args[valueIndex], + data.data, data.data_size + 1); } catch (SizeException &e) { delete [] data.data; throwCommandException(e.what()); diff --git a/tool/CommandRegWrite.cpp b/tool/CommandRegWrite.cpp index d00040fa..0e12e2be 100644 --- a/tool/CommandRegWrite.cpp +++ b/tool/CommandRegWrite.cpp @@ -131,11 +131,11 @@ void CommandRegWrite::execute(const StringVector &args) io.size = 1024; // FIXME } - io.data = new uint8_t[io.size]; + io.data = new uint8_t[io.size + 1]; try { io.size = interpretAsType( - dataType, args[1], io.data, io.size); + dataType, args[1], io.data, io.size + 1); } catch (SizeException &e) { delete [] io.data; throwCommandException(e.what()); diff --git a/tool/CommandSoeWrite.cpp b/tool/CommandSoeWrite.cpp index a96312e6..76068b71 100644 --- a/tool/CommandSoeWrite.cpp +++ b/tool/CommandSoeWrite.cpp @@ -149,18 +149,18 @@ void CommandSoeWrite::execute(const StringVector &args) memSize = dataType->byteSize; } else { // guess string type size - memSize = args[valueArgIndex].size() + 1; + memSize = args[valueArgIndex].size(); if (!memSize) { err << "Empty argument not allowed."; throwInvalidUsageException(err); } } - ioctl.data = new uint8_t[memSize]; + ioctl.data = new uint8_t[memSize + 1]; try { ioctl.data_size = interpretAsType( - dataType, args[valueArgIndex], ioctl.data, memSize); + dataType, args[valueArgIndex], ioctl.data, memSize + 1); } catch (SizeException &e) { delete [] ioctl.data; throwCommandException(e.what()); diff --git a/tool/DataTypeHandler.cpp b/tool/DataTypeHandler.cpp index fe37de28..048733b9 100644 --- a/tool/DataTypeHandler.cpp +++ b/tool/DataTypeHandler.cpp @@ -191,14 +191,14 @@ size_t DataTypeHandler::interpretAsType( case 0x000a: // octet_string case 0x000b: // unicode_string dataSize = str.str().size(); - if (dataSize > targetSize) { + if (dataSize + 1 > targetSize) { // leave room for terminating \0 stringstream err; err << "String too large (" - << dataSize << " > " << targetSize << ")"; + << dataSize << " > " << targetSize - 1 << ")"; throw SizeException(err.str()); } - //str >> (char *) target; - str.read((char *) target, dataSize + 1); // including \0 FIXME + str.read((char *) target, dataSize); + ((char *) target)[dataSize] = 0; // terminating \0 break; case 0x0011: // double {