re PR fortran/55475 (heap-buffer-overflow in fortran/error.c)

2012-12-03  Tobias Burnus  <burnus@net-b.de>

        PR fortran/55475
        * scanner.c (gfc_next_char_literal): Fix setting locus
        to free_line_length for the error message.
        * error.c (show_locus): Fix potential out-of-bounds
        read.

From-SVN: r194076
This commit is contained in:
Tobias Burnus 2012-12-03 09:56:11 +01:00 committed by Tobias Burnus
parent 29a7d776ea
commit 021aa628c6
3 changed files with 19 additions and 4 deletions

View File

@ -1,4 +1,12 @@
2012-11-03 Tobias Burnus <burnus@net-b.de> 2012-12-03 Tobias Burnus <burnus@net-b.de>
PR fortran/55475
* scanner.c (gfc_next_char_literal): Fix setting locus
to free_line_length for the error message.
* error.c (show_locus): Fix potential out-of-bounds
read.
2012-12-03 Tobias Burnus <burnus@net-b.de>
PR fortran/37336 PR fortran/37336
* class.c (finalizer_insert_packed_call): New static function. * class.c (finalizer_insert_packed_call): New static function.

View File

@ -387,7 +387,7 @@ show_locus (locus *loc, int c1, int c2)
cmax -= offset; cmax -= offset;
p = &(lb->line[offset]); p = &(lb->line[offset]);
for (i = 0; i <= cmax; i++) for (i = 0; i < cmax; i++)
{ {
int spaces, j; int spaces, j;
spaces = gfc_widechar_display_length (*p++); spaces = gfc_widechar_display_length (*p++);
@ -401,6 +401,11 @@ show_locus (locus *loc, int c1, int c2)
error_char (' '); error_char (' ');
} }
if (i == c1)
error_char ('1');
else if (i == c2)
error_char ('2');
error_char ('\n'); error_char ('\n');
} }

View File

@ -1068,10 +1068,12 @@ restart:
&& gfc_current_locus.lb->truncated) && gfc_current_locus.lb->truncated)
{ {
int maxlen = gfc_option.free_line_length; int maxlen = gfc_option.free_line_length;
gfc_char_t *current_nextc = gfc_current_locus.nextc;
gfc_current_locus.lb->truncated = 0; gfc_current_locus.lb->truncated = 0;
gfc_current_locus.nextc += maxlen; gfc_current_locus.nextc = gfc_current_locus.lb->line + maxlen;
gfc_warning_now ("Line truncated at %L", &gfc_current_locus); gfc_warning_now ("Line truncated at %L", &gfc_current_locus);
gfc_current_locus.nextc -= maxlen; gfc_current_locus.nextc = current_nextc;
} }
if (c != '&') if (c != '&')