From: Luuk van Dijk Date: Wed, 2 Nov 2011 21:33:15 +0000 (+0100) Subject: gc: package paths in symbol names: don't escape periods before last slash, always... X-Git-Tag: weekly.2011-11-08~73 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=33f1d47b38f9c48b326642e2005e24ec06176172;p=gostls13.git gc: package paths in symbol names: don't escape periods before last slash, always escape >=0x7f. R=rsc CC=golang-dev https://golang.org/cl/5323071 --- diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index dc1d314638..b8cdd27ad4 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -2911,21 +2911,29 @@ ngotype(Node *n) } /* - * Convert raw string to the prefix that will be used in the symbol table. - * Invalid bytes turn into %xx. Right now the only bytes that need - * escaping are %, ., and ", but we escape all control characters too. + * Convert raw string to the prefix that will be used in the symbol + * table. All control characters, space, '%' and '"', as well as + * non-7-bit clean bytes turn into %xx. The period needs escaping + * only in the last segment of the path, and it makes for happier + * users if we escape that as little as possible. */ static char* pathtoprefix(char *s) { static char hex[] = "0123456789abcdef"; - char *p, *r, *w; + char *p, *r, *w, *l; int n; + // find first character past the last slash, if any. + l = s; + for(r=s; *r; r++) + if(*r == '/') + l = r+1; + // check for chars that need escaping n = 0; for(r=s; *r; r++) - if(*r <= ' ' || *r == '.' || *r == '%' || *r == '"') + if(*r <= ' ' || (*r == '.' && r >= l) || *r == '%' || *r == '"' || *r >= 0x7f) n++; // quick exit @@ -2935,7 +2943,7 @@ pathtoprefix(char *s) // escape p = mal((r-s)+1+2*n); for(r=s, w=p; *r; r++) { - if(*r <= ' ' || *r == '.' || *r == '%' || *r == '"') { + if(*r <= ' ' || (*r == '.' && r >= l) || *r == '%' || *r == '"' || *r >= 0x7f) { *w++ = '%'; *w++ = hex[(*r>>4)&0xF]; *w++ = hex[*r&0xF];