diff options
author | Neil <nyamatongwe@gmail.com> | 2013-12-22 18:00:45 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2013-12-22 18:00:45 +1100 |
commit | ca1a5ea845c283a9c84fd2ae9f6d152cca354183 (patch) | |
tree | d851b7c06cc7763849d504b58797199c9032b441 /src | |
parent | 0b56a6704d1c64644d5bfef318806f8490d649ec (diff) | |
download | scintilla-mirror-ca1a5ea845c283a9c84fd2ae9f6d152cca354183.tar.gz |
Avoid unsafe strcpy, strncpy, and strcat replacing with safer functions which
guaranty termination where possible.
Diffstat (limited to 'src')
-rw-r--r-- | src/CaseConvert.cxx | 6 | ||||
-rw-r--r-- | src/Editor.cxx | 67 | ||||
-rw-r--r-- | src/Editor.h | 1 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 2 | ||||
-rw-r--r-- | src/ViewStyle.cxx | 5 |
5 files changed, 36 insertions, 45 deletions
diff --git a/src/CaseConvert.cxx b/src/CaseConvert.cxx index f983458c0..badaca411 100644 --- a/src/CaseConvert.cxx +++ b/src/CaseConvert.cxx @@ -13,6 +13,7 @@ #include <vector> #include <algorithm> +#include "StringCopy.h" #include "CaseConvert.h" #include "UniConversion.h" #include "UnicodeFromUTF8.h" @@ -367,6 +368,9 @@ class CaseConverter : public ICaseConverter { enum { maxConversionLength=6 }; struct ConversionString { char conversion[maxConversionLength+1]; + ConversionString() { + conversion[0] = '\0'; + } }; // Conversions are initially store in a vector of structs but then decomposed into // parallel arrays as that is about 10% faster to search. @@ -374,7 +378,7 @@ class CaseConverter : public ICaseConverter { int character; ConversionString conversion; CharacterConversion(int character_=0, const char *conversion_="") : character(character_) { - strcpy(conversion.conversion, conversion_); + StringCopy(conversion.conversion, conversion_); } bool operator<(const CharacterConversion &other) const { return character < other.character; diff --git a/src/Editor.cxx b/src/Editor.cxx index f254af4dd..da6b2eab3 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -7386,11 +7386,7 @@ sptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lPar case SCI_STYLEGETSIZEFRACTIONAL: return vs.styles[wParam].size; case SCI_STYLEGETFONT: - if (!vs.styles[wParam].fontName) - return 0; - if (lParam != 0) - strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName); - return strlen(vs.styles[wParam].fontName); + return StringResult(lParam, vs.styles[wParam].fontName); case SCI_STYLEGETUNDERLINE: return vs.styles[wParam].underline ? 1 : 0; case SCI_STYLEGETCASE: @@ -7408,12 +7404,27 @@ sptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lPar } sptr_t Editor::StringResult(sptr_t lParam, const char *val) { - const size_t n = strlen(val); - if (lParam != 0) { - char *ptr = reinterpret_cast<char *>(lParam); - strcpy(ptr, val); + const size_t len = val ? strlen(val) : 0; + if (lParam) { + char *ptr = CharPtrFromSPtr(lParam); + if (val) + memcpy(ptr, val, len+1); + else + *ptr = 0; + } + return len; // Not including NUL +} + +sptr_t Editor::BytesResult(sptr_t lParam, const unsigned char *val, size_t len) { + // No NUL termination: len is number of valid/displayed bytes + if (lParam) { + char *ptr = CharPtrFromSPtr(lParam); + if (val) + memcpy(ptr, val, len); + else + *ptr = 0; } - return n; // Not including NUL + return val ? len : 0; } sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { @@ -9232,9 +9243,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { Representation *repr = reprs.RepresentationFromCharacter( reinterpret_cast<const char *>(wParam), UTF8MaxBytes); if (repr) { - if (lParam != 0) - strcpy(CharPtrFromSPtr(lParam), repr->stringRep.c_str()); - return repr->stringRep.size(); + return StringResult(lParam, repr->stringRep.c_str()); } return 0; } @@ -9350,13 +9359,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_MARGINGETTEXT: { const StyledText st = pdoc->MarginStyledText(wParam); - if (lParam) { - if (st.text) - memcpy(CharPtrFromSPtr(lParam), st.text, st.length); - else - strcpy(CharPtrFromSPtr(lParam), ""); - } - return st.length; + return BytesResult(lParam, reinterpret_cast<const unsigned char *>(st.text), st.length); } case SCI_MARGINSETSTYLE: @@ -9374,13 +9377,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_MARGINGETSTYLES: { const StyledText st = pdoc->MarginStyledText(wParam); - if (lParam) { - if (st.styles) - memcpy(CharPtrFromSPtr(lParam), st.styles, st.length); - else - strcpy(CharPtrFromSPtr(lParam), ""); - } - return st.styles ? st.length : 0; + return BytesResult(lParam, st.styles, st.length); } case SCI_MARGINTEXTCLEARALL: @@ -9393,13 +9390,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_ANNOTATIONGETTEXT: { const StyledText st = pdoc->AnnotationStyledText(wParam); - if (lParam) { - if (st.text) - memcpy(CharPtrFromSPtr(lParam), st.text, st.length); - else - strcpy(CharPtrFromSPtr(lParam), ""); - } - return st.length; + return BytesResult(lParam, reinterpret_cast<const unsigned char *>(st.text), st.length); } case SCI_ANNOTATIONGETSTYLE: { @@ -9417,13 +9408,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_ANNOTATIONGETSTYLES: { const StyledText st = pdoc->AnnotationStyledText(wParam); - if (lParam) { - if (st.styles) - memcpy(CharPtrFromSPtr(lParam), st.styles, st.length); - else - strcpy(CharPtrFromSPtr(lParam), ""); - } - return st.styles ? st.length : 0; + return BytesResult(lParam, st.styles, st.length); } case SCI_ANNOTATIONGETLINES: diff --git a/src/Editor.h b/src/Editor.h index 7a8f1eb1d..c87708e92 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -632,6 +632,7 @@ protected: // ScintillaBase subclass needs access to much of Editor static const char *StringFromEOLMode(int eolMode); static sptr_t StringResult(sptr_t lParam, const char *val); + static sptr_t BytesResult(sptr_t lParam, const unsigned char *val, size_t len); public: // Public so the COM thunks can access it. diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index f8b989bd4..ad45a5ad2 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -381,7 +381,7 @@ int ScintillaBase::AutoCompleteGetCurrentText(char *buffer) const { if (item != -1) { const std::string selected = ac.GetValue(item); if (buffer != NULL) - strcpy(buffer, selected.c_str()); + memcpy(buffer, selected.c_str(), selected.length()+1); return static_cast<int>(selected.length()); } } diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx index daa5b1a99..4b82c9c05 100644 --- a/src/ViewStyle.cxx +++ b/src/ViewStyle.cxx @@ -55,8 +55,9 @@ const char *FontNames::Save(const char *name) { return *it; } } - char *nameSave = new char[strlen(name) + 1]; - strcpy(nameSave, name); + const size_t lenName = strlen(name) + 1; + char *nameSave = new char[lenName]; + memcpy(nameSave, name, lenName); names.push_back(nameSave); return nameSave; } |