mirror of
https://github.com/yudai/gotty.git
synced 2026-02-15 04:38:06 +01:00
Replace UTF8 bounds check with utf8reader
This commit is contained in:
parent
d0f2128996
commit
87f8409068
5 changed files with 209 additions and 29 deletions
34
app/app.go
34
app/app.go
|
|
@ -7,12 +7,12 @@ import (
|
|||
"os/exec"
|
||||
"strings"
|
||||
"syscall"
|
||||
"unicode/utf8"
|
||||
"unsafe"
|
||||
|
||||
"github.com/elazarl/go-bindata-assetfs"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/kr/pty"
|
||||
"github.com/yudai/utf8reader"
|
||||
)
|
||||
|
||||
type App struct {
|
||||
|
|
@ -83,11 +83,10 @@ func (app *App) generateHandler() func(w http.ResponseWriter, r *http.Request) {
|
|||
defer func() { exit <- true }()
|
||||
|
||||
buf := make([]byte, 1024)
|
||||
leftOver := 0
|
||||
for {
|
||||
size, err := fio.Read(buf[leftOver:])
|
||||
size += leftOver
|
||||
utf8f := utf8reader.New(fio)
|
||||
|
||||
for {
|
||||
size, err := utf8f.Read(buf)
|
||||
if err != nil {
|
||||
log.Printf("command exited for: %s", r.RemoteAddr)
|
||||
return
|
||||
|
|
@ -98,31 +97,8 @@ func (app *App) generateHandler() func(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
// UTF-8 Boundary check
|
||||
for leftOver = 0; leftOver < utf8.UTFMax; leftOver++ {
|
||||
re, _ := utf8.DecodeLastRune(
|
||||
buf[:size-leftOver],
|
||||
)
|
||||
|
||||
if re != utf8.RuneError {
|
||||
break
|
||||
}
|
||||
// Invalid UTF rune
|
||||
}
|
||||
|
||||
if leftOver == utf8.UTFMax-1 {
|
||||
re, _ := utf8.DecodeLastRune(buf[:size-leftOver])
|
||||
if re == utf8.RuneError {
|
||||
log.Fatal("UTF8 Boundary error.")
|
||||
}
|
||||
}
|
||||
|
||||
writer.Write(buf[:size-leftOver])
|
||||
writer.Write(buf[:size])
|
||||
writer.Close()
|
||||
|
||||
for i := 0; i < leftOver; i++ {
|
||||
buf[i] = buf[size-leftOver+i]
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue