|
Lines 1218-1224
Link Here
|
| 1218 |
return ret; |
1218 |
return ret; |
| 1219 |
} |
1219 |
} |
| 1220 |
|
1220 |
|
| 1221 |
static int nargs(u32 src, char **dst) |
1221 |
static int nargs(u32 src, char **dst, unsigned max) |
| 1222 |
{ |
1222 |
{ |
| 1223 |
int cnt; |
1223 |
int cnt; |
| 1224 |
u32 val; |
1224 |
u32 val; |
|
Lines 1228-1239
Link Here
|
| 1228 |
int ret = get_user(val, (__u32 *)(u64)src); |
1228 |
int ret = get_user(val, (__u32 *)(u64)src); |
| 1229 |
if (ret) |
1229 |
if (ret) |
| 1230 |
return ret; |
1230 |
return ret; |
|
|
1231 |
if (cnt > max) |
| 1232 |
return -E2BIG; |
| 1231 |
if (dst) |
1233 |
if (dst) |
| 1232 |
dst[cnt] = (char *)(u64)val; |
1234 |
dst[cnt] = (char *)(u64)val; |
| 1233 |
cnt++; |
1235 |
cnt++; |
| 1234 |
src += 4; |
1236 |
src += 4; |
| 1235 |
if (cnt >= (MAX_ARG_PAGES*PAGE_SIZE)/sizeof(void*)) |
|
|
| 1236 |
return -E2BIG; |
| 1237 |
} while(val); |
1237 |
} while(val); |
| 1238 |
if (dst) |
1238 |
if (dst) |
| 1239 |
dst[cnt-1] = 0; |
1239 |
dst[cnt-1] = 0; |
|
Lines 1248-1260
Link Here
|
| 1248 |
int ret; |
1248 |
int ret; |
| 1249 |
unsigned sz = 0; |
1249 |
unsigned sz = 0; |
| 1250 |
|
1250 |
|
|
|
1251 |
/* RED-PEN We actually allocate 2 * MAX_ARG_PAGES max */ |
| 1251 |
if (argv) { |
1252 |
if (argv) { |
| 1252 |
na = nargs(argv, NULL); |
1253 |
na = nargs(argv, NULL, (MAX_ARG_PAGES*PAGE_SIZE)/sizeof(void*) - 1); |
| 1253 |
if (na < 0) |
1254 |
if (na < 0) |
| 1254 |
return -EFAULT; |
1255 |
return -EFAULT; |
| 1255 |
} |
1256 |
} |
| 1256 |
if (envp) { |
1257 |
if (envp) { |
| 1257 |
ne = nargs(envp, NULL); |
1258 |
ne = nargs(envp, NULL, (MAX_ARG_PAGES*PAGE_SIZE)/sizeof(void*) - 1); |
| 1258 |
if (ne < 0) |
1259 |
if (ne < 0) |
| 1259 |
return -EFAULT; |
1260 |
return -EFAULT; |
| 1260 |
} |
1261 |
} |
|
Lines 1270-1282
Link Here
|
| 1270 |
} |
1271 |
} |
| 1271 |
|
1272 |
|
| 1272 |
if (argv) { |
1273 |
if (argv) { |
| 1273 |
ret = nargs(argv, buf); |
1274 |
ret = nargs(argv, buf, na); |
| 1274 |
if (ret < 0) |
1275 |
if (ret < 0) |
| 1275 |
goto free; |
1276 |
goto free; |
| 1276 |
} |
1277 |
} |
| 1277 |
|
1278 |
|
| 1278 |
if (envp) { |
1279 |
if (envp) { |
| 1279 |
ret = nargs(envp, buf + na); |
1280 |
ret = nargs(envp, buf + na, ne); |
| 1280 |
if (ret < 0) |
1281 |
if (ret < 0) |
| 1281 |
goto free; |
1282 |
goto free; |
| 1282 |
} |
1283 |
} |