mirror of
https://github.com/ipxe/ipxe
synced 2026-01-23 04:29:01 +03:00
[image] Add the concept of a static image
Not all images are allocated via alloc_image(). For example: embedded images, the static images created to hold a runtime command line, and the images used by unit tests are all static structures. Using image_set_cmdline() (via e.g. the "imgargs" command) to set the command-line arguments of a static image will succeed but will leak memory, since nothing will ever free the allocated command line. There are no code paths that can lead to calling image_set_len() on a static image, but there is no safety check against future code paths attempting this. Define a flag IMAGE_STATIC to mark an image as statically allocated, generalise free_image() to also handle freeing dynamically allocated portions of static images (such as the command line), and expose free_image() for use by static images. Define a related flag IMAGE_STATIC_NAME to mark the name as statically allocated. Allow a statically allocated name to be replaced with a dynamically allocated name since this is a potentially valid use case (e.g. if "imgdecrypt --name <name>" is used on an embedded image). Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -30,14 +30,22 @@ struct image {
|
||||
|
||||
/** URI of image */
|
||||
struct uri *uri;
|
||||
/** Name */
|
||||
/** Name
|
||||
*
|
||||
* If the @c IMAGE_STATIC_NAME flag is set, then this is a
|
||||
* statically allocated string.
|
||||
*/
|
||||
char *name;
|
||||
/** Flags */
|
||||
unsigned int flags;
|
||||
|
||||
/** Command line to pass to image */
|
||||
char *cmdline;
|
||||
/** Raw file image */
|
||||
/** Raw file image
|
||||
*
|
||||
* If the @c IMAGE_STATIC flag is set, then this is a
|
||||
* statically allocated image.
|
||||
*/
|
||||
void *data;
|
||||
/** Length of raw file image */
|
||||
size_t len;
|
||||
@@ -72,6 +80,12 @@ struct image {
|
||||
/** Image will be hidden from enumeration */
|
||||
#define IMAGE_HIDDEN 0x0008
|
||||
|
||||
/** Image is statically allocated */
|
||||
#define IMAGE_STATIC 0x0010
|
||||
|
||||
/** Image name is statically allocated */
|
||||
#define IMAGE_STATIC_NAME 0x0020
|
||||
|
||||
/** An executable image type */
|
||||
struct image_type {
|
||||
/** Name of this image type */
|
||||
@@ -185,6 +199,7 @@ static inline struct image * first_image ( void ) {
|
||||
return list_first_entry ( &images, struct image, list );
|
||||
}
|
||||
|
||||
extern void free_image ( struct refcnt *refcnt );
|
||||
extern struct image * alloc_image ( struct uri *uri );
|
||||
extern int image_set_uri ( struct image *image, struct uri *uri );
|
||||
extern int image_set_name ( struct image *image, const char *name );
|
||||
|
||||
Reference in New Issue
Block a user