Type:
Bug
Priority:
Major
Resolution:
Fixed
Affects Version/s:
2.1
Component/s:
None
When using async, there is a logic error in the connect/close processing when using async but an error occurs during connection. Sample code:
MYSQL* pTest, *pRes;
int nRV, nRes;
// Create for async:
pTest = mysql_init(nullptr);
mysql_options(pTest, MYSQL_OPT_NONBLOCK, 0);
// Async connect:
nRV = mysql_real_connect_start(&pRes, pTest, "nonexist.example.com", "", "", "", 0, nullptr, 0);
while (nRV != 0)
{
nRV = mysql_real_connect_cont(&pRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (pRes == nullptr) {
printf("FAIL\n");
} else {
printf("SUCC\n");
};
// Async close:
nRV = mysql_close_start(pTest);
while (nRV != 0) {
nRV = mysql_close_cont(pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
This will segfault in mysql_close_start. The problem is that when real_connect fails, it deletes the options object that indicates that the client is using async. This happens on Line 1989 of libmariadb.c. This does not occur if there is a connection/network failure in any other async function. For comparison, here is modified sample code:
MYSQL* pTest, *pRes;
int nRV, nRes;
// Create for async:
pTest = mysql_init(nullptr);
mysql_options(pTest, MYSQL_OPT_NONBLOCK, 0);
// Async connect:
nRV = mysql_real_connect_start(&pRes, pTest, nullptr, "", "", "", 0, nullptr, 0);
while (nRV != 0) { nRV = mysql_real_connect_cont(&pRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ); }
;
if (pRes == nullptr)
{
printf("FAIL\n");
} else {
printf("SUCC\n");
};
// Async query:
nRV = mysql_query_start(&nRes, pTest, "show databases");
while (nRV != 0) {
closesocket(mysql_get_socket(pTest));
nRV = mysql_query_cont(&nRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (nRes == 0) { printf("SUCCn"); } else { printf("FAILn"); }
;
// Async close:
nRV = mysql_close_start(pTest);
while (nRV != 0)
{
nRV = mysql_close_cont(pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
}
;
This will run successfully without any segfault, because when the mysql_query_cont() call fails, it does not delete the options object.
There are a few possible fixes:
1. Add note to the documentation that mysql_close_start cannot be used if an error occurs in mysql_real_connect_start/cont.
2. Remove the call to mysql_close_options() at the bottom of the mthd_my_real_connect() function. This way, the MYSQL* object will be in the same state regardless of whether a connection error occurs in mysql_connect or mysql_query.
3. Modify mysql_close_start() to first check if the socket is actually running. If it is not running, then it can divert to run the synchronous mysql_close() instead. This avoids the problem under all circumstances without modifying the current behavior. For this, change part of mysql_async.c from:
int STDCALL
mysql_close_start(MYSQL *sock)
{
int res;
/* It is legitimate to have NULL sock argument, which will do nothing. */
if (sock)
{
res= mysql_close_slow_part_start(sock);
/* If we need to block, return now and do the rest in mysql_close_cont(). */
if (res)
return res;
}
mysql_close(sock);
return 0;
}
To:
mysql_close_start(MYSQL *sock)
{
int res;
/* It is legitimate to have NULL sock argument, which will do nothing. */
if (sock && sock->net.vio)
{ res= mysql_close_slow_part_start(sock); /* If we need to block, return now and do the rest in mysql_close_cont(). */ if (res) return res; }
mysql_close(sock);
return 0;
}
Note the only change is the if conditional, from:
if (sock)
To:
if (sock && sock->net.vio)
An alternative that would work is:
if (sock && sock->options.extension)
Matt Fagan
made changes -
2015-06-09 14:44
Field
Original Value
New Value
Description
When using async, there is a logic error in the connect/close processing when using async but an error occurs during connection. Sample code:
MYSQL* pTest, *pRes;
int nRV, nRes;
// Create for async:
pTest = mysql_init(nullptr);
mysql_options(pTest, MYSQL_OPT_NONBLOCK, 0);
// Async connect:
nRV = mysql_real_connect_start(&pRes, pTest, "nonexist.example.com", "", "", "", 0, nullptr, 0);
while (nRV != 0) {
nRV = mysql_real_connect_cont(&pRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (pRes == nullptr) {
printf("FAIL\n");
} else {
printf("SUCC\n");
};
// Async close:
nRV = mysql_close_start(pTest);
while (nRV != 0) {
nRV = mysql_close_cont(pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
This will segfault in mysql_close_start. The problem is that when real_connect fails, it deletes the options object that indicates that the client is using async. This happens on Line 1989 of libmariadb.c. This does not occur if there is a connection/network failure in any other async function. For comparison, here is modified sample code:
MYSQL* pTest, *pRes;
int nRV, nRes;
// Create for async:
pTest = mysql_init(nullptr);
mysql_options(pTest, MYSQL_OPT_NONBLOCK, 0);
// Async connect:
nRV = mysql_real_connect_start(&pRes, pTest, nullptr, "", "", "", 0, nullptr, 0);
while (nRV != 0) {
nRV = mysql_real_connect_cont(&pRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (pRes == nullptr) {
printf("FAIL\n");
} else {
printf("SUCC\n");
};
// Async query:
nRV = mysql_query_start(&nRes, pTest, "show databases");
while (nRV != 0) {
closesocket(mysql_get_socket(pTest));
nRV = mysql_query_cont(&nRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (nRes == 0) {
printf("SUCC\n");
} else {
printf("FAIL\n");
};
// Async close:
nRV = mysql_close_start(pTest);
while (nRV != 0) {
nRV = mysql_close_cont(pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
This will run successfully without any segfault, because when the mysql_query_cont() call fails, it does not delete the options object.
There are two possible fixes:
1. Add note to the documentation that mysql_close_start cannot be used if an error occurs in mysql_real_connect_start/cont.
2. Remove the call to mysql_close_options() at the bottom of the mthd_my_real_connect() function. This way, the MYSQL* object will be in the same state regardless of whether a connection error occurs in mysql_connect or mysql_query.
When using async, there is a logic error in the connect/close processing when using async but an error occurs during connection. Sample code:
MYSQL* pTest, *pRes;
int nRV, nRes;
// Create for async:
pTest = mysql_init(nullptr);
mysql_options(pTest, MYSQL_OPT_NONBLOCK, 0);
// Async connect:
nRV = mysql_real_connect_start(&pRes, pTest, "nonexist.example.com", "", "", "", 0, nullptr, 0);
while (nRV != 0) {
nRV = mysql_real_connect_cont(&pRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (pRes == nullptr) {
printf("FAIL\n");
} else {
printf("SUCC\n");
};
// Async close:
nRV = mysql_close_start(pTest);
while (nRV != 0) {
nRV = mysql_close_cont(pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
This will segfault in mysql_close_start. The problem is that when real_connect fails, it deletes the options object that indicates that the client is using async. This happens on Line 1989 of libmariadb.c. This does not occur if there is a connection/network failure in any other async function. For comparison, here is modified sample code:
MYSQL* pTest, *pRes;
int nRV, nRes;
// Create for async:
pTest = mysql_init(nullptr);
mysql_options(pTest, MYSQL_OPT_NONBLOCK, 0);
// Async connect:
nRV = mysql_real_connect_start(&pRes, pTest, nullptr, "", "", "", 0, nullptr, 0);
while (nRV != 0) {
nRV = mysql_real_connect_cont(&pRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (pRes == nullptr) {
printf("FAIL\n");
} else {
printf("SUCC\n");
};
// Async query:
nRV = mysql_query_start(&nRes, pTest, "show databases");
while (nRV != 0) {
closesocket(mysql_get_socket(pTest));
nRV = mysql_query_cont(&nRes, pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
if (nRes == 0) {
printf("SUCC\n");
} else {
printf("FAIL\n");
};
// Async close:
nRV = mysql_close_start(pTest);
while (nRV != 0) {
nRV = mysql_close_cont(pTest, MYSQL_WAIT_WRITE | MYSQL_WAIT_READ);
};
This will run successfully without any segfault, because when the mysql_query_cont() call fails, it does not delete the options object.
There are a few possible fixes:
1. Add note to the documentation that mysql_close_start cannot be used if an error occurs in mysql_real_connect_start/cont.
2. Remove the call to mysql_close_options() at the bottom of the mthd_my_real_connect() function. This way, the MYSQL* object will be in the same state regardless of whether a connection error occurs in mysql_connect or mysql_query.
3. Modify mysql_close_start() to first check if the socket is actually running. If it is not running, then it can divert to run the synchronous mysql_close() instead. This avoids the problem under all circumstances without modifying the current behavior. For this, change part of mysql_async.c from:
int STDCALL
mysql_close_start(MYSQL *sock)
{
int res;
/* It is legitimate to have NULL sock argument, which will do nothing. */
if (sock)
{
res= mysql_close_slow_part_start(sock);
/* If we need to block, return now and do the rest in mysql_close_cont(). */
if (res)
return res;
}
mysql_close(sock);
return 0;
}
To:
mysql_close_start(MYSQL *sock)
{
int res;
/* It is legitimate to have NULL sock argument, which will do nothing. */
if (sock && sock->net.vio)
{
res= mysql_close_slow_part_start(sock);
/* If we need to block, return now and do the rest in mysql_close_cont(). */
if (res)
return res;
}
mysql_close(sock);
return 0;
}
Note the only change is the if conditional, from:
if (sock)
To:
if (sock && sock->net.vio)
An alternative that would work is:
if (sock && sock->options.extension)
Georg Richter
made changes -
2015-09-08 08:29
Fix Version/s
2.2.0
[ 19500
]
Resolution
Fixed
[ 1
]
Status
Open
[ 1
]
Closed
[ 6
]
Julien Fritsch
made changes -
2022-01-11 15:33
Workflow
MariaDB connectors
[ 69868
]
MariaDB v4
[ 160989
]
{"report":{"fcp":989.0999999642372,"ttfb":257.80000001192093,"pageVisibility":"visible","entityId":51668,"key":"jira.project.issue.view-issue","isInitial":true,"threshold":1000,"elementTimings":{},"userDeviceMemory":8,"userDeviceProcessors":64,"apdex":0.5,"journeyId":"65c2292f-3ab5-4aa9-b625-d93a08a1ca5b","navigationType":0,"readyForUser":1059.699999988079,"redirectCount":0,"resourceLoadedEnd":1085.5,"resourceLoadedStart":263.30000001192093,"resourceTiming":[{"duration":216.69999998807907,"initiatorType":"link","name":"https://jira.mariadb.org/s/2c21342762a6a02add1c328bed317ffd-CDN/lu2bu7/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/css/_super/batch.css","startTime":263.30000001192093,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":263.30000001192093,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":480,"responseStart":0,"secureConnectionStart":0},{"duration":216.69999998807907,"initiatorType":"link","name":"https://jira.mariadb.org/s/7ebd35e77e471bc30ff0eba799ebc151-CDN/lu2bu7/820016/12ta74/8679b4946efa1a0bb029a3a22206fb5d/_/download/contextbatch/css/jira.browse.project,project.issue.navigator,jira.view.issue,jira.general,jira.global,atl.general,-_super/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":263.5,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":263.5,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":480.19999998807907,"responseStart":0,"secureConnectionStart":0},{"duration":225.5,"initiatorType":"script","name":"https://jira.mariadb.org/s/fbf975c0cce4b1abf04784eeae9ba1f4-CDN/lu2bu7/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/js/_super/batch.js?locale=en","startTime":263.80000001192093,"connectEnd":263.80000001192093,"connectStart":263.80000001192093,"domainLookupEnd":263.80000001192093,"domainLookupStart":263.80000001192093,"fetchStart":263.80000001192093,"redirectEnd":0,"redirectStart":0,"requestStart":263.80000001192093,"responseEnd":489.30000001192093,"responseStart":489.30000001192093,"secureConnectionStart":263.80000001192093},{"duration":301.69999998807907,"initiatorType":"script","name":"https://jira.mariadb.org/s/099b33461394b8015fc36c0a4b96e19f-CDN/lu2bu7/820016/12ta74/8679b4946efa1a0bb029a3a22206fb5d/_/download/contextbatch/js/jira.browse.project,project.issue.navigator,jira.view.issue,jira.general,jira.global,atl.general,-_super/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true","startTime":263.89999997615814,"connectEnd":263.89999997615814,"connectStart":263.89999997615814,"domainLookupEnd":263.89999997615814,"domainLookupStart":263.89999997615814,"fetchStart":263.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":263.89999997615814,"responseEnd":565.5999999642372,"responseStart":565.5999999642372,"secureConnectionStart":263.89999997615814},{"duration":305.19999998807907,"initiatorType":"script","name":"https://jira.mariadb.org/s/94c15bff32baef80f4096a08aceae8bc-CDN/lu2bu7/820016/12ta74/c92c0caa9a024ae85b0ebdbed7fb4bd7/_/download/contextbatch/js/atl.global,-_super/batch.js?locale=en","startTime":264.19999998807907,"connectEnd":264.19999998807907,"connectStart":264.19999998807907,"domainLookupEnd":264.19999998807907,"domainLookupStart":264.19999998807907,"fetchStart":264.19999998807907,"redirectEnd":0,"redirectStart":0,"requestStart":264.19999998807907,"responseEnd":569.3999999761581,"responseStart":569.3999999761581,"secureConnectionStart":264.19999998807907},{"duration":305.5,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2bu7/820016/12ta74/1.0/_/download/batch/jira.webresources:calendar-en/jira.webresources:calendar-en.js","startTime":264.39999997615814,"connectEnd":264.39999997615814,"connectStart":264.39999997615814,"domainLookupEnd":264.39999997615814,"domainLookupStart":264.39999997615814,"fetchStart":264.39999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":264.39999997615814,"responseEnd":569.8999999761581,"responseStart":569.8999999761581,"secureConnectionStart":264.39999997615814},{"duration":305.80000001192093,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2bu7/820016/12ta74/1.0/_/download/batch/jira.webresources:calendar-localisation-moment/jira.webresources:calendar-localisation-moment.js","startTime":264.5999999642372,"connectEnd":264.5999999642372,"connectStart":264.5999999642372,"domainLookupEnd":264.5999999642372,"domainLookupStart":264.5999999642372,"fetchStart":264.5999999642372,"redirectEnd":0,"redirectStart":0,"requestStart":264.5999999642372,"responseEnd":570.3999999761581,"responseStart":570.3999999761581,"secureConnectionStart":264.5999999642372},{"duration":367.89999997615814,"initiatorType":"link","name":"https://jira.mariadb.org/s/b04b06a02d1959df322d9cded3aeecc1-CDN/lu2bu7/820016/12ta74/a2ff6aa845ffc9a1d22fe23d9ee791fc/_/download/contextbatch/css/jira.global.look-and-feel,-_super/batch.css","startTime":264.80000001192093,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":264.80000001192093,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":632.6999999880791,"responseStart":0,"secureConnectionStart":0},{"duration":305.9000000357628,"initiatorType":"script","name":"https://jira.mariadb.org/rest/api/1.0/shortcuts/820016/47140b6e0a9bc2e4913da06536125810/shortcuts.js?context=issuenavigation&context=issueaction","startTime":264.89999997615814,"connectEnd":264.89999997615814,"connectStart":264.89999997615814,"domainLookupEnd":264.89999997615814,"domainLookupStart":264.89999997615814,"fetchStart":264.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":264.89999997615814,"responseEnd":570.8000000119209,"responseStart":570.8000000119209,"secureConnectionStart":264.89999997615814},{"duration":367.89999997615814,"initiatorType":"link","name":"https://jira.mariadb.org/s/3ac36323ba5e4eb0af2aa7ac7211b4bb-CDN/lu2bu7/820016/12ta74/d176f0986478cc64f24226b3d20c140d/_/download/contextbatch/css/com.atlassian.jira.projects.sidebar.init,-_super,-project.issue.navigator,-jira.view.issue/batch.css?jira.create.linked.issue=true","startTime":265,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":265,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":632.8999999761581,"responseStart":0,"secureConnectionStart":0},{"duration":306.19999998807907,"initiatorType":"script","name":"https://jira.mariadb.org/s/3339d87fa2538a859872f2df449bf8d0-CDN/lu2bu7/820016/12ta74/d176f0986478cc64f24226b3d20c140d/_/download/contextbatch/js/com.atlassian.jira.projects.sidebar.init,-_super,-project.issue.navigator,-jira.view.issue/batch.js?jira.create.linked.issue=true&locale=en","startTime":265.19999998807907,"connectEnd":265.19999998807907,"connectStart":265.19999998807907,"domainLookupEnd":265.19999998807907,"domainLookupStart":265.19999998807907,"fetchStart":265.19999998807907,"redirectEnd":0,"redirectStart":0,"requestStart":265.19999998807907,"responseEnd":571.3999999761581,"responseStart":571.3999999761581,"secureConnectionStart":265.19999998807907},{"duration":406.69999998807907,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2bu7/820016/12ta74/1.0/_/download/batch/jira.webresources:bigpipe-js/jira.webresources:bigpipe-js.js","startTime":266,"connectEnd":266,"connectStart":266,"domainLookupEnd":266,"domainLookupStart":266,"fetchStart":266,"redirectEnd":0,"redirectStart":0,"requestStart":266,"responseEnd":672.6999999880791,"responseStart":672.6999999880791,"secureConnectionStart":266},{"duration":467.7000000476837,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2bu7/820016/12ta74/1.0/_/download/batch/jira.webresources:bigpipe-init/jira.webresources:bigpipe-init.js","startTime":266.0999999642372,"connectEnd":266.0999999642372,"connectStart":266.0999999642372,"domainLookupEnd":266.0999999642372,"domainLookupStart":266.0999999642372,"fetchStart":266.0999999642372,"redirectEnd":0,"redirectStart":0,"requestStart":266.0999999642372,"responseEnd":733.8000000119209,"responseStart":733.8000000119209,"secureConnectionStart":266.0999999642372},{"duration":25.100000023841858,"initiatorType":"xmlhttprequest","name":"https://jira.mariadb.org/rest/webResources/1.0/resources","startTime":659.0999999642372,"connectEnd":659.0999999642372,"connectStart":659.0999999642372,"domainLookupEnd":659.0999999642372,"domainLookupStart":659.0999999642372,"fetchStart":659.0999999642372,"redirectEnd":0,"redirectStart":0,"requestStart":659.0999999642372,"responseEnd":684.1999999880791,"responseStart":684.1999999880791,"secureConnectionStart":659.0999999642372},{"duration":217.70000004768372,"initiatorType":"link","name":"https://jira.mariadb.org/s/d5715adaadd168a9002b108b2b039b50-CDN/lu2bu7/820016/12ta74/be4b45e9cec53099498fa61c8b7acba4/_/download/contextbatch/css/jira.project.sidebar,-_super,-project.issue.navigator,-jira.general,-jira.browse.project,-jira.view.issue,-jira.global,-atl.general,-com.atlassian.jira.projects.sidebar.init/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":688.0999999642372,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":688.0999999642372,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":905.8000000119209,"responseStart":0,"secureConnectionStart":0},{"duration":217.4000000357628,"initiatorType":"link","name":"https://jira.mariadb.org/s/50bc9be5bfead1a25e72c1a9338c94f6-CDN/lu2bu7/820016/12ta74/e108c7645258ccb43280ed3404e3e949/_/download/contextbatch/css/com.atlassian.jira.plugins.jira-development-integration-plugin:0,-_super,-jira.view.issue,-jira.global,-jira.general,-jira.browse.project,-project.issue.navigator,-atl.general/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":688.5999999642372,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":688.5999999642372,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":906,"responseStart":0,"secureConnectionStart":0},{"duration":389.5999999642372,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2bu7/820016/12ta74/e65b778d185daf5aee24936755b43da6/_/download/contextbatch/js/browser-metrics-plugin.contrib,-_super,-project.issue.navigator,-jira.view.issue,-atl.general/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true","startTime":689.5,"connectEnd":689.5,"connectStart":689.5,"domainLookupEnd":689.5,"domainLookupStart":689.5,"fetchStart":689.5,"redirectEnd":0,"redirectStart":0,"requestStart":689.5,"responseEnd":1079.0999999642372,"responseStart":1079.0999999642372,"secureConnectionStart":689.5},{"duration":394.19999998807907,"initiatorType":"script","name":"https://jira.mariadb.org/s/f51ef5507eea4c158f257c66c93b2a3f-CDN/lu2bu7/820016/12ta74/be4b45e9cec53099498fa61c8b7acba4/_/download/contextbatch/js/jira.project.sidebar,-_super,-project.issue.navigator,-jira.general,-jira.browse.project,-jira.view.issue,-jira.global,-atl.general,-com.atlassian.jira.projects.sidebar.init/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true","startTime":689.8999999761581,"connectEnd":689.8999999761581,"connectStart":689.8999999761581,"domainLookupEnd":689.8999999761581,"domainLookupStart":689.8999999761581,"fetchStart":689.8999999761581,"redirectEnd":0,"redirectStart":0,"requestStart":689.8999999761581,"responseEnd":1084.0999999642372,"responseStart":1084.0999999642372,"secureConnectionStart":689.8999999761581},{"duration":395.19999998807907,"initiatorType":"script","name":"https://jira.mariadb.org/s/86ee9bbc76cd1bcd8556fcdcf46241c9-CDN/lu2bu7/820016/12ta74/e108c7645258ccb43280ed3404e3e949/_/download/contextbatch/js/com.atlassian.jira.plugins.jira-development-integration-plugin:0,-_super,-jira.view.issue,-jira.global,-jira.general,-jira.browse.project,-project.issue.navigator,-atl.general/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true","startTime":690.3000000119209,"connectEnd":690.3000000119209,"connectStart":690.3000000119209,"domainLookupEnd":690.3000000119209,"domainLookupStart":690.3000000119209,"fetchStart":690.3000000119209,"redirectEnd":0,"redirectStart":0,"requestStart":690.3000000119209,"responseEnd":1085.5,"responseStart":1085.5,"secureConnectionStart":690.3000000119209}],"fetchStart":0,"domainLookupStart":0,"domainLookupEnd":0,"connectStart":0,"connectEnd":0,"requestStart":53,"responseStart":257,"responseEnd":260,"domLoading":261,"domInteractive":1142,"domContentLoadedEventStart":1142,"domContentLoadedEventEnd":1192,"domComplete":1394,"loadEventStart":1394,"loadEventEnd":1395,"userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","marks":[{"name":"bigPipe.sidebar-id.start","time":1097.300000011921},{"name":"bigPipe.sidebar-id.end","time":1098.199999988079},{"name":"bigPipe.activity-panel-pipe-id.start","time":1098.300000011921},{"name":"bigPipe.activity-panel-pipe-id.end","time":1100.3999999761581},{"name":"activityTabFullyLoaded","time":1209.5999999642372}],"measures":[],"correlationId":"649d043208ae46","effectiveType":"4g","downlink":10,"rtt":0,"serverDuration":112,"dbReadsTimeInMs":14,"dbConnsTimeInMs":22,"applicationHash":"9d11dbea5f4be3d4cc21f03a88dd11d8c8687422","experiments":[]}}
Thanks for your bug report and provided fix!
Fixed in C/C 2.2 rev. abf0080bfa0a4255713034eb60245f2d890652da