[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