Fixes CVE-2025-49014 which was introduced in 1.8.0

This commit is contained in:
Mattias Wadman authored and itchyny committed 2025-06-19 00:11:01 +02:00
1 parent edbc1da809
commit 499c91bca9
2 files changed
+12 -2

No files matched your search

+4 -2
View File
@@ -1764,6 +1764,7 @@ static jv f_strftime(jq_state *jq, jv a, jv b) {
return ret_error(b, jv_string("strftime/1 requires parsed datetime inputs"));
const char *fmt = jv_string_value(b);
int fmt_not_empty = *fmt != '\0';
size_t max_size = strlen(fmt) + 100;
char *buf = jv_mem_alloc(max_size);
#ifdef __APPLE__
@@ -1784,7 +1785,7 @@ static jv f_strftime(jq_state *jq, jv a, jv b) {
#endif
jv_free(b);
/* POSIX doesn't provide errno values for strftime() failures; weird */
if ((n == 0 && *fmt) || n > max_size) {
if ((n == 0 && fmt_not_empty) || n > max_size) {
free(buf);
return jv_invalid_with_msg(jv_string("strftime/1: unknown system failure"));
}
@@ -1813,12 +1814,13 @@ static jv f_strflocaltime(jq_state *jq, jv a, jv b) {
if (!jv2tm(a, &tm, 1))
return ret_error(b, jv_string("strflocaltime/1 requires parsed datetime inputs"));
const char *fmt = jv_string_value(b);
int fmt_not_empty = *fmt != '\0';
size_t max_size = strlen(fmt) + 100;
char *buf = jv_mem_alloc(max_size);
size_t n = strftime(buf, max_size, fmt, &tm);
jv_free(b);
/* POSIX doesn't provide errno values for strftime() failures; weird */
if ((n == 0 && *fmt) || n > max_size) {
if ((n == 0 && fmt_not_empty) || n > max_size) {
free(buf);
return jv_invalid_with_msg(jv_string("strflocaltime/1: unknown system failure"));
}
+8
View File
@@ -2499,3 +2499,11 @@ foreach .[] as $x (0, 1; . + $x)
3
2
4
# regression test for CVE-2025-49014 (use of fmt after free)
# tests with both empty string literal and empty string created by function
# as they seems to behave referecne wise differently.
strflocaltime("" | ., @uri)
0
""
""