diff options
author | Michael Brown | 2007-06-09 20:00:34 +0200 |
---|---|---|
committer | Michael Brown | 2007-06-09 20:00:34 +0200 |
commit | b256900d4f6fe187cb93ed91bbf12c723e6b9364 (patch) | |
tree | f1fb4b41383c157e48e37d7f3d9b55ea3ee042ee /src/image/script.c | |
parent | Allow xfer_open() to take a struct uri as well as a URI string. (diff) | |
download | ipxe-b256900d4f6fe187cb93ed91bbf12c723e6b9364.tar.gz ipxe-b256900d4f6fe187cb93ed91bbf12c723e6b9364.tar.xz ipxe-b256900d4f6fe187cb93ed91bbf12c723e6b9364.zip |
Scripts temporarily deregister themselves while executing. This
allows us to avoid execution loops without having to hack around the
image registration order.
Diffstat (limited to 'src/image/script.c')
-rw-r--r-- | src/image/script.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/image/script.c b/src/image/script.c index 84432435..8e511d21 100644 --- a/src/image/script.c +++ b/src/image/script.c @@ -44,6 +44,13 @@ static int script_exec ( struct image *image ) { char *eol; 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. + */ + image_get ( image ); + unregister_image ( image ); + while ( offset < image->len ) { /* Read up to cmdbuf bytes from script into buffer */ @@ -60,7 +67,8 @@ static int script_exec ( struct image *image ) { if ( ! eol ) { DBG ( "Script line too long (max %d bytes)\n", sizeof ( cmdbuf ) ); - return -ENOEXEC; + rc = -ENOEXEC; + goto done; } /* Mark end of line and execute command */ @@ -69,14 +77,19 @@ static int script_exec ( struct image *image ) { if ( ( rc = system ( cmdbuf ) ) != 0 ) { DBG ( "Command \"%s\" exited with status %d\n", cmdbuf, rc ); - return rc; + goto done; } /* Move to next line */ offset += ( ( eol - cmdbuf ) + 1 ); } - return 0; + rc = 0; + done: + /* Re-register image and return */ + register_image ( image ); + image_put ( image ); + return rc; } /** |