[parsers] Fix possible stack overflow from recursion

Closes #1873
This commit is contained in:
ejurgensen 2025-03-07 16:22:43 +01:00
parent 8d2b4b925d
commit 13a8f71c0c
3 changed files with 42 additions and 0 deletions

View File

@ -182,6 +182,7 @@ int mpd_lex_parse(struct mpd_result *result, const char *input);
#include <assert.h>
#define INVERT_MASK 0x80000000
#define RECURSION_MAX 64
}
/* Dependencies, mocked or real */
@ -225,6 +226,8 @@ struct mpd_result {
int err;
char errmsg[128];
int recursion_level;
};
enum mpd_type {
@ -416,6 +419,15 @@ static void sql_append_recursive(struct mpd_result *result, struct mpd_result_pa
{
char escape_char;
if (result->recursion_level > RECURSION_MAX)
{
snprintf(result->errmsg, sizeof(result->errmsg), "Recursion maximum exceeded");
result->err = -2;
return;
}
result->recursion_level++;
switch (append_type)
{
case SQL_APPEND_OPERATOR:
@ -477,6 +489,8 @@ static void sql_append_recursive(struct mpd_result *result, struct mpd_result_pa
sql_append(result, part, ")");
break;
}
result->recursion_level--;
}
/* Creates the parsing result from the AST. Errors are set via result->err. */

View File

@ -178,6 +178,7 @@ int rsp_lex_parse(struct rsp_result *result, const char *input);
#include <assert.h>
#define INVERT_MASK 0x80000000
#define RECURSION_MAX 64
}
/* Dependencies, mocked or real */
@ -197,6 +198,8 @@ struct rsp_result {
int offset;
int err;
char errmsg[128];
int recursion_level;
};
}
@ -272,6 +275,15 @@ static void sql_append_recursive(struct rsp_result *result, struct ast *a, const
{
char escape_char;
if (result->recursion_level > RECURSION_MAX)
{
snprintf(result->errmsg, sizeof(result->errmsg), "Recursion maximum exceeded");
result->err = -2;
return;
}
result->recursion_level++;
switch (append_type)
{
case SQL_APPEND_OPERATOR:
@ -317,6 +329,8 @@ static void sql_append_recursive(struct rsp_result *result, struct ast *a, const
sql_append(result, ")");
break;
}
result->recursion_level--;
}
static void sql_from_ast(struct rsp_result *result, struct ast *a)

View File

@ -182,6 +182,7 @@ int smartpl_lex_parse(struct smartpl_result *result, const char *input);
#include <assert.h>
#define INVERT_MASK 0x80000000
#define RECURSION_MAX 64
}
/* Dependencies, mocked or real */
@ -215,6 +216,8 @@ struct smartpl_result {
int limit;
int err;
char errmsg[128];
int recursion_level;
};
}
@ -289,6 +292,15 @@ static void sql_append_recursive(struct smartpl_result *result, struct result_pa
{
char escape_char;
if (result->recursion_level > RECURSION_MAX)
{
snprintf(result->errmsg, sizeof(result->errmsg), "Recursion maximum exceeded");
result->err = -2;
return;
}
result->recursion_level++;
switch (append_type)
{
case SQL_APPEND_OPERATOR:
@ -359,6 +371,8 @@ static void sql_append_recursive(struct smartpl_result *result, struct result_pa
sql_append(result, part, "', ");
break;
}
result->recursion_level--;
}
/* Creates the parsing result from the AST. Errors are set via result->err. */