[Beignet] [PATCH V2] Fix the bug of crash when we pass -I path with spaces.

junyan.he at inbox.com junyan.he at inbox.com
Wed Jan 20 01:57:20 PST 2016


From: Junyan He <junyan.he at linux.intel.com>

We failed to handle -I "/XX X/YY YY/" like path passed
from the build option. We need to consider the spaces
here and pass it correctly to Clang.

Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
 backend/src/backend/program.cpp | 51 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 47 insertions(+), 4 deletions(-)

diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
index f886d03..c8bc688 100644
--- a/backend/src/backend/program.cpp
+++ b/backend/src/backend/program.cpp
@@ -770,17 +770,60 @@ namespace gbe {
     bool useDefaultCLCVersion = true;
 
     if (options) {
-      char *str = (char *)malloc(sizeof(char) * (strlen(options) + 1));
-      memcpy(str, options, strlen(options) + 1);
-      std::string optionStr(str);
+      char *c_str = (char *)malloc(sizeof(char) * (strlen(options) + 1));
+      memcpy(c_str, options, strlen(options) + 1);
+      std::string optionStr(c_str);
       const std::string unsupportedOptions("-cl-denorms-are-zero, -cl-strict-aliasing, -cl-opt-disable,"
                        "-cl-no-signed-zeros, -cl-fp32-correctly-rounded-divide-sqrt");
 
       const std::string uncompatiblePCHOptions = ("-cl-single-precision-constant, -cl-fast-relaxed-math, -cl-std=CL1.1, -cl-finite-math-only");
       const std::string fastMathOption = ("-cl-fast-relaxed-math");
       while (end != std::string::npos) {
+        /* need to handle -I"/XX X/X XX" with spaces first. */
+        if (optionStr[start] == '-' && optionStr[start + 1] == 'I') {
+          end = start + 2;
+          while(end < optionStr.size() && optionStr[end] == ' ') // Ignore the spaces
+            end++;
+
+          if (end == optionStr.size()) { //reach the end and no content, ignore
+            free(c_str);
+            return true;
+          }
+
+          if (optionStr[end] != '"') { // just a normal path without " "
+            clOpt.push_back("-I");
+            start = end;
+            continue;
+          }
+
+          end++;
+          start = end;
+          clOpt.push_back("-I");
+
+          /* find the second " */
+          while (end < optionStr.size() && optionStr[end] != '"')
+            end++;
+
+          if (optionStr[end] != '"') {
+            free(c_str);
+            return false;
+          }
+
+          if (end == start + 1) { // the case of "", ignore
+            start = end + 1;
+            continue;
+          }
+
+          std::string IPath = optionStr.substr(start, end - start);
+          clOpt.push_back(IPath.c_str());
+          start = end + 1;
+          continue;
+        }
+
+
         end = optionStr.find(' ', start);
         std::string str = optionStr.substr(start, end - start);
+
         start = end + 1;
         if(str.size() == 0)
           continue;
@@ -822,7 +865,7 @@ namespace gbe {
 
         clOpt.push_back(str);
       }
-      free(str);
+      free(c_str);
     }
 
     if (useDefaultCLCVersion) {
-- 
1.9.1





More information about the Beignet mailing list