You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
Fix for JSON_VALUE function to remove OOB stack access (#2852)
MCOL-271 introduced a bug in JSON_VALUE that was discovered during implementation of ASAN builds. The changes here restore normal functionality. In short, changes in MCOL-271 introduced a local variable instead of reference to a string in ConstantColumn's fResult.strVal. The handling of ConstantColumn is different because ConstantColumn's value is used to initialize JSON path once. JSON path value holds pointer to data it does not own and if there are two or more rows the data can be corrupted and/or be out of stack bounds. The changes here introduce reference to a NullString that is held in the ConstantColumn's fResult.strVal and uses appropriate functions to obtain data from the NullString. CC's fResult is held by CC and strVal is also neither changing nor moving during operation, which allow JSON path to hold correct pointers during multi-row operation.
This commit is contained in:
@ -64,8 +64,7 @@ bool JSONPathWrapper::extract(std::string& ret, rowgroup::Row& row, execplan::SP
|
||||
bool isNullJS = false, isNullPath = false;
|
||||
|
||||
const string js = funcParamJS->data()->getStrVal(row, isNullJS).safeString("");
|
||||
const string sjsp = funcParamPath->data()->getStrVal(row, isNullPath).safeString("");
|
||||
const string_view jsp = sjsp;
|
||||
const utils::NullString& sjsp = funcParamPath->data()->getStrVal(row, isNullPath);
|
||||
if (isNullJS || isNullPath)
|
||||
return true;
|
||||
|
||||
@ -79,8 +78,8 @@ bool JSONPathWrapper::extract(std::string& ret, rowgroup::Row& row, execplan::SP
|
||||
constant = (constCol != nullptr);
|
||||
}
|
||||
|
||||
if (isNullPath || json_path_setup(&p, getCharset(funcParamPath), (const uchar*)jsp.data(),
|
||||
(const uchar*)jsp.data() + jsp.size()))
|
||||
if (isNullPath || json_path_setup(&p, getCharset(funcParamPath), (const uchar*)sjsp.str(),
|
||||
(const uchar*)sjsp.end()))
|
||||
return true;
|
||||
|
||||
parsed = constant;
|
||||
|
Reference in New Issue
Block a user