Move sprintf statements to getRouteTableForInterface.
(cherry picked from commit b45648ad5902e53f433615ab1a0268927b6a328e)
Change-Id: Ie0b2c3e3688285068b70e96d1153c0b105548a00
diff --git a/RouteController.cpp b/RouteController.cpp
index fbd1b00..643c2e1 100644
--- a/RouteController.cpp
+++ b/RouteController.cpp
@@ -24,9 +24,9 @@
namespace {
-const char* const RULE_PRIORITY_PER_NETWORK_EXPLICIT = "300";
-const char* const RULE_PRIORITY_PER_NETWORK_OIF = "400";
-const char* const RULE_PRIORITY_PER_NETWORK_NORMAL = "700";
+const uint32_t RULE_PRIORITY_PER_NETWORK_EXPLICIT = 300;
+const uint32_t RULE_PRIORITY_PER_NETWORK_OIF = 400;
+const uint32_t RULE_PRIORITY_PER_NETWORK_NORMAL = 700;
const bool FWMARK_USE_NET_ID = true;
const bool FWMARK_USE_EXPLICIT = true;
@@ -37,8 +37,17 @@
return index ? index + RouteController::ROUTE_TABLE_OFFSET_FROM_INDEX : 0;
}
-bool runIpRuleCommand(const char* action, const char* priority, const char* table,
- const char* fwmark, const char* oif) {
+bool runIpRuleCommand(const char* action, uint32_t priority, uint32_t table,
+ uint32_t fwmark, uint32_t mask, const char* oif) {
+
+ char priorityString[UINT32_STRLEN];
+ char tableString[UINT32_STRLEN];
+ snprintf(priorityString, sizeof(priorityString), "%u", priority);
+ snprintf(tableString, sizeof(tableString), "%u", table);
+
+ char fwmarkString[sizeof("0x12345678/0x12345678")];
+ snprintf(fwmarkString, sizeof(fwmarkString), "0x%x/0x%x", fwmark, mask);
+
const char* version[] = {"-4", "-6"};
for (size_t i = 0; i < ARRAY_SIZE(version); ++i) {
int argc = 0;
@@ -49,12 +58,12 @@
argv[argc++] = "rule";
argv[argc++] = action;
argv[argc++] = "priority";
- argv[argc++] = priority;
+ argv[argc++] = priorityString;
argv[argc++] = "table";
- argv[argc++] = table;
- if (fwmark) {
+ argv[argc++] = tableString;
+ if (mask) {
argv[argc++] = "fwmark";
- argv[argc++] = fwmark;
+ argv[argc++] = fwmarkString;
}
if (oif) {
argv[argc++] = "oif";
@@ -74,10 +83,6 @@
return false;
}
- char tableString[sizeof("0x12345678")];
- snprintf(tableString, sizeof(tableString), "0x%x", table);
-
- char markString[sizeof("0x12345678/0x12345678")];
const char* action = add ? ADD : DEL;
// A rule to route traffic based on an explicitly chosen network.
@@ -89,9 +94,7 @@
uint32_t fwmark = getFwmark(netId, FWMARK_USE_EXPLICIT, !FWMARK_USE_PROTECT, permission);
uint32_t mask = getFwmarkMask(FWMARK_USE_NET_ID, FWMARK_USE_EXPLICIT, !FWMARK_USE_PROTECT,
permission);
- snprintf(markString, sizeof(markString), "0x%x/0x%x", fwmark, mask);
- if (!runIpRuleCommand(action, RULE_PRIORITY_PER_NETWORK_EXPLICIT, tableString, markString,
- NULL)) {
+ if (!runIpRuleCommand(action, RULE_PRIORITY_PER_NETWORK_EXPLICIT, table, fwmark, mask, NULL)) {
return false;
}
@@ -101,9 +104,7 @@
// knows the outgoing interface (typically for link-local communications).
fwmark = getFwmark(0, !FWMARK_USE_EXPLICIT, !FWMARK_USE_PROTECT, permission);
mask = getFwmark(!FWMARK_USE_NET_ID, !FWMARK_USE_EXPLICIT, !FWMARK_USE_PROTECT, permission);
- snprintf(markString, sizeof(markString), "0x%x/0x%x", fwmark, mask);
- if (!runIpRuleCommand(action, RULE_PRIORITY_PER_NETWORK_OIF, tableString, markString,
- interface)) {
+ if (!runIpRuleCommand(action, RULE_PRIORITY_PER_NETWORK_OIF, table, fwmark, mask, interface)) {
return false;
}
@@ -114,9 +115,7 @@
// network stay on that network even if the default network changes.
fwmark = getFwmark(netId, !FWMARK_USE_EXPLICIT, !FWMARK_USE_PROTECT, permission);
mask = getFwmarkMask(FWMARK_USE_NET_ID, !FWMARK_USE_EXPLICIT, !FWMARK_USE_PROTECT, permission);
- snprintf(markString, sizeof(markString), "0x%x/0x%x", fwmark, mask);
- if (!runIpRuleCommand(action, RULE_PRIORITY_PER_NETWORK_NORMAL, tableString, markString,
- NULL)) {
+ if (!runIpRuleCommand(action, RULE_PRIORITY_PER_NETWORK_NORMAL, table, fwmark, mask, NULL)) {
return false;
}
@@ -128,6 +127,7 @@
// + Mark sockets that accept connections from this interface so that the connection stays on
// the same interface.
action = add ? "-A" : "-D";
+ char markString[UINT32_HEX_STRLEN];
snprintf(markString, sizeof(markString), "0x%x", netId);
if (execIptables(V4V6, "-t", "mangle", action, "INPUT", "-i", interface, "-j", "MARK",
"--set-mark", markString, NULL)) {