From 655fc9356fa7da1080ba7f44088caabe12a49db4 Mon Sep 17 00:00:00 2001 From: Theron Tock Date: Thu, 28 Apr 2011 16:58:22 -0700 Subject: [PATCH] Fixes #2182. Convert use of sprintf to snprintf (hopefully in a way that also works on windows). --- src/compiler_lib/CompilerDriver.cpp | 5 +- .../src/fwbuilder/FWObjectDatabase.cpp | 3 +- .../fwbuilder/FWObjectDatabase_tree_ops.cpp | 7 ++- .../src/fwbuilder/TCPUDPService.cpp | 12 ++-- src/libfwbuilder/src/fwbuilder/snmp.cpp | 57 ++++++++++--------- src/libgui/ObjectManipulator_slots.cpp | 12 ++-- src/libgui/StartTipDialog.cpp | 5 +- 7 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/compiler_lib/CompilerDriver.cpp b/src/compiler_lib/CompilerDriver.cpp index 9b9bd121a..44dd8a096 100644 --- a/src/compiler_lib/CompilerDriver.cpp +++ b/src/compiler_lib/CompilerDriver.cpp @@ -462,9 +462,8 @@ void CompilerDriver::commonChecks2(Cluster *cluster, Firewall *fw) if (!iface->isDyn()) { - char errstr[256]; - sprintf(errstr, - _("Wildcard interface '%s' must be dynamic."), + QString errstr; + errstr.sprintf(_("Wildcard interface '%s' must be dynamic."), iface->getName().c_str() ); throw FWException(errstr); } diff --git a/src/libfwbuilder/src/fwbuilder/FWObjectDatabase.cpp b/src/libfwbuilder/src/fwbuilder/FWObjectDatabase.cpp index 2b8e76287..9b9e18494 100644 --- a/src/libfwbuilder/src/fwbuilder/FWObjectDatabase.cpp +++ b/src/libfwbuilder/src/fwbuilder/FWObjectDatabase.cpp @@ -99,6 +99,7 @@ using namespace libfwbuilder; int id_seed = 1000; #ifdef _WIN32 static int cached_pid = _getpid(); +#define snprintf sprintf_s #else static int cached_pid = getpid(); #endif @@ -211,7 +212,7 @@ string FWObjectDatabase::getStringId(int i_id) // TODO: Use proper GUID algorithm here char id_buf[64]; - sprintf(id_buf, "id%dX%d", i_id, cached_pid); + snprintf(id_buf, sizeof(id_buf), "id%dX%d", i_id, cached_pid); id_dict[i_id] = string(id_buf); id_dict_reverse[string(id_buf)] = i_id; return id_dict[i_id]; diff --git a/src/libfwbuilder/src/fwbuilder/FWObjectDatabase_tree_ops.cpp b/src/libfwbuilder/src/fwbuilder/FWObjectDatabase_tree_ops.cpp index da295cd59..112cebed4 100644 --- a/src/libfwbuilder/src/fwbuilder/FWObjectDatabase_tree_ops.cpp +++ b/src/libfwbuilder/src/fwbuilder/FWObjectDatabase_tree_ops.cpp @@ -48,6 +48,9 @@ using namespace std; using namespace libfwbuilder; +#ifdef _WIN32 +#define snprintf sprintf_s +#endif class FWObjectTreeScanner { @@ -492,7 +495,7 @@ FWObject* FWObjectDatabase::recursivelyCopySubtree(FWObject *target, std::map &id_map) { char s[64]; - sprintf(s, ".copy_of_%p", source->getRoot()); + snprintf(s, sizeof(s), ".copy_of_%p", source->getRoot()); string dedup_attribute = s; FWObject *nobj = _recursively_copy_subtree(target, source, id_map, @@ -599,7 +602,7 @@ FWObject* FWObjectDatabase::_recursively_copy_subtree( // Check if we have already copied the same object before char s[64]; - sprintf(s, "%d", old_ptr_obj->getId()); + snprintf(s, sizeof(s), "%d", old_ptr_obj->getId()); n_ptr_obj = findObjectByAttribute(dedup_attribute, s); if (n_ptr_obj) { diff --git a/src/libfwbuilder/src/fwbuilder/TCPUDPService.cpp b/src/libfwbuilder/src/fwbuilder/TCPUDPService.cpp index 76c460e4f..7d88673ec 100644 --- a/src/libfwbuilder/src/fwbuilder/TCPUDPService.cpp +++ b/src/libfwbuilder/src/fwbuilder/TCPUDPService.cpp @@ -33,6 +33,10 @@ using namespace libfwbuilder; using namespace std; +#ifdef _WIN32 +#define snprintf sprintf_s +#endif + const char *TCPUDPService::TYPENAME={"TCPUDPService"}; TCPUDPService::TCPUDPService() @@ -93,14 +97,14 @@ xmlNodePtr TCPUDPService::toXML(xmlNodePtr xml_parent_node) throw(FWException) char str[128]; - sprintf(str,"%d",src_range_start); + snprintf(str, sizeof(str), "%d", src_range_start); xmlNewProp(me, TOXMLCAST("src_range_start"), TOXMLCAST(str)); - sprintf(str,"%d",src_range_end); + snprintf(str, sizeof(str), "%d", src_range_end); xmlNewProp(me, TOXMLCAST("src_range_end"), TOXMLCAST(str)); - sprintf(str,"%d",dst_range_start); + snprintf(str, sizeof(str), "%d", dst_range_start); xmlNewProp(me, TOXMLCAST("dst_range_start"), TOXMLCAST(str)); - sprintf(str,"%d",dst_range_end); + snprintf(str, sizeof(str), "%d", dst_range_end); xmlNewProp(me, TOXMLCAST("dst_range_end"), TOXMLCAST(str)); return me; diff --git a/src/libfwbuilder/src/fwbuilder/snmp.cpp b/src/libfwbuilder/src/fwbuilder/snmp.cpp index 3b1acafe6..e8eb22b9f 100644 --- a/src/libfwbuilder/src/fwbuilder/snmp.cpp +++ b/src/libfwbuilder/src/fwbuilder/snmp.cpp @@ -60,6 +60,10 @@ #include #include +#ifdef _WIN32 +#define snprintf sprintf_s +#endif + /** * Define this if you need extra debug output. */ @@ -69,18 +73,19 @@ using namespace std; using namespace libfwbuilder; /* Compiled OIDs */ -const char *SNMPQuery::SNMP_INTERFACE_ASTATUS= ".1.3.6.1.2.1.2.2.1.7"; -const char *SNMPQuery::SNMP_INTERFACE_OSTATUS= ".1.3.6.1.2.1.2.2.1.8"; -const char *SNMPQuery::SNMP_INTERFACE_INDEX = ".1.3.6.1.2.1.2.2.1.1"; -const char *SNMPQuery::SNMP_INTERFACES_DESCR = ".1.3.6.1.2.1.2.2.1.2"; -const char *SNMPQuery::SNMP_INTERFACES_PHYSA = ".1.3.6.1.2.1.2.2.1.6"; -const char *SNMPQuery::SNMP_INTERFACES_TYPE = ".1.3.6.1.2.1.2.2.1.3"; -const char *SNMPQuery::SNMP_ADDR_INDEX_TABLE = ".1.3.6.1.2.1.4.20.1.2"; -const char *SNMPQuery::SNMP_NMASK_TABLE = ".1.3.6.1.2.1.4.20.1.3"; -const char *SNMPQuery::SNMP_ADDR_TABLE = ".1.3.6.1.2.1.4.20.1.1"; -const char *SNMPQuery::SNMP_BCAST_TABLE = ".1.3.6.1.2.1.4.20.1.4"; -const char *SNMPQuery::SNMP_AT_TABLE_NET = ".1.3.6.1.2.1.3.1.1.3"; -const char *SNMPQuery::SNMP_AT_TABLE_PHYS = ".1.3.6.1.2.1.3.1.1.2"; +/* We use #define so the compiler can do string concatenation for snprintf */ +#define SNMP_INTERFACE_ASTATUS ".1.3.6.1.2.1.2.2.1.7" +#define SNMP_INTERFACE_OSTATUS ".1.3.6.1.2.1.2.2.1.8" +#define SNMP_INTERFACE_INDEX ".1.3.6.1.2.1.2.2.1.1" +#define SNMP_INTERFACES_DESCR ".1.3.6.1.2.1.2.2.1.2" +#define SNMP_INTERFACES_PHYSA ".1.3.6.1.2.1.2.2.1.6" +#define SNMP_INTERFACES_TYPE ".1.3.6.1.2.1.2.2.1.3" +#define SNMP_ADDR_INDEX_TABLE ".1.3.6.1.2.1.4.20.1.2" +#define SNMP_NMASK_TABLE ".1.3.6.1.2.1.4.20.1.3" +#define SNMP_ADDR_TABLE ".1.3.6.1.2.1.4.20.1.1" +#define SNMP_BCAST_TABLE ".1.3.6.1.2.1.4.20.1.4" +#define SNMP_AT_TABLE_NET ".1.3.6.1.2.1.3.1.1.3" +#define SNMP_AT_TABLE_PHYS ".1.3.6.1.2.1.3.1.1.2" const char *SNMPQuery::SNMP_SYSNAME = ".1.3.6.1.2.1.1.5.0"; const char *SNMPQuery::SNMP_SYSDESCR = ".1.3.6.1.2.1.1.1.0"; @@ -648,7 +653,7 @@ void SNMPQuery::fetchInterfaces(Logger *logger, SyncFlag *stop_program, char oid[1024]; // Get admin status - sprintf(oid, "%s.%ld", SNMP_INTERFACE_ASTATUS , ifindex); + snprintf(oid, sizeof(oid), SNMP_INTERFACE_ASTATUS ".%ld", ifindex); v=c->get(oid); if(v.size()!=1) throw FWException( @@ -667,7 +672,7 @@ void SNMPQuery::fetchInterfaces(Logger *logger, SyncFlag *stop_program, } // Get operational status - sprintf(oid, "%s.%ld", SNMP_INTERFACE_OSTATUS , ifindex); + snprintf(oid, sizeof(oid), SNMP_INTERFACE_OSTATUS ".%ld", ifindex); v=c->get(oid); if(v.size()!=1) throw FWException( @@ -679,7 +684,7 @@ void SNMPQuery::fetchInterfaces(Logger *logger, SyncFlag *stop_program, /* gather all information for interface ifindex and create Interface object */ // Get desriptions - sprintf(oid,"%s.%ld", SNMP_INTERFACES_DESCR , ifindex); + snprintf(oid, sizeof(oid), SNMP_INTERFACES_DESCR ".%ld", ifindex); v=c->get(oid); string descr = SNMPVariable::varList2String(v); SNMPVariable::freeVarList(v); @@ -687,7 +692,7 @@ void SNMPQuery::fetchInterfaces(Logger *logger, SyncFlag *stop_program, list &addlist = addr[ifindex]; // Get physical address - sprintf(oid, "%s.%ld", SNMP_INTERFACES_PHYSA , ifindex); + snprintf(oid, sizeof(oid), SNMP_INTERFACES_PHYSA ".%ld", ifindex); v=c->get(oid); if(v.size()!=1) throw FWException(string("Unexpected response length for OID: ")+oid); @@ -697,7 +702,7 @@ void SNMPQuery::fetchInterfaces(Logger *logger, SyncFlag *stop_program, SNMPVariable::freeVarList(v); // Get type - sprintf(oid,"%s.%ld", SNMP_INTERFACES_TYPE , ifindex); + snprintf(oid, sizeof(oid), SNMP_INTERFACES_TYPE ".%ld", ifindex); v=c->get(oid); if(v.size()!=1) throw FWException(string("Unexpected response length for OID: ")+oid); @@ -1124,7 +1129,7 @@ SNMPVariable *SNMPVariable::create(struct variable_list *vars) throw(FWException return new SNMPVariable_IPaddr(vars->val.string, vars->val_len); default: char x[32]; - sprintf(x, "%d", (int)vars->type); + snprintf(x, sizeof(x), "%d", (int)vars->type); throw FWException(string("Unknown SNMP variable type: ") + x); } } @@ -1132,7 +1137,7 @@ SNMPVariable *SNMPVariable::create(struct variable_list *vars) throw(FWException string SNMPVariable_Int::toString() { char x[32]; - sprintf(x, "%ld", value); + snprintf(x, sizeof(x), "%ld", value); return x; } @@ -1143,10 +1148,10 @@ string SNMPVariable_Bits::toString() { res += "."; - char x[8]; + char x[12]; //TODO: now we print it in hex // we should print it in binary. - sprintf(x, "%d", (uint32_t)value[i]); + snprintf(x, sizeof(x), "%d", (uint32_t)value[i]); //i += 4; res += x; } @@ -1160,8 +1165,8 @@ string SNMPVariable_IPaddr::toString() { if(i) res+="."; - char x[8]; - sprintf(x,"%d", (unsigned int)value[i]); + char x[12]; + snprintf(x, sizeof(x), "%d", (unsigned int)value[i]); res+=x; } res+="]"; @@ -1205,7 +1210,7 @@ const string SNMPVariable_String::toHexString() res+=':'; u_char c=value[i]; char buf[16]; - sprintf(buf,"%02X",(unsigned int)c); + snprintf(buf, sizeof(buf), "%02X", (unsigned int)c); res+=buf; } return res; @@ -1214,14 +1219,14 @@ const string SNMPVariable_String::toHexString() string SNMPVariable_Counter64::toString() { char x[70]; - sprintf(x,"[%ld:%ld]", (long)low, (long)high); + snprintf(x, sizeof(x), "[%ld:%ld]", (long)low, (long)high); return x; } string SNMPVariable_OID::toString() { char x[32]; - sprintf(x,"%ld", (long)value); + snprintf(x, sizeof(x), "%ld", (long)value); return x; } diff --git a/src/libgui/ObjectManipulator_slots.cpp b/src/libgui/ObjectManipulator_slots.cpp index c70047a19..8e9c7d94e 100644 --- a/src/libgui/ObjectManipulator_slots.cpp +++ b/src/libgui/ObjectManipulator_slots.cpp @@ -231,13 +231,15 @@ void ObjectManipulator::pasteObj() continue; // Check if we have already copied the same object before - char s[64]; - sprintf(s, ".copy_of_%p", co->getRoot()); - string dedup_attribute = s; + QString buff; + buff.sprintf(".copy_of_%p", co->getRoot()); + string dedup_attribute = buff.toAscii().constData(); - sprintf(s, "%d", co->getId()); + buff.sprintf("%d", co->getId()); + QByteArray bytes = buff.toAscii(); FWObject *n_obj = - target_object->getRoot()->findObjectByAttribute(dedup_attribute, s); + target_object->getRoot()->findObjectByAttribute(dedup_attribute, + bytes.constData()); if (n_obj) continue; last_object = actuallyPasteTo(target_object, co, map_ids); diff --git a/src/libgui/StartTipDialog.cpp b/src/libgui/StartTipDialog.cpp index 57030a93c..6c94d9a4f 100644 --- a/src/libgui/StartTipDialog.cpp +++ b/src/libgui/StartTipDialog.cpp @@ -84,9 +84,8 @@ StartTipDialog::StartTipDialog(QWidget *parent): QDialog(parent) int tip_no = 1; while (true) { - char buf[64]; - sprintf(buf, "tip%02d.html", tip_no); - QString tip_file = QString(buf); + QString tip_file; + tip_file.sprintf("tip%02d.html", tip_no); QString contents; if (fwbdebug) qDebug("Trying tip file %s", tip_file.toAscii().constData());