Bugfix: Properly terminate lines not ending with a newline (Thanks xeen)

Previously, we didn’t check for a newline and thus could be corrupting
formerly valid UTF-8 input, such as
    echo -n '↓'

Fixes: #671
This commit is contained in:
Michael Stapelberg 2012-04-07 19:15:41 +02:00
parent 250577da36
commit 24ac6e32aa
1 changed files with 4 additions and 2 deletions

View File

@ -153,7 +153,7 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
int n = 0; int n = 0;
int rec = 0; int rec = 0;
int buffer_len = STDIN_CHUNK_SIZE; int buffer_len = STDIN_CHUNK_SIZE;
unsigned char *buffer = smalloc(buffer_len); unsigned char *buffer = smalloc(buffer_len+1);
buffer[0] = '\0'; buffer[0] = '\0';
while(1) { while(1) {
n = read(fd, buffer + rec, buffer_len - rec); n = read(fd, buffer + rec, buffer_len - rec);
@ -217,7 +217,9 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
FREE(first->full_text); FREE(first->full_text);
/* Remove the trailing newline and terminate the string at the same /* Remove the trailing newline and terminate the string at the same
* time. */ * time. */
buffer[rec-1] = '\0'; if (buffer[rec-1] == '\n' || buffer[rec-1] == '\r')
buffer[rec-1] = '\0';
else buffer[rec] = '\0';
first->full_text = (char*)buffer; first->full_text = (char*)buffer;
} }
draw_bars(); draw_bars();