|
Lines 94-100
Link Here
|
| 94 |
static DECLARE_MUTEX(ia32_mmap_sem); |
94 |
static DECLARE_MUTEX(ia32_mmap_sem); |
| 95 |
|
95 |
|
| 96 |
static int |
96 |
static int |
| 97 |
nargs (unsigned int arg, char **ap) |
97 |
nargs (unsigned int arg, char **ap, int max) |
| 98 |
{ |
98 |
{ |
| 99 |
unsigned int addr; |
99 |
unsigned int addr; |
| 100 |
int n, err; |
100 |
int n, err; |
|
Lines 107-112
Link Here
|
| 107 |
err = get_user(addr, (unsigned int *)A(arg)); |
107 |
err = get_user(addr, (unsigned int *)A(arg)); |
| 108 |
if (err) |
108 |
if (err) |
| 109 |
return err; |
109 |
return err; |
|
|
110 |
if (n > max) |
| 111 |
return -E2BIG; |
| 110 |
if (ap) |
112 |
if (ap) |
| 111 |
*ap++ = (char *) A(addr); |
113 |
*ap++ = (char *) A(addr); |
| 112 |
arg += sizeof(unsigned int); |
114 |
arg += sizeof(unsigned int); |
|
Lines 128-137
Link Here
|
| 128 |
int na, ne, len; |
130 |
int na, ne, len; |
| 129 |
long r; |
131 |
long r; |
| 130 |
|
132 |
|
| 131 |
na = nargs(argv, NULL); |
133 |
/* Allocates upto 2x MAX_ARG_PAGES */ |
|
|
134 |
na = nargs(argv, NULL, (MAX_ARG_PAGES*PAGE_SIZE) / sizeof(char *) - 1); |
| 132 |
if (na < 0) |
135 |
if (na < 0) |
| 133 |
return na; |
136 |
return na; |
| 134 |
ne = nargs(envp, NULL); |
137 |
ne = nargs(envp, NULL, (MAX_ARG_PAGES*PAGE_SIZE) / sizeof(char *) - 1 ); |
| 135 |
if (ne < 0) |
138 |
if (ne < 0) |
| 136 |
return ne; |
139 |
return ne; |
| 137 |
len = (na + ne + 2) * sizeof(*av); |
140 |
len = (na + ne + 2) * sizeof(*av); |
|
Lines 143-152
Link Here
|
| 143 |
av[na] = NULL; |
146 |
av[na] = NULL; |
| 144 |
ae[ne] = NULL; |
147 |
ae[ne] = NULL; |
| 145 |
|
148 |
|
| 146 |
r = nargs(argv, av); |
149 |
r = nargs(argv, av, na); |
| 147 |
if (r < 0) |
150 |
if (r < 0) |
| 148 |
goto out; |
151 |
goto out; |
| 149 |
r = nargs(envp, ae); |
152 |
r = nargs(envp, ae, ne); |
| 150 |
if (r < 0) |
153 |
if (r < 0) |
| 151 |
goto out; |
154 |
goto out; |
| 152 |
|
155 |
|