get rid of strlcpy.h

Don't use hand-rolled string manipulation routine with a fixed
buffer in the bitcoin core, instead make use of c++ strings and boost.
This commit is contained in:
Wladimir J. van der Laan 2012-10-02 21:36:39 +02:00
parent ee0b648536
commit 6032e4f4e7
7 changed files with 30 additions and 129 deletions

View File

@ -125,7 +125,6 @@ HEADERS += src/qt/bitcoingui.h \
src/util.h \ src/util.h \
src/uint256.h \ src/uint256.h \
src/serialize.h \ src/serialize.h \
src/strlcpy.h \
src/main.h \ src/main.h \
src/net.h \ src/net.h \
src/key.h \ src/key.h \

View File

@ -1,7 +1,3 @@
Code: src/strlcpy.h
Author: Todd C. Miller <Todd.Miller@courtesan.com>
License: ISC
Icon: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png, Icon: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png,
src/qt/res/src/*.svg src/qt/res/src/*.svg
Designer: Wladimir van der Laan Designer: Wladimir van der Laan

View File

@ -5,9 +5,10 @@
#include "irc.h" #include "irc.h"
#include "net.h" #include "net.h"
#include "strlcpy.h"
#include "base58.h" #include "base58.h"
#include <boost/algorithm/string/predicate.hpp> // for startswith() and endswith()
using namespace std; using namespace std;
using namespace boost; using namespace boost;
@ -324,30 +325,27 @@ void ThreadIRCSeed2(void* parg)
if (vWords.size() < 2) if (vWords.size() < 2)
continue; continue;
char pszName[10000]; std::string strName;
pszName[0] = '\0';
if (vWords[1] == "352" && vWords.size() >= 8) if (vWords[1] == "352" && vWords.size() >= 8)
{ {
// index 7 is limited to 16 characters // index 7 is limited to 16 characters
// could get full length name at index 10, but would be different from join messages // could get full length name at index 10, but would be different from join messages
strlcpy(pszName, vWords[7].c_str(), sizeof(pszName)); strName = vWords[7].c_str();
printf("IRC got who\n"); printf("IRC got who\n");
} }
if (vWords[1] == "JOIN" && vWords[0].size() > 1) if (vWords[1] == "JOIN" && vWords[0].size() > 1)
{ {
// :username!username@50000007.F000000B.90000002.IP JOIN :#channelname // :username!username@50000007.F000000B.90000002.IP JOIN :#channelname
strlcpy(pszName, vWords[0].c_str() + 1, sizeof(pszName)); strName = vWords[0].substr(1, vWords[0].find('!', 1) - 1);
if (strchr(pszName, '!'))
*strchr(pszName, '!') = '\0';
printf("IRC got join\n"); printf("IRC got join\n");
} }
if (pszName[0] == 'u') if (boost::algorithm::starts_with(strName, "u"))
{ {
CAddress addr; CAddress addr;
if (DecodeAddress(pszName, addr)) if (DecodeAddress(strName, addr))
{ {
addr.nTime = GetAdjustedTime(); addr.nTime = GetAdjustedTime();
if (addrman.Add(addr, addrConnect, 51 * 60)) if (addrman.Add(addr, addrConnect, 51 * 60))

View File

@ -7,7 +7,6 @@
#include "db.h" #include "db.h"
#include "net.h" #include "net.h"
#include "init.h" #include "init.h"
#include "strlcpy.h"
#include "addrman.h" #include "addrman.h"
#include "ui_interface.h" #include "ui_interface.h"

View File

@ -10,8 +10,8 @@
#include <sys/fcntl.h> #include <sys/fcntl.h>
#endif #endif
#include "strlcpy.h"
#include <boost/algorithm/string/case_conv.hpp> // for to_lower() #include <boost/algorithm/string/case_conv.hpp> // for to_lower()
#include <boost/algorithm/string/predicate.hpp> // for startswith() and endswith()
using namespace std; using namespace std;
@ -118,18 +118,16 @@ bool static LookupIntern(const char *pszName, std::vector<CNetAddr>& vIP, unsign
bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup) bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions, bool fAllowLookup)
{ {
if (pszName[0] == 0) std::string str(pszName);
std::string strHost = str;
if (str.empty())
return false; return false;
char psz[256]; if (boost::algorithm::starts_with(str, "[") && boost::algorithm::ends_with(str, "]"))
char *pszHost = psz;
strlcpy(psz, pszName, sizeof(psz));
if (psz[0] == '[' && psz[strlen(psz)-1] == ']')
{ {
pszHost = psz+1; strHost = str.substr(1, str.size() - 2);
psz[strlen(psz)-1] = 0;
} }
return LookupIntern(pszHost, vIP, nMaxSolutions, fAllowLookup); return LookupIntern(strHost.c_str(), vIP, nMaxSolutions, fAllowLookup);
} }
bool LookupHostNumeric(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions) bool LookupHostNumeric(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions)

View File

@ -1,90 +0,0 @@
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef BITCOIN_STRLCPY_H
#define BITCOIN_STRLCPY_H
#include <stdlib.h>
#include <string.h>
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
inline size_t strlcpy(char *dst, const char *src, size_t siz)
{
char *d = dst;
const char *s = src;
size_t n = siz;
/* Copy as many bytes as will fit */
if (n != 0)
{
while (--n != 0)
{
if ((*d++ = *s++) == '\0')
break;
}
}
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0)
{
if (siz != 0)
*d = '\0'; /* NUL-terminate dst */
while (*s++)
;
}
return(s - src - 1); /* count does not include NUL */
}
/*
* Appends src to string dst of size siz (unlike strncat, siz is the
* full size of dst, not space left). At most siz-1 characters
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
* If retval >= siz, truncation occurred.
*/
inline size_t strlcat(char *dst, const char *src, size_t siz)
{
char *d = dst;
const char *s = src;
size_t n = siz;
size_t dlen;
/* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = siz - dlen;
if (n == 0)
return(dlen + strlen(s));
while (*s != '\0')
{
if (n != 1)
{
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return(dlen + (s - src)); /* count does not include NUL */
}
#endif

