comparison debug.c @ 2186:935e684f2d58

Fix crash bug in expression parser
author Michael Pavone <pavone@retrodev.com>
date Sun, 14 Aug 2022 09:55:06 -0700
parents 3d2cc2af1da3
children d0129f19ca52
comparison
equal deleted inserted replaced
2185:3d2cc2af1da3 2186:935e684f2d58
182 break; 182 break;
183 } 183 }
184 if (done) { 184 if (done) {
185 break; 185 break;
186 } 186 }
187 187
188 ++*end; 188 ++*end;
189 } 189 }
190 char *name = malloc(*end - start + 1); 190 char *name = malloc(*end - start + 1);
191 memcpy(name, start, *end - start); 191 memcpy(name, start, *end - start);
192 name[*end-start] = 0; 192 name[*end-start] = 0;
553 case '/': 553 case '/':
554 case '&': 554 case '&':
555 case '|': 555 case '|':
556 case '^': 556 case '^':
557 bin->right = parse_scalar(after_second, end); 557 bin->right = parse_scalar(after_second, end);
558 if (!bin->right) {
559 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
560 free_expr(bin);
561 return NULL;
562 }
558 return maybe_binary(bin, *end, end); 563 return maybe_binary(bin, *end, end);
559 case '+': 564 case '+':
560 case '-': 565 case '-':
561 bin->right = parse_scalar_or_muldiv(after_second, end); 566 bin->right = parse_scalar_or_muldiv(after_second, end);
567 if (!bin->right) {
568 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
569 free_expr(bin);
570 return NULL;
571 }
562 return maybe_binary(bin, *end, end); 572 return maybe_binary(bin, *end, end);
563 case '=': 573 case '=':
564 case '!': 574 case '!':
565 bin->right = parse_expression(after_second, end); 575 bin->right = parse_expression(after_second, end);
576 if (!bin->right) {
577 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
578 free_expr(bin);
579 return NULL;
580 }
566 return bin; 581 return bin;
567 default: 582 default:
568 fprintf(stderr, "%s is not a valid binary operator\n", second.v.op); 583 fprintf(stderr, "%s is not a valid binary operator\n", second.v.op);
569 free(bin->left); 584 free(bin->left);
570 free(bin); 585 free(bin);
944 out->args = args; 959 out->args = args;
945 out->num_args = num_args; 960 out->num_args = num_args;
946 } 961 }
947 out->def = def; 962 out->def = def;
948 out->format = format; 963 out->format = format;
949 964
950 ret = 1; 965 ret = 1;
951 cleanup_args: 966 cleanup_args:
952 if (!ret) { 967 if (!ret) {
953 for (int i = 0; i < num_args; i++) 968 for (int i = 0; i < num_args; i++)
954 { 969 {
1586 { 1601 {
1587 ++param; 1602 ++param;
1588 } 1603 }
1589 m68k_context *m68k = root->cpu_context; 1604 m68k_context *m68k = root->cpu_context;
1590 segacd_context *cd = m68k->system; 1605 segacd_context *cd = m68k->system;
1591 1606
1592 if (param && *param && !isspace(*param)) { 1607 if (param && *param && !isspace(*param)) {
1593 parsed_command cmd; 1608 parsed_command cmd;
1594 debug_root *main_root = find_m68k_root(cd->genesis->m68k); 1609 debug_root *main_root = find_m68k_root(cd->genesis->m68k);
1595 if (!main_root) { 1610 if (!main_root) {
1596 fputs("Failed to get debug root for Main CPU\n", stderr); 1611 fputs("Failed to get debug root for Main CPU\n", stderr);
1614 { 1629 {
1615 ++param; 1630 ++param;
1616 } 1631 }
1617 m68k_context *m68k = root->cpu_context; 1632 m68k_context *m68k = root->cpu_context;
1618 genesis_context *gen = m68k->system; 1633 genesis_context *gen = m68k->system;
1619 1634
1620 if (param && *param && !isspace(*param)) { 1635 if (param && *param && !isspace(*param)) {
1621 parsed_command cmd; 1636 parsed_command cmd;
1622 debug_root *z80_root = find_z80_root(gen->z80); 1637 debug_root *z80_root = find_z80_root(gen->z80);
1623 if (!z80_root) { 1638 if (!z80_root) {
1624 fputs("Failed to get debug root for Z80\n", stderr); 1639 fputs("Failed to get debug root for Z80\n", stderr);
2083 while (param && *param && isblank(*param)) 2098 while (param && *param && isblank(*param))
2084 { 2099 {
2085 ++param; 2100 ++param;
2086 } 2101 }
2087 genesis_context *gen = (genesis_context *)current_system; 2102 genesis_context *gen = (genesis_context *)current_system;
2088 2103
2089 if (param && *param && !isspace(*param)) { 2104 if (param && *param && !isspace(*param)) {
2090 parsed_command cmd; 2105 parsed_command cmd;
2091 debug_root *m68k_root = find_m68k_root(gen->m68k); 2106 debug_root *m68k_root = find_m68k_root(gen->m68k);
2092 if (!m68k_root) { 2107 if (!m68k_root) {
2093 fputs("Failed to get debug root for M68K\n", stderr); 2108 fputs("Failed to get debug root for M68K\n", stderr);