diff options
Diffstat (limited to 'lexlib')
| -rw-r--r-- | lexlib/PropSetSimple.cxx | 2 | ||||
| -rw-r--r-- | lexlib/StringCopy.h | 33 | ||||
| -rw-r--r-- | lexlib/WordList.cxx | 5 | 
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); | 
