summaryrefslogtreecommitdiffstats
path: root/src/image/script.c
diff options
context:
space:
mode:
authorMichael Brown2009-02-17 01:47:35 +0100
committerMichael Brown2009-02-17 01:47:35 +0100
commit8904cd55f128941d53d9a8beef71fb32a920a92d (patch)
treea2ce11209520f09931d23ccae2682297ada99288 /src/image/script.c
parent[uri] Allow use of relative URIs when calling churi() (diff)
downloadipxe-8904cd55f128941d53d9a8beef71fb32a920a92d.tar.gz
ipxe-8904cd55f128941d53d9a8beef71fb32a920a92d.tar.xz
ipxe-8904cd55f128941d53d9a8beef71fb32a920a92d.zip
[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.
Diffstat (limited to 'src/image/script.c')
-rw-r--r--src/image/script.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/src/image/script.c b/src/image/script.c
index fe722885..2d242746 100644
--- a/src/image/script.c
+++ b/src/image/script.c
@@ -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;
}