summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/oplist.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/oplist.c b/src/oplist.c
index 4dd0df5..420cbd6 100644
--- a/src/oplist.c
+++ b/src/oplist.c
@@ -480,6 +480,7 @@ struct _parse_ctx {
480 const char *pos; 480 const char *pos;
481 const char *end; 481 const char *end;
482 int err; 482 int err;
483 uint32_t depth;
483}; 484};
484typedef struct _parse_ctx* parse_ctx; 485typedef struct _parse_ctx* parse_ctx;
485 486
@@ -597,6 +598,12 @@ static int node_from_openstep(parse_ctx ctx, plist_t *plist)
597{ 598{
598 plist_t subnode = NULL; 599 plist_t subnode = NULL;
599 const char *p = NULL; 600 const char *p = NULL;
601 ctx->depth++;
602 if (ctx->depth > 1000) {
603 PLIST_OSTEP_ERR("Too many levels of recursion (%u) at offset %ld\n", ctx->depth, ctx->pos - ctx->start);
604 ctx->err++;
605 return PLIST_ERR_PARSE;
606 }
600 while (ctx->pos < ctx->end && !ctx->err) { 607 while (ctx->pos < ctx->end && !ctx->err) {
601 parse_skip_ws(ctx); 608 parse_skip_ws(ctx);
602 if (ctx->pos >= ctx->end) { 609 if (ctx->pos >= ctx->end) {
@@ -867,6 +874,7 @@ static int node_from_openstep(parse_ctx ctx, plist_t *plist)
867 } 874 }
868 ctx->pos++; 875 ctx->pos++;
869 } 876 }
877 ctx->depth--;
870 878
871err_out: 879err_out:
872 if (ctx->err) { 880 if (ctx->err) {
@@ -888,7 +896,7 @@ PLIST_API int plist_from_openstep(const char *plist_ostep, uint32_t length, plis
888 return PLIST_ERR_INVALID_ARG; 896 return PLIST_ERR_INVALID_ARG;
889 } 897 }
890 898
891 struct _parse_ctx ctx = { plist_ostep, plist_ostep, plist_ostep + length, 0 }; 899 struct _parse_ctx ctx = { plist_ostep, plist_ostep, plist_ostep + length, 0 , 0 };
892 900
893 int err = node_from_openstep(&ctx, plist); 901 int err = node_from_openstep(&ctx, plist);
894 if (err == 0) { 902 if (err == 0) {