diff options
author | Sagar Ghuge <[email protected]> | 2018-09-06 12:37:28 -0700 |
---|---|---|
committer | Lionel Landwerlin <[email protected]> | 2018-10-04 10:01:56 +0100 |
commit | f9c8468c824dd9ceb804b6c9e177b738f8340a26 (patch) | |
tree | b1fa5a15b77544e8d4a837f38324ed13690fdd0d /src/intel | |
parent | ba3304e7641e5e91b44b14131b4714d0a18c6d58 (diff) |
intel/decoder: Avoid freeing invalid pointer
v2: Free ctx.spec if error while reading genxml (Lionel Landwerlin)
v3: Handle case where genxml is empty (Lionel Landwerlin)
Signed-off-by: Sagar Ghuge <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/common/gen_decoder.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index d4db8b89cc3..38a5fccb2ab 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -654,25 +654,27 @@ gen_spec_load_from_path(const struct gen_device_info *devinfo, ctx.spec = gen_spec_init(); if (ctx.spec == NULL) { fprintf(stderr, "Failed to create gen_spec\n"); - return NULL; + goto end; } do { buf = XML_GetBuffer(ctx.parser, XML_BUFFER_SIZE); len = fread(buf, 1, XML_BUFFER_SIZE, input); - if (len == 0) { + if (ferror(input)) { fprintf(stderr, "fread: %m\n"); - free(ctx.spec); + gen_spec_destroy(ctx.spec); ctx.spec = NULL; goto end; - } + } else if (feof(input)) + goto end; + if (XML_ParseBuffer(ctx.parser, len, len == 0) == 0) { fprintf(stderr, "Error parsing XML at line %ld col %ld: %s\n", XML_GetCurrentLineNumber(ctx.parser), XML_GetCurrentColumnNumber(ctx.parser), XML_ErrorString(XML_GetErrorCode(ctx.parser))); - free(ctx.spec); + gen_spec_destroy(ctx.spec); ctx.spec = NULL; goto end; } @@ -684,6 +686,12 @@ gen_spec_load_from_path(const struct gen_device_info *devinfo, fclose(input); free(filename); + /* free ctx.spec if genxml is empty */ + if (ctx.spec && _mesa_hash_table_num_entries(ctx.spec->commands) == 0) { + gen_spec_destroy(ctx.spec); + return NULL; + } + return ctx.spec; } |