aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexlib
diff options
context:
space:
mode:
Diffstat (limited to 'lexlib')
-rw-r--r--lexlib/PropSetSimple.cxx2
-rw-r--r--lexlib/StringCopy.h33
-rw-r--r--lexlib/WordList.cxx5
3 files changed, 37 insertions, 3 deletions
diff --git a/lexlib/PropSetSimple.cxx b/lexlib/PropSetSimple.cxx
index 6792eea15..6f4553a07 100644
--- a/lexlib/PropSetSimple.cxx
+++ b/lexlib/PropSetSimple.cxx
@@ -146,7 +146,7 @@ int PropSetSimple::GetExpanded(const char *key, char *result) const {
ExpandAllInPlace(*this, val, 100, VarChain(key));
const int n = static_cast<int>(val.size());
if (result) {
- strcpy(result, val.c_str());
+ memcpy(result, val.c_str(), n+1);
}
return n; // Not including NUL
}
diff --git a/lexlib/StringCopy.h b/lexlib/StringCopy.h
new file mode 100644
index 000000000..caca49911
--- /dev/null
+++ b/lexlib/StringCopy.h
@@ -0,0 +1,33 @@
+// Scintilla source code edit control
+/** @file StringCopy.h
+ ** Safe string copy function which always NUL terminates.
+ **/
+// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#ifndef STRINGCOPY_H
+#define STRINGCOPY_H
+
+#ifdef SCI_NAMESPACE
+namespace Scintilla {
+#endif
+
+// Safer version of string copy functions like strcpy, wcsncpy, etc.
+// Instantiate over fixed length strings of both char and wchar_t.
+// May truncate if source doesn't fit into dest with room for NUL.
+
+template <typename T, size_t count>
+void StringCopy(T (&dest)[count], const T* source) {
+ for (size_t i=0; i<count; i++) {
+ dest[i] = source[i];
+ if (!source[i])
+ break;
+ }
+ dest[count-1] = 0;
+}
+
+#ifdef SCI_NAMESPACE
+}
+#endif
+
+#endif
diff --git a/lexlib/WordList.cxx b/lexlib/WordList.cxx
index 1f7127999..e789c0eaf 100644
--- a/lexlib/WordList.cxx
+++ b/lexlib/WordList.cxx
@@ -122,8 +122,9 @@ static void SortWordList(char **words, unsigned int len) {
void WordList::Set(const char *s) {
Clear();
- list = new char[strlen(s) + 1];
- strcpy(list, s);
+ const size_t lenS = strlen(s) + 1;
+ list = new char[lenS];
+ memcpy(list, s, lenS);
words = ArrayFromWordList(list, &len, onlyLineEnds);
#ifdef _MSC_VER
std::sort(words, words + len, cmpWords);