Update stack initialization to handle overflow by allocating a second page for argument pointers
This commit is contained in:
@@ -88,6 +88,8 @@ process_execute (const char *cmd)
|
||||
return tid;
|
||||
}
|
||||
|
||||
|
||||
static bool install_page (void *upage, void *kpage, bool writable);
|
||||
static bool process_init_stack (char *cmd_saveptr, void **esp, char *file_name);
|
||||
static void *push_to_stack (void **esp, void *data, size_t data_size);
|
||||
#define push_var_to_stack(esp, var) (push_to_stack (esp, &var, sizeof (var)))
|
||||
@@ -186,10 +188,13 @@ process_init_stack (char *cmd_saveptr, void **esp, char *file_name)
|
||||
+ return_addr_size;
|
||||
|
||||
/* If pushing the rest of the data required for the stack would cause
|
||||
overflow, allocate an extra page. */
|
||||
overflow, allocate an extra page that is contiguous within the
|
||||
virtual address space (below the current address range). */
|
||||
if (PHYS_BASE - *esp + remaining_size > PGSIZE)
|
||||
{
|
||||
/* TODO: Allocate an extra page for the rest of the process stack. */
|
||||
uint8_t *kpage = palloc_get_page (PAL_USER | PAL_ZERO);
|
||||
if (!install_page (((uint8_t *) PHYS_BASE) - PGSIZE * 2, kpage, true))
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Align stack pointer to word size before pushing argv elements for
|
||||
@@ -485,8 +490,6 @@ load (const char *file_name, void (**eip) (void), void **esp)
|
||||
|
||||
/* load() helpers. */
|
||||
|
||||
static bool install_page (void *upage, void *kpage, bool writable);
|
||||
|
||||
/* Checks whether PHDR describes a valid, loadable segment in
|
||||
FILE and returns true if so, false otherwise. */
|
||||
static bool
|
||||
|
||||
Reference in New Issue
Block a user