From dc208c6ad339e9606d1b61eacace8a159841fa43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 31 May 2018 02:16:12 +0200 Subject: [PATCH] fix bug in parser --- gds-parser/gds-parser.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/gds-parser/gds-parser.c b/gds-parser/gds-parser.c index b549a91..c5a72ae 100644 --- a/gds-parser/gds-parser.c +++ b/gds-parser/gds-parser.c @@ -387,7 +387,7 @@ void gds_parse_date(const char *buffer, int length, struct gds_time_field *mod_d int parse_gds_from_file(const char *filename, GList **library_list) { - char workbuff[1024]; + char *workbuff; int read; int i; int run = 1; @@ -404,6 +404,12 @@ int parse_gds_from_file(const char *filename, GList **library_list) lib_list = *library_list; + /* Allocate working buffer */ + workbuff = (char *)malloc(sizeof(char)*128*1024); + + if(!workbuff) + return -100; + /* open File */ gds_file = fopen(filename, "r"); if (gds_file == NULL) { @@ -428,8 +434,7 @@ int parse_gds_from_file(const char *filename, GList **library_list) break; } - rec_data_length = (uint16_t)((((uint16_t)(workbuff[0])) << 8) | - (uint16_t)(workbuff[1])); + rec_data_length = gds_convert_unsigend_int16(workbuff); if (rec_data_length < 4) { /* Possible Zero-Padding: */ @@ -452,8 +457,7 @@ int parse_gds_from_file(const char *filename, GList **library_list) GDS_ERROR("Unexpected end of file"); break; } - rec_type = (uint16_t)((((uint16_t)(workbuff[0])) << 8) | - (uint16_t)(workbuff[1])); + rec_type = gds_convert_unsigend_int16(workbuff); /* if begin: Allocate structures */ switch (rec_type) { @@ -595,7 +599,8 @@ int parse_gds_from_file(const char *filename, GList **library_list) read = fread(workbuff, sizeof(char), rec_data_length, gds_file); if (read != rec_data_length) { - GDS_ERROR("Could not read enough data"); + GDS_ERROR("Could not read enough data: requested: %u, read: %u | Type: %04x\n", + (unsigned int)rec_data_length, (unsigned int)read, (unsigned int)rec_type); run = -5; break; } @@ -696,10 +701,15 @@ int parse_gds_from_file(const char *filename, GList **library_list) fclose(gds_file); - /* Iterate and find references to cells */ - g_list_foreach(lib_list, scan_library_references, NULL); + if (!run) { + /* Iterate and find references to cells */ + g_list_foreach(lib_list, scan_library_references, NULL); + } *library_list = lib_list; + + free(workbuff); + return run; }