From: Aki Tuomi Date: Sat, 12 Dec 2015 18:20:29 +0000 (+0200) Subject: Use proper conversions for integers in gsql X-Git-Tag: dnsdist-1.0.0-alpha1~34^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=955e760a66e342dbc52cfa34d8d6196a99c5082d;p=thirdparty%2Fpdns.git Use proper conversions for integers in gsql --- diff --git a/pdns/backends/gsql/gsqlbackend.cc b/pdns/backends/gsql/gsqlbackend.cc index ead7aff355..cbbbf9fbd7 100644 --- a/pdns/backends/gsql/gsqlbackend.cc +++ b/pdns/backends/gsql/gsqlbackend.cc @@ -38,7 +38,7 @@ #include #include -#define ASSERT_ROW_COLUMNS(query, row, num) { if (row.size() != num) { throw PDNSException(std::string(query) + " returned wrong number of columns, expected " #num ", got " + boost::lexical_cast(row.size())); } } +#define ASSERT_ROW_COLUMNS(query, row, num) { if (row.size() != num) { throw PDNSException(std::string(query) + " returned wrong number of columns, expected " #num ", got " + std::to_string(row.size())); } } GSQLBackend::GSQLBackend(const string &mode, const string &suffix) { @@ -318,11 +318,11 @@ bool GSQLBackend::getDomainInfo(const DNSName &domain, DomainInfo &di) ASSERT_ROW_COLUMNS("info-zone-query", d_result[0], 7); - di.id=atol(d_result[0][0].c_str()); + di.id=pdns_stou(d_result[0][0]); di.zone=DNSName(d_result[0][1]); stringtok(di.masters, d_result[0][2], " ,\t"); - di.last_check=atol(d_result[0][3].c_str()); - di.notified_serial = atol(d_result[0][4].c_str()); + di.last_check=pdns_stou(d_result[0][3]); + di.notified_serial = pdns_stou(d_result[0][4]); string type=d_result[0][5]; di.account=d_result[0][6]; di.backend=this; @@ -363,10 +363,10 @@ void GSQLBackend::getUnfreshSlaveInfos(vector *unfreshDomains) for(int n=0;n *updatedDomains) for(int n=0;n *domains, bool include_disabl d_getAllDomainsQuery_stmt->nextRow(row); ASSERT_ROW_COLUMNS("get-all-domains-query", row, 8); DomainInfo di; - di.id = atol(row[0].c_str()); + di.id = pdns_stou(row[0]); di.zone = DNSName(row[1]); if (!row[4].empty()) { @@ -1162,8 +1162,8 @@ void GSQLBackend::getAllDomains(vector *domains, bool include_disabl SOAData sd; fillSOAData(row[2], sd); di.serial = sd.serial; - di.notified_serial = atol(row[5].c_str()); - di.last_check = atol(row[6].c_str()); + di.notified_serial = pdns_stou(row[5]); + di.last_check = pdns_stou(row[6]); di.account = row[7]; if (pdns_iequals(row[3], "MASTER")) @@ -1231,10 +1231,11 @@ bool GSQLBackend::feedRecord(const DNSResourceRecord &r, string *ordername) int prio=0; string content(r.content); if (r.qtype == QType::MX || r.qtype == QType::SRV) { - prio=atoi(content.c_str()); string::size_type pos = content.find_first_not_of("0123456789"); - if(pos != string::npos) + if (pos != string::npos) { + prio=pdns_stou(content.substr(0,pos)); boost::erase_head(content, pos); + } trim_left(content); } @@ -1392,7 +1393,7 @@ bool GSQLBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, t if (!d_result.empty()) { ASSERT_ROW_COLUMNS("zone-lastchange-query", d_result[0], 1); - serial = atol(d_result[0][0].c_str()); + serial = pdns_stou(d_result[0][0]); return true; } @@ -1583,7 +1584,7 @@ void GSQLBackend::extractRecord(const SSqlStatement::row_t& row, DNSResourceReco if (row[1].empty()) r.ttl = ::arg().asNum( "default-ttl" ); else - r.ttl=atol(row[1].c_str()); + r.ttl=pdns_stou(row[1]); if(!d_qname.empty()) r.qname=d_qname; else @@ -1591,9 +1592,12 @@ void GSQLBackend::extractRecord(const SSqlStatement::row_t& row, DNSResourceReco r.qtype=row[3]; - if (r.qtype==QType::MX || r.qtype==QType::SRV) + if (r.qtype==QType::MX || r.qtype==QType::SRV) { + auto prio = std::stoul(row[2]); + if (prio > UINT16_MAX) + throw std::range_error((boost::format("priority value %lu for %s is too large") % prio % row[0]).str()); r.content=row[2]+" "+row[0]; - else + } else r.content=row[0]; r.last_modified=0; @@ -1605,15 +1609,15 @@ void GSQLBackend::extractRecord(const SSqlStatement::row_t& row, DNSResourceReco r.disabled = !row[5].empty() && row[5][0]=='1'; - r.domain_id=atoi(row[4].c_str()); + r.domain_id=pdns_stou(row[4]); } void GSQLBackend::extractComment(const SSqlStatement::row_t& row, Comment& comment) { - comment.domain_id = atol(row[0].c_str()); + comment.domain_id = pdns_stou(row[0]); comment.qname = row[1]; comment.qtype = row[2]; - comment.modified_at = atol(row[3].c_str()); + comment.modified_at = pdns_stou(row[3]); comment.account = row[4]; comment.content = row[5]; }