]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/9sys/getenv.c
libc: check name in getvent()/putenv()
[plan9front.git] / sys / src / libc / 9sys / getenv.c
1 #include <u.h>
2 #include <libc.h>
3
4 char*
5 getenv(char *name)
6 {
7         enum { HUNK = 100, };
8         char *s, *p;
9         int f, r, n;
10
11         if(name[0]=='\0' || strcmp(name, ".")==0 || strcmp(name, "..")==0 || strchr(name, '/')!=nil
12         || strlen(name) >= HUNK-5){
13                 werrstr("bad env name: %s", name);
14                 return nil;
15         }
16         if((s = malloc(HUNK)) == nil)
17                 return nil;
18         snprint(s, HUNK, "/env/%s", name);
19         n = 0;
20         r = -1;
21         if((f = open(s, OREAD)) >= 0){
22                 while((r = read(f, s+n, HUNK)) > 0){
23                         n += r;
24                         r = -1;
25                         if((p = realloc(s, n+HUNK)) == nil)
26                                 break;
27                         s = p;
28                 }
29                 close(f);
30         }
31         if(r < 0 || (p = realloc(s, n+1)) == nil){
32                 free(s);
33                 return nil;
34         }
35         s = p;
36         setmalloctag(s, getcallerpc(&name));
37         while(n > 0 && s[n-1] == '\0')
38                 n--;
39         s[n] = '\0';
40         while(--n >= 0){
41                 if(s[n] == '\0')
42                         s[n] = ' ';
43         }
44         return s;
45 }