IPA HAL: Input Checks

Check input args for v4/v6 address and ifaces.

Test: as follows
    - built
    - flashed
    - booted
    - manually ran these VTS tests with setenforce 0
Bug: 38220415
Bug: 64479437
CRs-fixed: 2083182
Change-Id: Ife548b0bbfd1854dbcd2500ccb6477e85c6291b7
Signed-off-by: Tyler Wear <twear@codeaurora.org>
Signed-off-by: Niranjan Pendharkar <npendhar@codeaurora.org>
(cherry picked from commit dd34999536cfe0f512e0347de8f37f038bde12af)
diff --git a/msm8998/hal/src/HAL.cpp b/msm8998/hal/src/HAL.cpp
index 8ff0aa8..22aff0f 100644
--- a/msm8998/hal/src/HAL.cpp
+++ b/msm8998/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/msm8998/hal/src/PrefixParser.cpp b/msm8998/hal/src/PrefixParser.cpp
index 60aae08..d38bec0 100644
--- a/msm8998/hal/src/PrefixParser.cpp
+++ b/msm8998/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);