|
Lines 2200-2206
asmlinkage long sys32_ustat(dev_t dev, s
Link Here
|
| 2200 |
return ret; |
2200 |
return ret; |
| 2201 |
} |
2201 |
} |
| 2202 |
|
2202 |
|
| 2203 |
static int nargs(u32 src, char **dst) |
2203 |
static int nargs(u32 src, char **dst, int max) |
| 2204 |
{ |
2204 |
{ |
| 2205 |
int cnt; |
2205 |
int cnt; |
| 2206 |
u32 val; |
2206 |
u32 val; |
|
Lines 2210-2222
static int nargs(u32 src, char **dst)
Link Here
|
| 2210 |
int ret = get_user(val, (__u32 *)(u64)src); |
2210 |
int ret = get_user(val, (__u32 *)(u64)src); |
| 2211 |
if (ret) |
2211 |
if (ret) |
| 2212 |
return ret; |
2212 |
return ret; |
|
|
2213 |
if (cnt > max) |
| 2214 |
return -E2BIG; |
| 2213 |
if (dst) |
2215 |
if (dst) |
| 2214 |
dst[cnt] = (char *)(u64)val; |
2216 |
dst[cnt] = (char *)(u64)val; |
| 2215 |
cnt++; |
2217 |
cnt++; |
| 2216 |
src += 4; |
2218 |
src += 4; |
| 2217 |
if (cnt >= (MAX_ARG_PAGES * PAGE_SIZE) / sizeof(char *)) |
2219 |
} while(val); |
| 2218 |
return -E2BIG; |
|
|
| 2219 |
} while(val); |
| 2220 |
if (dst) |
2220 |
if (dst) |
| 2221 |
dst[cnt-1] = 0; |
2221 |
dst[cnt-1] = 0; |
| 2222 |
return cnt; |
2222 |
return cnt; |
|
Lines 2230-2242
asmlinkage long sys32_execve(char *name,
Link Here
|
| 2230 |
int ret; |
2230 |
int ret; |
| 2231 |
unsigned sz = 0; |
2231 |
unsigned sz = 0; |
| 2232 |
|
2232 |
|
|
|
2233 |
/* Can actually allocate 2*MAX_ARG_PAGES */ |
| 2233 |
if (argv) { |
2234 |
if (argv) { |
| 2234 |
na = nargs(argv, NULL); |
2235 |
na = nargs(argv, NULL, (MAX_ARG_PAGES * PAGE_SIZE)/sizeof(char*) - 1); |
| 2235 |
if (na < 0) |
2236 |
if (na < 0) |
| 2236 |
return -EFAULT; |
2237 |
return -EFAULT; |
| 2237 |
} |
2238 |
} |
| 2238 |
if (envp) { |
2239 |
if (envp) { |
| 2239 |
ne = nargs(envp, NULL); |
2240 |
ne = nargs(envp, NULL, (MAX_ARG_PAGES * PAGE_SIZE)/sizeof(char*) - 1); |
| 2240 |
if (ne < 0) |
2241 |
if (ne < 0) |
| 2241 |
return -EFAULT; |
2242 |
return -EFAULT; |
| 2242 |
} |
2243 |
} |
|
Lines 2252-2264
asmlinkage long sys32_execve(char *name,
Link Here
|
| 2252 |
} |
2253 |
} |
| 2253 |
|
2254 |
|
| 2254 |
if (argv) { |
2255 |
if (argv) { |
| 2255 |
ret = nargs(argv, buf); |
2256 |
ret = nargs(argv, buf, na); |
| 2256 |
if (ret < 0) |
2257 |
if (ret < 0) |
| 2257 |
goto free; |
2258 |
goto free; |
| 2258 |
} |
2259 |
} |
| 2259 |
|
2260 |
|
| 2260 |
if (envp) { |
2261 |
if (envp) { |
| 2261 |
ret = nargs(envp, buf + na); |
2262 |
ret = nargs(envp, buf + na, ne); |
| 2262 |
if (ret < 0) |
2263 |
if (ret < 0) |
| 2263 |
goto free; |
2264 |
goto free; |
| 2264 |
} |
2265 |
} |