Remove remaining usages of VLAs

This commit is contained in:
Peter Keresztes Schmidt 2021-05-16 19:16:08 +02:00
parent c0017a5263
commit 298415fff3
6 changed files with 52 additions and 31 deletions

View File

@ -36,7 +36,7 @@
int ZM::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) { int ZM::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) {
va_list arg_ptr; va_list arg_ptr;
iovec iov[iovcnt]; std::vector<iovec> iov(iovcnt);
va_start(arg_ptr, iovcnt); va_start(arg_ptr, iovcnt);
for (int i = 0; i < iovcnt; i++) { for (int i = 0; i < iovcnt; i++) {
@ -45,7 +45,7 @@ int ZM::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) {
} }
va_end(arg_ptr); va_end(arg_ptr);
int nBytes = ::readv(mRd, iov, iovcnt); int nBytes = ::readv(mRd, iov.data(), iovcnt);
if (nBytes < 0) { if (nBytes < 0) {
Debug(1, "Readv of %d buffers max on rd %d failed: %s", iovcnt, mRd, strerror(errno)); Debug(1, "Readv of %d buffers max on rd %d failed: %s", iovcnt, mRd, strerror(errno));
} }
@ -54,7 +54,7 @@ int ZM::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) {
int ZM::CommsBase::writeV(int iovcnt, /* const void *, int, */ ...) { int ZM::CommsBase::writeV(int iovcnt, /* const void *, int, */ ...) {
va_list arg_ptr; va_list arg_ptr;
iovec iov[iovcnt]; std::vector<iovec> iov(iovcnt);
va_start(arg_ptr, iovcnt); va_start(arg_ptr, iovcnt);
for (int i = 0; i < iovcnt; i++) { for (int i = 0; i < iovcnt; i++) {
@ -63,7 +63,7 @@ int ZM::CommsBase::writeV(int iovcnt, /* const void *, int, */ ...) {
} }
va_end(arg_ptr); va_end(arg_ptr);
ssize_t nBytes = ::writev(mWd, iov, iovcnt); ssize_t nBytes = ::writev(mWd, iov.data(), iovcnt);
if (nBytes < 0) { if (nBytes < 0) {
Debug(1, "Writev of %d buffers on wd %d failed: %s", iovcnt, mWd, strerror(errno)); Debug(1, "Writev of %d buffers on wd %d failed: %s", iovcnt, mWd, strerror(errno));
} }

View File

@ -243,27 +243,27 @@ class Socket : public CommsBase {
return nBytes; return nBytes;
} }
virtual int recv(std::string &msg) const { virtual ssize_t recv(std::string &msg) const {
char buffer[msg.capacity()]; std::vector<char> buffer(msg.capacity());
int nBytes = 0; ssize_t nBytes;
if ((nBytes = ::recv(mSd, buffer, sizeof(buffer), 0)) < 0) { if ((nBytes = ::recv(mSd, buffer.data(), buffer.size(), 0)) < 0) {
Debug(1, "Recv of %zd bytes max to string on sd %d failed: %s", sizeof(buffer), mSd, strerror(errno)); Debug(1, "Recv of %zd bytes max to string on sd %d failed: %s", msg.size(), mSd, strerror(errno));
return nBytes; return nBytes;
} }
buffer[nBytes] = '\0'; buffer[nBytes] = '\0';
msg = buffer; msg = {buffer.begin(), buffer.begin() + nBytes};
return nBytes; return nBytes;
} }
virtual int recv(std::string &msg, size_t maxLen) const { virtual ssize_t recv(std::string &msg, size_t maxLen) const {
char buffer[maxLen]; std::vector<char> buffer(maxLen);
int nBytes = 0; ssize_t nBytes;
if ((nBytes = ::recv(mSd, buffer, sizeof(buffer), 0)) < 0) { if ((nBytes = ::recv(mSd, buffer.data(), buffer.size(), 0)) < 0) {
Debug(1, "Recv of %zd bytes max to string on sd %d failed: %s", maxLen, mSd, strerror(errno)); Debug(1, "Recv of %zd bytes max to string on sd %d failed: %s", maxLen, mSd, strerror(errno));
return nBytes; return nBytes;
} }
buffer[nBytes] = '\0'; buffer[nBytes] = '\0';
msg = buffer; msg = {buffer.begin(), buffer.begin() + nBytes};
return nBytes; return nBytes;
} }

View File

@ -529,15 +529,17 @@ void Logger::logPrint(bool hex, const char *filepath, int line, int level, const
if (level <= mDatabaseLevel) { if (level <= mDatabaseLevel) {
if (zmDbConnected) { if (zmDbConnected) {
int syslogSize = syslogEnd-syslogStart; int syslogSize = syslogEnd-syslogStart;
char escapedString[(syslogSize*2)+1]; std::string escapedString;
mysql_real_escape_string(&dbconn, escapedString, syslogStart, syslogSize); escapedString.reserve((syslogSize * 2) + 1);
mysql_real_escape_string(&dbconn, &escapedString[0], syslogStart, syslogSize);
escapedString.resize(std::strlen(escapedString.c_str()));
std::string sql_string = stringtf( std::string sql_string = stringtf(
"INSERT INTO `Logs` " "INSERT INTO `Logs` "
"( `TimeKey`, `Component`, `ServerId`, `Pid`, `Level`, `Code`, `Message`, `File`, `Line` )" "( `TimeKey`, `Component`, `ServerId`, `Pid`, `Level`, `Code`, `Message`, `File`, `Line` )"
" VALUES " " VALUES "
"( %ld.%06ld, '%s', %d, %d, %d, '%s', '%s', '%s', %d )", "( %ld.%06ld, '%s', %d, %d, %d, '%s', '%s', '%s', %d )",
timeVal.tv_sec, timeVal.tv_usec, mId.c_str(), staticConfig.SERVER_ID, tid, level, classString, escapedString, file, line timeVal.tv_sec, timeVal.tv_usec, mId.c_str(), staticConfig.SERVER_ID, tid, level, classString, escapedString.c_str(), file, line
); );
dbQueue.push(std::move(sql_string)); dbQueue.push(std::move(sql_string));
} else { } else {

View File

@ -131,8 +131,8 @@ std::string Authenticator::computeDigestResponse(const std::string &method, cons
#if HAVE_DECL_MD5 || HAVE_DECL_GNUTLS_FINGERPRINT #if HAVE_DECL_MD5 || HAVE_DECL_GNUTLS_FINGERPRINT
// The "response" field is computed as: // The "response" field is computed as:
// md5(md5(<username>:<realm>:<password>):<nonce>:md5(<cmd>:<url>)) // md5(md5(<username>:<realm>:<password>):<nonce>:md5(<cmd>:<url>))
size_t md5len = 16; constexpr size_t md5len = 16;
unsigned char md5buf[md5len]; uint8 md5buf[md5len];
char md5HexBuf[md5len * 2 + 1]; char md5HexBuf[md5len * 2 + 1];
// Step 1: md5(<username>:<realm>:<password>) // Step 1: md5(<username>:<realm>:<password>)

View File

@ -236,8 +236,8 @@ User *zmLoadAuthUser(const char *auth, bool use_remote_addr) {
} }
char auth_key[512] = ""; char auth_key[512] = "";
char auth_md5[32+1] = ""; char auth_md5[32+1] = "";
size_t md5len = 16; constexpr size_t md5len = 16;
unsigned char md5sum[md5len]; uint8 md5sum[md5len];
const char * hex = "0123456789abcdef"; const char * hex = "0123456789abcdef";
while ( MYSQL_ROW dbrow = mysql_fetch_row(result) ) { while ( MYSQL_ROW dbrow = mysql_fetch_row(result) ) {

View File

@ -224,15 +224,16 @@ TEST_CASE("ZM::UdpUnixSocket send/recv") {
ZM::UdpUnixSocket srv_socket; ZM::UdpUnixSocket srv_socket;
ZM::UdpUnixSocket client_socket; ZM::UdpUnixSocket client_socket;
SECTION("send/recv byte buffer") {
std::array<char, 3> msg = {'a', 'b', 'c'}; std::array<char, 3> msg = {'a', 'b', 'c'};
std::array<char, msg.size()> rcv{}; std::array<char, msg.size()> rcv{};
SECTION("send/recv on unbound socket") { SECTION("on unbound socket") {
REQUIRE(client_socket.send(msg.data(), msg.size()) == -1); REQUIRE(client_socket.send(msg.data(), msg.size()) == -1);
REQUIRE(srv_socket.recv(rcv.data(), rcv.size()) == -1); REQUIRE(srv_socket.recv(rcv.data(), rcv.size()) == -1);
} }
SECTION("send/recv") { SECTION("on bound socket") {
REQUIRE(srv_socket.bind(sock_path.c_str()) == true); REQUIRE(srv_socket.bind(sock_path.c_str()) == true);
REQUIRE(srv_socket.isOpen() == true); REQUIRE(srv_socket.isOpen() == true);
@ -246,6 +247,24 @@ TEST_CASE("ZM::UdpUnixSocket send/recv") {
} }
} }
SECTION("send/recv string") {
std::string msg = "abc";
std::string rcv;
rcv.reserve(msg.length());
REQUIRE(srv_socket.bind(sock_path.c_str()) == true);
REQUIRE(srv_socket.isOpen() == true);
REQUIRE(client_socket.connect(sock_path.c_str()) == true);
REQUIRE(client_socket.isConnected() == true);
REQUIRE(client_socket.send(msg) == static_cast<ssize_t>(msg.size()));
REQUIRE(srv_socket.recv(rcv) == static_cast<ssize_t>(msg.size()));
REQUIRE(rcv == msg);
}
}
TEST_CASE("ZM::TcpInetClient basics") { TEST_CASE("ZM::TcpInetClient basics") {
ZM::TcpInetClient client; ZM::TcpInetClient client;
REQUIRE(client.isClosed() == true); REQUIRE(client.isClosed() == true);