diff --git a/sys/src/9/port/lib.h b/sys/src/9/port/lib.h index f991285ce..1f7bf7d1d 100644 --- a/sys/src/9/port/lib.h +++ b/sys/src/9/port/lib.h @@ -47,6 +47,7 @@ enum */ extern int runetochar(char*, Rune*); extern int chartorune(Rune*, char*); +extern char* utfecpy(char *s1, char *es1, char *s2); extern char* utfrune(char*, long); extern int utflen(char*); extern int utfnlen(char*, long); diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index 5361429c4..7625b946c 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -572,6 +572,9 @@ sysexec(va_list list) procsetup(up); qunlock(&up->debug); + up->errbuf0[0] = '\0'; + up->errbuf1[0] = '\0'; + /* * At this point, the mmu contains info about the old address * space and needs to be flushed @@ -698,20 +701,21 @@ werrstr(char *fmt, ...) static int generrstr(char *buf, uint nbuf) { - char tmp[ERRMAX]; + char *err; if(nbuf == 0) error(Ebadarg); + if(nbuf > ERRMAX) + nbuf = ERRMAX; validaddr((uintptr)buf, nbuf, 1); - if(nbuf > sizeof tmp) - nbuf = sizeof tmp; - memmove(tmp, buf, nbuf); - /* make sure it's NUL-terminated */ - tmp[nbuf-1] = '\0'; - memmove(buf, up->syserrstr, nbuf); - buf[nbuf-1] = '\0'; - memmove(up->syserrstr, tmp, nbuf); + err = up->errstr; + utfecpy(err, err+nbuf, buf); + utfecpy(buf, buf+nbuf, up->syserrstr); + + up->errstr = up->syserrstr; + up->syserrstr = err; + return 0; }