diff options
| author | manuel <manuel@mausz.at> | 2012-06-21 22:36:03 +0200 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2012-06-21 22:36:03 +0200 |
| commit | 2f00636b80c713be718a7656ce82947fb8f3ecf1 (patch) | |
| tree | ec5b52f8f787b4085dced54587f77e61d18d38e9 | |
| parent | 903f34c091cc176fc8909ed206e4d548b6b723d1 (diff) | |
| download | progos-2f00636b80c713be718a7656ce82947fb8f3ecf1.tar.gz progos-2f00636b80c713be718a7656ce82947fb8f3ecf1.tar.bz2 progos-2f00636b80c713be718a7656ce82947fb8f3ecf1.zip | |
fix stack setup
check if name+arguments fits into one page before copying
| -rw-r--r-- | userprog/process.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/userprog/process.c b/userprog/process.c index bf1a706..741503b 100644 --- a/userprog/process.c +++ b/userprog/process.c | |||
| @@ -614,11 +614,17 @@ setup_stack (uint32_t **esp, const char *args) | |||
| 614 | stack_end = PHYS_BASE - PGSIZE; | 614 | stack_end = PHYS_BASE - PGSIZE; |
| 615 | stack_end += 4 + 1; | 615 | stack_end += 4 + 1; |
| 616 | 616 | ||
| 617 | /* copy arguments to stack */ | 617 | /* check if arguments fits into our stack */ |
| 618 | argslen = strlen(args); | 618 | argslen = strlen(args); |
| 619 | if (argslen > 0) | 619 | if (argslen > 0) |
| 620 | argslen += 1; /* add the trailing \0 */ | ||
| 621 | namelen = strlen(name) + 1; | ||
| 622 | if (*esp - argslen - namelen <= stack_end) | ||
| 623 | return false; | ||
| 624 | |||
| 625 | /* copy arguments to stack */ | ||
| 626 | if (argslen > 0) | ||
| 620 | { | 627 | { |
| 621 | argslen += 1; /* add the trailing \0 */ | ||
| 622 | *(char **) esp -= argslen; | 628 | *(char **) esp -= argslen; |
| 623 | memcpy(*esp, args, argslen); | 629 | memcpy(*esp, args, argslen); |
| 624 | } | 630 | } |
| @@ -628,7 +634,7 @@ setup_stack (uint32_t **esp, const char *args) | |||
| 628 | *(char **) esp -= namelen; | 634 | *(char **) esp -= namelen; |
| 629 | memcpy(*esp, name, namelen); | 635 | memcpy(*esp, name, namelen); |
| 630 | 636 | ||
| 631 | /* align our currend address by word-size (thanks to thomas & edy) */ | 637 | /* align our current address by word-size */ |
| 632 | *(char **) esp -= (sizeof(uint32_t) - (PHYS_BASE - *(void **) esp) % sizeof(uint32_t)); | 638 | *(char **) esp -= (sizeof(uint32_t) - (PHYS_BASE - *(void **) esp) % sizeof(uint32_t)); |
| 633 | 639 | ||
| 634 | /* terminate argv[] array by NULL ptr */ | 640 | /* terminate argv[] array by NULL ptr */ |
