[comboot] Allow for tail recursion of COMBOOT images

Multi-level menus via COMBOOT rely on the COMBOOT program being able
to exit and invoke a new COMBOOT program (the next menu).  This works,
but rapidly (within about five iterations) runs out of space in gPXE's
internal stack, since each new image is executed in a new function
context.

Fix by allowing tail recursion between images; an image can now
specify a replacement image for itself, and image_exec() will perform
the necessary tail recursion.
This commit is contained in:
Michael Brown
2009-02-17 00:47:35 +00:00
parent 349868b8fd
commit 8904cd55f1
8 changed files with 178 additions and 113 deletions

View File

@@ -43,10 +43,8 @@ static int script_exec ( struct image *image ) {
int rc;
/* Temporarily de-register image, so that a "boot" command
* doesn't throw us into an execution loop. Hold a reference
* to avoid the image's being freed.
* doesn't throw us into an execution loop.
*/
image_get ( image );
unregister_image ( image );
while ( offset < image->len ) {
@@ -80,7 +78,6 @@ static int script_exec ( struct image *image ) {
done:
/* Re-register image and return */
register_image ( image );
image_put ( image );
return rc;
}