IPA HAL: Input Checks Check input args for v4/v6 addresses and ifaces. Bug: 38220415 Crs-fixed: 2083182 Change-Id: Ife548b0bbfd1854dbcd2500ccb6477e85c6291b7
diff --git a/hal/src/HAL.cpp b/hal/src/HAL.cpp index 18249a5..9a8f211 100644 --- a/hal/src/HAL.cpp +++ b/hal/src/HAL.cpp
@@ -41,6 +41,7 @@ /* External Includes */ #include <cutils/log.h> #include <string> +#include <sys/socket.h> #include <sys/types.h> #include <vector> @@ -399,15 +400,26 @@ const hidl_vec<hidl_string>& prefixes, setLocalPrefixes_cb hidl_cb ) { + BoolResult res; + PrefixParser parser; + vector<string> prefixesStr = convertHidlStrToStdStr(prefixes); + LocalLogBuffer::FunctionLog fl(__func__); - fl.addArg("prefixes", "unused"); - #pragma unused(prefixes) + fl.addArg("prefixes", prefixesStr); - /* Fake Success */ - BoolResult res = ipaResultToBoolResult(RET::SUCCESS); + if (!isInitialized()) { + BoolResult res = makeInputCheckFailure("Not initialized"); + } else if(prefixesStr.size() < 1) { + res = ipaResultToBoolResult(RET::FAIL_INPUT_CHECK); + } else if (!parser.add(prefixesStr)) { + res = makeInputCheckFailure(parser.getLastErrAsStr()); + } else { + res = ipaResultToBoolResult(RET::SUCCESS); + } + hidl_cb(res.success, res.errMsg); - fl.setResult(res.success, res.errMsg); + mLogs.addLog(fl); return Void(); } /* setLocalPrefixes */ @@ -484,7 +496,12 @@ * qualified here. But then, how do we allow them to be empty/null as well * while still preserving a sane API on PrefixParser? */ - if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) { + if (!isInitialized()) { + BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)"); + hidl_cb(res.success, res.errMsg); + fl.setResult(res.success, res.errMsg); + } + else if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) { BoolResult res = makeInputCheckFailure(v4AddrParser.getLastErrAsStr()); hidl_cb(res.success, res.errMsg); fl.setResult(res.success, res.errMsg); @@ -496,19 +513,6 @@ BoolResult res = makeInputCheckFailure(v6GwParser.getLastErrAsStr()); hidl_cb(res.success, res.errMsg); fl.setResult(res.success, res.errMsg); - } else if (v6GwParser.size() > 1) { - RET ipaReturn = mIPA->stopAllOffload(); - if (ipaReturn != RET::SUCCESS) { - BoolResult res = - makeInputCheckFailure("Cannot accept more than 1 IPv6 Gateway. Offload still running and may result in data path errors"); - hidl_cb(res.success, res.errMsg); - fl.setResult(res.success, res.errMsg); - } else { - BoolResult res = - makeInputCheckFailure("Cannot accept more than 1 IPv6 Gateway. In an effort to avoid any data path errors, offload has been stopped"); - hidl_cb(res.success, res.errMsg); - fl.setResult(res.success, res.errMsg); - } } else { RET ipaReturn = mIPA->setUpstream( iface.c_str(), @@ -535,7 +539,12 @@ PrefixParser prefixParser; - if (!prefixParser.add(prefix)) { + if (!isInitialized()) { + BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)"); + hidl_cb(res.success, res.errMsg); + fl.setResult(res.success, res.errMsg); + } + else if (!prefixParser.add(prefix)) { BoolResult res = makeInputCheckFailure(prefixParser.getLastErrAsStr()); hidl_cb(res.success, res.errMsg); fl.setResult(res.success, res.errMsg); @@ -564,7 +573,12 @@ PrefixParser prefixParser; - if (!prefixParser.add(prefix)) { + if (!isInitialized()) { + BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)"); + hidl_cb(res.success, res.errMsg); + fl.setResult(res.success, res.errMsg); + } + else if (!prefixParser.add(prefix)) { BoolResult res = makeInputCheckFailure(prefixParser.getLastErrAsStr()); hidl_cb(res.success, res.errMsg); fl.setResult(res.success, res.errMsg);
diff --git a/hal/src/PrefixParser.cpp b/hal/src/PrefixParser.cpp index 60aae08..d38bec0 100644 --- a/hal/src/PrefixParser.cpp +++ b/hal/src/PrefixParser.cpp
@@ -118,6 +118,9 @@ /* ------------------------------ PRIVATE ----------------------------------- */ bool PrefixParser::add(vector<string> in, IP_FAM famHint) { + if (in.size() == 0) + return false; + for (size_t i = 0; i < in.size(); i++) { if (!add(in[i], famHint)) return false; @@ -126,6 +129,11 @@ } /* add */ bool PrefixParser::add(string in, IP_FAM famHint) { + if (in.length() == 0) { + mLastErr = "Failed to parse string, length = 0..."; + return false; + } + if (famHint == IP_FAM::INVALID) famHint = guessIPFamily(in); @@ -138,8 +146,10 @@ } int mask = parseSubnetMask(subnet, famHint); - if (!isMaskValid(mask, famHint)) + if (!isMaskValid(mask, famHint)) { + mLastErr = "Invalid mask"; return false; + } Prefix pre = makeBlankPrefix(famHint);