summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-10-21 03:42:24 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-10-21 03:42:24 +0200
commit2fd35e9bf8077c6a4d2b86d9b456711b18d5f332 (patch)
treed2535fea58effdbdf3dd60e9b83dcd6e0db6b95c /sys
parentb4eb667f02c32f007290b68adc95c8fbd9a2c3cd (diff)
kbdfs: don't get confused by broken utf8
Diffstat (limited to 'sys')
-rw-r--r--sys/src/cmd/aux/kbdfs/kbdfs.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/sys/src/cmd/aux/kbdfs/kbdfs.c b/sys/src/cmd/aux/kbdfs/kbdfs.c
index b68e52250..6adbece2c 100644
--- a/sys/src/cmd/aux/kbdfs/kbdfs.c
+++ b/sys/src/cmd/aux/kbdfs/kbdfs.c
@@ -625,23 +625,29 @@ consproc(void *)
p = buf;
e = buf + sizeof(buf);
while((n = read(consfd, p, e - p)) > 0){
- x = buf + n;
- while(p < x && fullrune(p, x - p)){
+ x = p + n;
+ p = buf;
+ while((n = x - p) > 0){
+ if(!fullrune(p, n)){
+ memmove(buf, p, n);
+ break;
+ }
p += chartorune(&r, p);
- if(r){
- if(r == 021 || r == 023) /* XON/XOFF */
- continue;
- if(r == '\n' && cr){
- cr = 0;
- continue;
- }
- if(cr = (r == '\r'))
- r = '\n';
- send(runechan, &r);
+ if(r == 021 || r == 023) /* XON/XOFF */
+ continue;
+ if(r == 0 || r == Runeerror){
+ cr = 0;
+ continue;
}
+ if(r == '\n' && cr){
+ cr = 0;
+ continue;
+ }
+ if(cr = (r == '\r'))
+ r = '\n';
+ send(runechan, &r);
}
- n = x - p;
- memmove(buf, p, n);
+ if(n < 0) n = 0;
p = buf + n;
}