View File

@ -5,10 +5,11 @@
#include "util.h" #include "util.h"
#include "sync.h" #include "sync.h"
#include "strlcpy.h"
#include "version.h" #include "version.h"
#include "ui_interface.h" #include "ui_interface.h"
#include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/join.hpp>
#include <boost/algorithm/string/case_conv.hpp> // for to_lower()
#include <boost/algorithm/string/predicate.hpp> // for startswith() and endswith()
// Work around clang compilation problem in Boost 1.46: // Work around clang compilation problem in Boost 1.46:
// /usr/include/boost/program_options/detail/config_file.hpp:163:17: error: call to function 'to_internal' that is neither visible in the template definition nor found by argument-dependent lookup // /usr/include/boost/program_options/detail/config_file.hpp:163:17: error: call to function 'to_internal' that is neither visible in the template definition nor found by argument-dependent lookup
@ -499,24 +500,24 @@ void ParseParameters(int argc, const char* const argv[])
mapMultiArgs.clear(); mapMultiArgs.clear();
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
{ {
char psz[10000]; std::string str(argv[i]);
strlcpy(psz, argv[i], sizeof(psz)); std::string strValue;
char* pszValue = (char*)""; size_t is_index = str.find('=');
if (strchr(psz, '=')) if (is_index != std::string::npos)
{ {
pszValue = strchr(psz, '='); strValue = str.substr(is_index+1);
*pszValue++ = '\0'; str = str.substr(0, is_index);
} }
#ifdef WIN32 #ifdef WIN32
_strlwr(psz); boost::to_lower(str);
if (psz[0] == '/') if (boost::algorithm::starts_with(str, "/"))
psz[0] = '-'; str = "-" + str.substr(1);
#endif #endif
if (psz[0] != '-') if (str[0] != '-')
break; break;
mapArgs[psz] = pszValue; mapArgs[str] = strValue;
mapMultiArgs[psz].push_back(pszValue); mapMultiArgs[str].push_back(strValue);
} }
// New 0.6 features: // New 0.6 features: