hexedit: fixes for redraw and down movement causing SEGV on attempt to access
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 23 Jul 2018 12:21:07 +0000 (14:21 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 30 Jul 2018 16:02:27 +0000 (18:02 +0200)
"Go to:" command was not updating row position, making next "down" movements
for one screenful print empty lines instead of showing the contents.

If the file is whole pages long, "down" movement at EOF was advancing position
+16 bytes, mapping the next portion (entirely past the end of the file),
then finding out that the new position is beyond the EOF, rolling it back
-16 bytes... ending up with this postion pointing *before* the mapped portion.
Any next access (e.g. "move right" key) SEGVs.

function                                             old     new   delta
hexedit_main                                        1170    1184     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/hexedit.c

index 95c930d123485e214063a0366101f3b1ec29c995..298eb814914ac9b99c25ddd23a929ac44dbe6263 100644 (file)
@@ -153,7 +153,8 @@ static void redraw(unsigned cursor)
                i++;
        }
 
-       printf(ESC"[%u;%uH", 1 + cursor / 16, 1 + pos + (cursor & 0xf) * 3);
+       G.row = cursor / 16;
+       printf(ESC"[%u;%uH", 1 + G.row, 1 + pos + (cursor & 0xf) * 3);
 }
 
 static void redraw_cur_line(void)
@@ -367,6 +368,8 @@ int hexedit_main(int argc UNUSED_PARAM, char **argv)
                                if (G.current_byte > G.eof_byte) {
                                        /* _after_ eof - don't allow this */
                                        G.current_byte -= 16;
+                                       if (G.current_byte < G.baseaddr)
+                                               move_mapping_lower();
                                        break;
                                }
                        }