提交 6c64b760 编写于 作者: G Ganlin Zhao

fix: fix tsim crash on windows due to invalid input to strftime

上级 1a2a04b0
......@@ -1864,7 +1864,10 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) {
}
}
struct tm ptm = {0};
taosLocalTime(&tt, &ptm);
if (taosLocalTime(&tt, &ptm) == NULL) {
sprintf(buf, "NaN");
return buf;
}
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
if (precision == TSDB_TIME_PRECISION_NANO) {
......
......@@ -867,13 +867,19 @@ const char* fmtts(int64_t ts) {
if (ts > -62135625943 && ts < 32503651200) {
time_t t = (time_t)ts;
taosLocalTime(&t, &tm);
if (taosLocalTime(&t, &tm) == NULL) {
sprintf(buf, "NaN");
return buf;
}
pos += strftime(buf + pos, sizeof(buf), "s=%Y-%m-%d %H:%M:%S", &tm);
}
if (ts > -62135625943000 && ts < 32503651200000) {
time_t t = (time_t)(ts / 1000);
taosLocalTime(&t, &tm);
if (taosLocalTime(&t, &tm) == NULL) {
sprintf(buf, "NaN");
return buf;
}
if (pos > 0) {
buf[pos++] = ' ';
buf[pos++] = '|';
......@@ -885,7 +891,10 @@ const char* fmtts(int64_t ts) {
{
time_t t = (time_t)(ts / 1000000);
taosLocalTime(&t, &tm);
if (taosLocalTime(&t, &tm) == NULL) {
sprintf(buf, "NaN");
return buf;
}
if (pos > 0) {
buf[pos++] = ' ';
buf[pos++] = '|';
......@@ -937,7 +946,10 @@ void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision)
ASSERT(false);
}
taosLocalTime(&quot, &ptm);
if (taosLocalTime(&quot, &ptm) == NULL) {
sprintf(buf, "NaN");
return;
}
int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", &ptm);
length += snprintf(ts + length, fractionLen, format, mod);
length += (int32_t)strftime(ts + length, 40 - length, "%z", &ptm);
......
......@@ -213,8 +213,11 @@ static int32_t addTimezoneParam(SNodeList* pList) {
char buf[6] = {0};
time_t t = taosTime(NULL);
struct tm tmInfo;
taosLocalTime(&t, &tmInfo);
strftime(buf, sizeof(buf), "%z", &tmInfo);
if (taosLocalTime(&t, &tmInfo) == NULL) {
sprintf(buf, "NaN");
} else {
strftime(buf, sizeof(buf), "%z", &tmInfo);
}
int32_t len = (int32_t)strlen(buf);
SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
......
......@@ -1067,9 +1067,16 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
}
struct tm tmInfo;
taosLocalTime((const time_t *)&timeVal, &tmInfo);
int32_t len = 0;
if (taosLocalTime((const time_t *)&timeVal, &tmInfo) == NULL) {
sprintf(buf, "NaN");
len = (int32_t)strlen(buf);
goto _end;
}
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", &tmInfo);
int32_t len = (int32_t)strlen(buf);
len = (int32_t)strlen(buf);
// add timezone string
if (tzLen > 0) {
......@@ -1103,6 +1110,7 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
len += fracLen;
}
_end:
memmove(buf + VARSTR_HEADER_SIZE, buf, len);
varDataSetLen(buf, len);
......
......@@ -472,7 +472,10 @@ static char* shellFormatTimestamp(char* buf, int64_t val, int32_t precision) {
}
struct tm ptm;
taosLocalTime(&tt, &ptm);
if (taosLocalTime(&tt, &ptm) == NULL) {
sprintf(tt, "NaN");
return buf;
}
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
if (precision == TSDB_TIME_PRECISION_NANO) {
......
......@@ -772,7 +772,10 @@ bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
tt = (*(int64_t *)row[i]) / 1000000000;
}
taosLocalTime(&tt, &tp);
if (taosLocalTime(&tt, &tp) == NULL) {
sprintf(timeStr, "NaN");
break;
}
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", &tp);
if (precision == TSDB_TIME_PRECISION_MILLI) {
sprintf(value, "%s.%03d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册