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:
parent
ee0b648536
commit
6032e4f4e7
@ -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 \
|
||||||
|
@ -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
|
||||||
|
16
src/irc.cpp
16
src/irc.cpp
@ -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))
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
|
27
src/util.cpp
27
src/util.cpp
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user