GF_List *identifiers;
char *new_line;
u32 indent;
+ u32 expr_stack_size;
} ScriptParser;
e = GF_OK;
if (gf_node_get_tag(n) != TAG_MPEG4_Script) return GF_NON_COMPLIANT_BITSTREAM;
+ memset(&parser, 0, sizeof(ScriptParser));
parser.codec = codec;
parser.script = n;
parser.bs = bs;
SFS_Space(&parser);
SFS_StatementBlock(&parser, GF_TRUE);
SFS_Line(&parser);
+ if (codec->LastError) {
+ e = codec->LastError;
+ goto exit;
+ }
}
SFS_Line(&parser);
if (parser->codec->LastError) return;
SFS_Expression(parser);
if (! gf_bs_read_int(parser->bs, 1)) return;
+ if (parser->codec->LastError) return;
SFS_AddString(parser, ",");
SFS_CompoundExpression(parser);
}
}
}
-
+#define MAX_EXPR_STACK 500
void SFS_Expression(ScriptParser *parser)
{
u32 val = gf_bs_read_int(parser->bs, NUMBITS_EXPR_TYPE);
if (parser->codec->LastError) return;
+ //limit max expression stack size
+ parser->expr_stack_size++;
+ if (parser->expr_stack_size>MAX_EXPR_STACK) {
+ GF_LOG(GF_LOG_ERROR, GF_LOG_CODEC, ("[BIFS] Max stack size %d reached for expressions, not supported\n", MAX_EXPR_STACK))
+ parser->codec->LastError = GF_NON_COMPLIANT_BITSTREAM;
+ return;
+ }
+
switch(val) {
case ET_CURVED_EXPR:
SFS_AddString(parser, "(");
assert(0);
break;
}
+ parser->expr_stack_size--;
}
void SFS_NewObject(ScriptParser *parser)
{
if (parser->codec->LastError) return;
SFS_Expression(parser);
+ if (parser->codec->LastError) return;
SFS_AddString(parser, "[");
SFS_CompoundExpression(parser);
SFS_AddString(parser, "]");
{
if (parser->codec->LastError) return;
SFS_Expression(parser);
+ if (parser->codec->LastError) return;
SFS_AddString(parser, ".");
SFS_Identifier(parser);
}
{
if (parser->codec->LastError) return;
SFS_Expression(parser);
+ if (parser->codec->LastError) return;
SFS_AddString(parser, ".");
SFS_Identifier(parser);
SFS_AddString(parser, "(");
val = gf_bs_read_int(parser->bs, 1);
while (val) {
SFS_Expression(parser);
+ if (parser->codec->LastError) return;
val = gf_bs_read_int(parser->bs, 1);
if(val) SFS_AddString(parser, ",");
}