iPXE
image.h File Reference

Executable images. More...

#include <ipxe/tables.h>
#include <ipxe/list.h>
#include <ipxe/refcnt.h>

Go to the source code of this file.

Data Structures

struct  image
 An executable image. More...
struct  image_type
 An executable image type. More...
struct  image_tag
 An image tag. More...

Macros

#define IMAGE_REGISTERED   0x0001
 Image is registered.
#define IMAGE_TRUSTED   0x0002
 Image is trusted.
#define IMAGE_AUTO_UNREGISTER   0x0004
 Image will be automatically unregistered after execution.
#define IMAGE_HIDDEN   0x0008
 Image will be hidden from enumeration.
#define IMAGE_STATIC   0x0010
 Image is statically allocated.
#define IMAGE_STATIC_NAME   0x0020
 Image name is statically allocated.
#define PROBE_MULTIBOOT   01
 Multiboot image probe priority.
#define PROBE_NORMAL   02
 Normal image probe priority.
#define PROBE_PXE   03
 PXE image probe priority.
#define IMAGE_TYPES   __table ( struct image_type, "image_types" )
 Executable image type table.
#define __image_type(probe_order)
 An executable image type.
#define IMAGE_TAGS   __table ( struct image_tag, "image_tags" )
 Image tag table.
#define __image_tag   __table_entry ( IMAGE_TAGS, 01 )
 An image tag.
#define for_each_image(image)
 Iterate over all registered images.
#define for_each_image_safe(image, tmp)
 Iterate over all registered images, safe against deletion.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static struct imagefirst_image (void)
 Retrieve first image.
void free_image (struct refcnt *refcnt)
 Free executable image.
struct imagealloc_image (struct uri *uri)
 Allocate executable image.
int image_set_uri (struct image *image, struct uri *uri)
 Set image URI.
int image_set_name (struct image *image, const char *name)
 Set image name.
char * image_strip_suffix (struct image *image)
 Strip dot suffix from image name, if present.
int image_set_cmdline (struct image *image, const char *cmdline)
 Set image command line.
int image_set_len (struct image *image, size_t len)
 Set image length.
int image_set_data (struct image *image, const void *data, size_t len)
 Set image data.
int register_image (struct image *image)
 Register executable image.
void unregister_image (struct image *image)
 Unregister executable image.
struct imagefind_image (const char *name)
 Find image by name.
struct imagefind_image_tag (struct image_tag *tag)
 Find image by tag.
int image_exec (struct image *image)
 Execute image.
int image_replace (struct image *replacement)
 Set replacement image.
int image_select (struct image *image)
 Select image for execution.
int image_set_trust (int require_trusted, int permanent)
 Change image trust requirement.
struct imageimage_memory (const char *name, const void *data, size_t len)
 Create registered image from block of memory.
const char * image_argument (struct image *image, const char *key)
 Find argument within image command line.
int image_pixbuf (struct image *image, struct pixel_buffer **pixbuf)
 Create pixel buffer from image.
int image_asn1 (struct image *image, size_t offset, struct asn1_cursor **cursor)
 Extract ASN.1 object from image.
int image_extract (struct image *image, const char *name, struct image **extracted)
 Extract archive image.
int image_extract_exec (struct image *image)
 Extract and execute image.
static struct imageimage_get (struct image *image)
 Increment reference count on an image.
static void image_put (struct image *image)
 Decrement reference count on an image.
static void image_clear_cmdline (struct image *image)
 Clear image command line.
static void image_trust (struct image *image)
 Set image as trusted.
static void image_untrust (struct image *image)
 Set image as untrusted.
static void image_hide (struct image *image)
 Mark image as hidden.
static struct imageimage_tag (struct image *image, struct image_tag *tag)
 Tag image.

Variables

struct list_head images
 List of registered images.
struct image_tag current_image
struct image_tag selected_image

Detailed Description

Executable images.

Definition in file image.h.

Macro Definition Documentation

◆ IMAGE_REGISTERED

#define IMAGE_REGISTERED   0x0001

Image is registered.

Definition at line 77 of file image.h.

Referenced by cms_decrypt(), image_exec(), image_replace(), register_image(), and unregister_image().

◆ IMAGE_TRUSTED

#define IMAGE_TRUSTED   0x0002

Image is trusted.

Definition at line 80 of file image.h.

Referenced by cms_verify_fail_okx(), cms_verify_okx(), image_exec(), image_extract(), image_trust(), image_untrust(), and imgstat().

◆ IMAGE_AUTO_UNREGISTER

#define IMAGE_AUTO_UNREGISTER   0x0004

Image will be automatically unregistered after execution.

Definition at line 83 of file image.h.

Referenced by image_exec(), image_extract_exec(), imgsingle_exec(), imgstat(), and uriboot().

◆ IMAGE_HIDDEN

#define IMAGE_HIDDEN   0x0008

Image will be hidden from enumeration.

Definition at line 86 of file image.h.

Referenced by efi_file_install(), efi_file_read_dir(), efi_file_read_initrd(), efi_image_exec(), image_hide(), imgstat(), initrd_load(), and multiboot_add_modules().

◆ IMAGE_STATIC

#define IMAGE_STATIC   0x0010

Image is statically allocated.

Definition at line 89 of file image.h.

Referenced by free_image(), image_set_len(), lkrn_exec(), and register_image().

◆ IMAGE_STATIC_NAME

#define IMAGE_STATIC_NAME   0x0020

Image name is statically allocated.

Definition at line 92 of file image.h.

Referenced by free_image(), image_set_name(), lkrn_exec(), and register_image().

◆ PROBE_MULTIBOOT

#define PROBE_MULTIBOOT   01

Multiboot image probe priority.

Multiboot images are also valid executables in another format (e.g. ELF), so we must perform the multiboot probe first.

Definition at line 151 of file image.h.

Referenced by __image_type().

◆ PROBE_NORMAL

#define PROBE_NORMAL   02

Normal image probe priority.

Definition at line 156 of file image.h.

Referenced by __image_type().

◆ PROBE_PXE

#define PROBE_PXE   03

PXE image probe priority.

PXE images have no signature checks, so will claim all image files. They must therefore be tried last in the probe order list.

Definition at line 164 of file image.h.

Referenced by __image_type().

◆ IMAGE_TYPES

#define IMAGE_TYPES   __table ( struct image_type, "image_types" )

Executable image type table.

Definition at line 167 of file image.h.

Referenced by image_probe().

◆ __image_type

#define __image_type ( probe_order)
Value:
__table_entry ( IMAGE_TYPES, probe_order )
#define IMAGE_TYPES
Executable image type table.
Definition image.h:167
#define __table_entry(table, idx)
Declare a linker table entry.
Definition tables.h:239

An executable image type.

Definition at line 170 of file image.h.

Referenced by __image_type(), __image_type(), and __image_type().

◆ IMAGE_TAGS

#define IMAGE_TAGS   __table ( struct image_tag, "image_tags" )

Image tag table.

Definition at line 181 of file image.h.

Referenced by free_image(), and imgstat().

◆ __image_tag

struct image_tag current_image __image_tag   __table_entry ( IMAGE_TAGS, 01 )

An image tag.

Currently-executing image.

Definition at line 184 of file image.h.

Referenced by FILE_SECBOOT().

◆ for_each_image

#define for_each_image ( image)
Value:
struct list_head images
List of registered images.
Definition image.c:59
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
An executable image.
Definition image.h:24

Iterate over all registered images.

Definition at line 191 of file image.h.

191#define for_each_image( image ) \
192 list_for_each_entry ( (image), &images, list )

Referenced by efi_file_find(), efi_file_get_info(), efi_file_install(), efi_file_read_dir(), efi_file_read_initrd(), find_image(), find_image_tag(), initrd_dump(), initrd_load_all(), initrd_squash_high(), initrd_swap_any(), and multiboot_add_modules().

◆ for_each_image_safe

#define for_each_image_safe ( image,
tmp )
Value:
unsigned long tmp
Definition linux_pci.h:65
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition list.h:459

Iterate over all registered images, safe against deletion.

Definition at line 195 of file image.h.

195#define for_each_image_safe( image, tmp ) \
196 list_for_each_entry_safe ( (image), (tmp), &images, list )

Referenced by imgmulti_exec().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ first_image()

struct image * first_image ( void )
inlinestatic

Retrieve first image.

Return values
imageImage, or NULL

Definition at line 203 of file image.h.

203 {
204 return list_first_entry ( &images, struct image, list );
205}
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334

References images, image::list, and list_first_entry.

Referenced by ipxe().

◆ free_image()

void free_image ( struct refcnt * refcnt)
extern

Free executable image.

Parameters
refcntReference counter

Image consumers must call image_put() rather than calling free_image() directly. This function is exposed for use only by static images.

Definition at line 86 of file image.c.

86 {
87 struct image *image = container_of ( refcnt, struct image, refcnt );
88 struct image_tag *tag;
89
90 /* Sanity check: free_image() should not be called directly on
91 * dynamically allocated images.
92 */
93 assert ( refcnt->count < 0 );
94 DBGC ( image, "IMAGE %s freed\n", image->name );
95
96 /* Clear any tag weak references */
98 if ( tag->image == image )
99 tag->image = NULL;
100 }
101
102 /* Free dynamic allocations used by both static and dynamic images */
103 free ( image->cmdline );
104 uri_put ( image->uri );
106
107 /* Free image name, if dynamically allocated */
108 if ( ! ( image->flags & IMAGE_STATIC_NAME ) )
109 free ( image->name );
110
111 /* Free image data and image itself, if dynamically allocated */
112 if ( ! ( image->flags & IMAGE_STATIC ) ) {
113 ufree ( image->rwdata );
114 free ( image );
115 }
116}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
uint64_t tag
Identity tag.
Definition edd.h:1
#define DBGC(...)
Definition compiler.h:505
#define IMAGE_STATIC_NAME
Image name is statically allocated.
Definition image.h:92
static void image_put(struct image *image)
Decrement reference count on an image.
Definition image.h:250
#define IMAGE_TAGS
Image tag table.
Definition image.h:181
#define IMAGE_STATIC
Image is statically allocated.
Definition image.h:89
static __always_inline void ufree(void *ptr)
Free external memory.
Definition umalloc.h:68
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
An image tag.
Definition image.h:173
unsigned int flags
Flags.
Definition image.h:40
struct image * replacement
Replacement image.
Definition image.h:73
char * name
Name.
Definition image.h:38
struct uri * uri
URI of image.
Definition image.h:32
char * cmdline
Command line to pass to image.
Definition image.h:43
void * rwdata
Writable data.
Definition image.h:53
A reference counter.
Definition refcnt.h:27
int count
Current reference count.
Definition refcnt.h:33
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition uri.h:206

References assert, image::cmdline, container_of, refcnt::count, DBGC, image::flags, for_each_table_entry, free, image_put(), IMAGE_STATIC, IMAGE_STATIC_NAME, IMAGE_TAGS, image::name, NULL, image::replacement, image::rwdata, tag, ufree(), image::uri, and uri_put().

Referenced by alloc_image(), cmdline_image_free(), efi_cmdline_free(), and lkrn_exec().

◆ alloc_image()

struct image * alloc_image ( struct uri * uri)
extern

Allocate executable image.

Parameters
uriURI, or NULL
Return values
imageExecutable image

Definition at line 124 of file image.c.

124 {
125 struct image *image;
126 int rc;
127
128 /* Allocate image */
129 image = zalloc ( sizeof ( *image ) );
130 if ( ! image )
131 goto err_alloc;
132
133 /* Initialise image */
135 if ( uri && ( ( rc = image_set_uri ( image, uri ) ) != 0 ) )
136 goto err_set_uri;
137
138 return image;
139
140 err_set_uri:
141 image_put ( image );
142 err_alloc:
143 return NULL;
144}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
void free_image(struct refcnt *refcnt)
Free executable image.
Definition image.c:86
int image_set_uri(struct image *image, struct uri *uri)
Set image URI.
Definition image.c:153
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition refcnt.h:65
struct refcnt refcnt
Reference count.
Definition image.h:26
A Uniform Resource Identifier.
Definition uri.h:65

References free_image(), image_put(), image_set_uri(), NULL, rc, ref_init, image::refcnt, and zalloc().

Referenced by cpio_okx(), image_extract(), image_memory(), and imgdownload().

◆ image_set_uri()

int image_set_uri ( struct image * image,
struct uri * uri )
extern

Set image URI.

Parameters
imageImage
uriNew image URI
Return values
rcReturn status code

Definition at line 153 of file image.c.

153 {
154 const char *name;
155 int rc;
156
157 /* Set name, if image does not already have one */
158 if ( ! ( image->name && image->name[0] ) ) {
159 name = ( uri->path ? uri->path : uri->opaque );
160 if ( name ) {
161 name = basename ( ( char * ) name );
162 if ( ( rc = image_set_name ( image, name ) ) != 0 )
163 return rc;
164 }
165 }
166
167 /* Update image URI */
168 uri_put ( image->uri );
169 image->uri = uri_get ( uri );
170
171 return 0;
172}
const char * name
Definition ath9k_hw.c:1986
char * basename(char *path)
Return base name from path.
Definition basename.c:43
int image_set_name(struct image *image, const char *name)
Set image name.
Definition image.c:181
const char * path
Path (after URI decoding)
Definition uri.h:81
const char * opaque
Opaque part.
Definition uri.h:71
static struct uri * uri_get(struct uri *uri)
Increment URI reference count.
Definition uri.h:195

References basename(), image_set_name(), image::name, name, uri::opaque, uri::path, rc, image::uri, uri_get(), and uri_put().

Referenced by alloc_image(), and downloader_vredirect().

◆ image_set_name()

int image_set_name ( struct image * image,
const char * name )
extern

Set image name.

Parameters
imageImage
nameNew image name
Return values
rcReturn status code

Definition at line 181 of file image.c.

181 {
182 char *name_copy;
183
184 /* Duplicate name */
185 name_copy = strdup ( name );
186 if ( ! name_copy )
187 return -ENOMEM;
188
189 /* Free existing name, if not statically allocated */
190 if ( ! ( image->flags & IMAGE_STATIC_NAME ) )
191 free ( image->name );
192
193 /* Replace existing name */
194 image->name = name_copy;
196
197 return 0;
198}
#define ENOMEM
Not enough space.
Definition errno.h:535
char * strdup(const char *src)
Duplicate string.
Definition string.c:394

References ENOMEM, image::flags, free, IMAGE_STATIC_NAME, image::name, name, and strdup().

Referenced by cms_decrypt(), cpio_okx(), image_extract(), image_memory(), image_set_uri(), imgsingle_exec(), and register_image().

◆ image_strip_suffix()

char * image_strip_suffix ( struct image * image)
extern

Strip dot suffix from image name, if present.

Parameters
imageImage
Return values
sepPosition of old dot separator, or NULL

Definition at line 206 of file image.c.

206 {
207 char *dot;
208
209 /* Locate and strip suffix, if present */
210 if ( image->name &&
211 ( ( dot = strrchr ( image->name, '.' ) ) != NULL ) ) {
212 *dot = '\0';
213 return dot;
214 }
215
216 return NULL;
217}
char * strrchr(const char *src, int character)
Find rightmost character within a string.
Definition string.c:290

References image::name, NULL, and strrchr().

Referenced by cms_decrypt(), and image_extract().

◆ image_set_cmdline()

int image_set_cmdline ( struct image * image,
const char * cmdline )
extern

Set image command line.

Parameters
imageImage
cmdlineNew image command line, or NULL
Return values
rcReturn status code

Definition at line 226 of file image.c.

226 {
227
228 free ( image->cmdline );
229 image->cmdline = NULL;
230 if ( cmdline ) {
232 if ( ! image->cmdline )
233 return -ENOMEM;
234 }
235 return 0;
236}
uint32_t cmdline
Definition multiboot.h:4

References cmdline, image::cmdline, ENOMEM, free, NULL, and strdup().

Referenced by cpio_okx(), image_clear_cmdline(), image_extract_exec(), and imgsingle_exec().

◆ image_set_len()

int image_set_len ( struct image * image,
size_t len )
extern

Set image length.

Parameters
imageImage
lenLength of image data
Return values
rcReturn status code

Definition at line 245 of file image.c.

245 {
246 void *new;
247
248 /* Refuse to reallocate static images */
249 if ( image->flags & IMAGE_STATIC )
250 return -ENOTTY;
251
252 /* (Re)allocate image data */
253 new = urealloc ( image->rwdata, len );
254 if ( ! new )
255 return -ENOMEM;
256 image->rwdata = new;
257 image->len = len;
258
259 return 0;
260}
ring len
Length.
Definition dwmac.h:226
#define ENOTTY
Inappropriate I/O control operation.
Definition errno.h:595
void * urealloc(void *ptr, size_t new_size)
Reallocate external memory.
size_t len
Length of raw file image.
Definition image.h:56

References ENOMEM, ENOTTY, image::flags, IMAGE_STATIC, image::len, len, image::rwdata, and urealloc().

Referenced by cpio_okx(), gzip_extract(), image_set_data(), and zlib_deflate().

◆ image_set_data()

int image_set_data ( struct image * image,
const void * data,
size_t len )
extern

Set image data.

Parameters
imageImage
dataImage data
lenLength of image data
Return values
rcReturn status code

Definition at line 270 of file image.c.

270 {
271 int rc;
272
273 /* Set image length */
274 if ( ( rc = image_set_len ( image, len ) ) != 0 )
275 return rc;
276
277 /* Copy in new image data */
278 memcpy ( image->rwdata, data, len );
279
280 return 0;
281}
uint8_t data[48]
Additional event data.
Definition ena.h:11
int image_set_len(struct image *image, size_t len)
Set image length.
Definition image.c:245
void * memcpy(void *dest, const void *src, size_t len) __nonnull

References data, image_set_len(), len, memcpy(), rc, and image::rwdata.

Referenced by image_memory(), and zimg_extract().

◆ register_image()

int register_image ( struct image * image)
extern

Register executable image.

Parameters
imageExecutable image
Return values
rcReturn status code

Definition at line 315 of file image.c.

315 {
316 static unsigned int imgindex = 0;
317 char name[8]; /* "imgXXXX" */
318 int rc;
319
320 /* Sanity checks */
321 if ( image->flags & IMAGE_STATIC ) {
322 assert ( ( image->name == NULL ) ||
324 assert ( image->cmdline == NULL );
325 }
326
327 /* Create image name if it doesn't already have one */
328 if ( ! image->name ) {
329 snprintf ( name, sizeof ( name ), "img%d", imgindex++ );
330 if ( ( rc = image_set_name ( image, name ) ) != 0 )
331 return rc;
332 }
333
334 /* Add to image list */
335 image_get ( image );
338 DBGC ( image, "IMAGE %s at [%lx,%lx) registered\n",
339 image->name, virt_to_phys ( image->data ),
340 ( virt_to_phys ( image->data ) + image->len ) );
341
342 /* Try to detect image type, if applicable. Ignore failures,
343 * since we expect to handle some unrecognised images
344 * (e.g. kernel initrds, multiboot modules, random files
345 * provided via our EFI virtual filesystem, etc).
346 */
347 if ( ! image->type )
348 image_probe ( image );
349
350 return 0;
351}
static int image_probe(struct image *image)
Determine image type.
Definition image.c:289
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition image.h:240
#define IMAGE_REGISTERED
Image is registered.
Definition image.h:77
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition list.h:94
struct image_type * type
Image type, if known.
Definition image.h:59
const void * data
Read-only data.
Definition image.h:51
struct list_head list
List of registered images.
Definition image.h:29
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition vsprintf.c:383

References assert, image::cmdline, image::data, DBGC, image::flags, image_get(), image_probe(), IMAGE_REGISTERED, image_set_name(), IMAGE_STATIC, IMAGE_STATIC_NAME, images, image::len, image::list, list_add_tail, image::name, name, NULL, rc, snprintf(), and image::type.

Referenced by asn1_okx(), cmdline_init(), cms_decrypt(), efi_cmdline_init(), efi_image_exec(), embedded_init(), image_exec(), image_extract(), image_memory(), imgdownload(), pixbuf_okx(), and test_init().

◆ unregister_image()

void unregister_image ( struct image * image)
extern

Unregister executable image.

Parameters
imageExecutable image

Definition at line 358 of file image.c.

358 {
359
360 /* Do nothing unless image is registered */
361 if ( ! ( image->flags & IMAGE_REGISTERED ) )
362 return;
363
364 DBGC ( image, "IMAGE %s unregistered\n", image->name );
365 list_del ( &image->list );
367 image_put ( image );
368}
#define list_del(list)
Delete an entry from a list.
Definition list.h:120

References DBGC, image::flags, image_put(), IMAGE_REGISTERED, image::list, list_del, and image::name.

Referenced by asn1_okx(), bzimage_exec(), cert_exec(), cms_decrypt(), com32_exec_loop(), comboot_exec_loop(), console_exec(), efi_autoexec_load(), efi_image_exec(), fdt_test_exec(), gzip_okx(), image_exec(), image_extract(), image_extract_exec(), imgdecrypt_exec(), imgextract_exec(), imgfree_exec(), imgverify_exec(), pixbuf_okx(), and zlib_okx().

◆ find_image()

struct image * find_image ( const char * name)
extern

Find image by name.

Parameters
nameImage name
Return values
imageExecutable image, or NULL

Definition at line 376 of file image.c.

376 {
377 struct image *image;
378
380 if ( strcmp ( image->name, name ) == 0 )
381 return image;
382 }
383
384 return NULL;
385}
#define for_each_image(image)
Iterate over all registered images.
Definition image.h:191
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174

References for_each_image, image::name, name, NULL, and strcmp().

Referenced by imgacquire(), and imgmulti_exec().

◆ find_image_tag()

struct image * find_image_tag ( struct image_tag * tag)
extern

Find image by tag.

Parameters
tagImage tag
Return values
imageExecutable image, or NULL

Definition at line 393 of file image.c.

393 {
394 struct image *image;
395
397 if ( tag->image == image )
398 return image;
399 }
400
401 return NULL;
402}

References for_each_image, NULL, and tag.

Referenced by efi_file_open(), efi_image_exec(), fdt_create(), imgsingle_exec(), and shim_exec().

◆ image_exec()

int image_exec ( struct image * image)
extern

Execute image.

Parameters
imageExecutable image
Return values
rcReturn status code

The image must already be registered. Note that executing an image may cause it to unregister itself. The caller must therefore assume that the image pointer becomes invalid.

Definition at line 414 of file image.c.

414 {
415 struct image *saved_current_image;
416 struct image *replacement = NULL;
417 struct uri *old_cwuri;
418 int rc;
419
420 /* Sanity check */
422
423 /* Switch current working directory to be that of the image
424 * itself, if applicable
425 */
426 old_cwuri = uri_get ( cwuri );
427 if ( image->uri )
428 churi ( image->uri );
429
430 /* Set as currently running image */
431 saved_current_image = image_tag ( image, &current_image );
432
433 /* Take out a temporary reference to the image, so that it
434 * does not get freed when temporarily unregistered.
435 */
436 image_get ( image );
437
438 /* Check that this image can be executed */
439 if ( ! ( image->type && image->type->exec ) ) {
440 rc = -ENOEXEC;
441 goto err;
442 }
443
444 /* Check that image is trusted (if applicable) */
446 DBGC ( image, "IMAGE %s is not trusted\n", image->name );
448 goto err;
449 }
450
451 /* Record boot attempt */
452 syslog ( LOG_NOTICE, "Executing \"%s\"\n", image->name );
453
454 /* Temporarily unregister the image during its execution */
456
457 /* Try executing the image */
458 if ( ( rc = image->type->exec ( image ) ) != 0 ) {
459 DBGC ( image, "IMAGE %s could not execute: %s\n",
460 image->name, strerror ( rc ) );
461 /* Do not return yet; we still have clean-up to do */
462 }
463
464 /* Record result of boot attempt */
465 if ( rc == 0 ) {
466 syslog ( LOG_NOTICE, "Execution of \"%s\" completed\n",
467 image->name );
468 } else {
469 syslog ( LOG_ERR, "Execution of \"%s\" failed: %s\n",
470 image->name, strerror ( rc ) );
471 }
472
473 /* Re-register image (unless due to be replaced) */
474 if ( ! image->replacement )
476
477 /* Pick up replacement image before we drop the original
478 * image's temporary reference. The replacement image must
479 * already be registered, so we don't need to hold a temporary
480 * reference (which would complicate the tail-recursion).
481 */
483 if ( replacement )
485
486 /* Clear any recorded replacement image */
489
490 err:
491 /* Unregister image if applicable */
494
495 /* Debug message for tail-recursion. Placed here because the
496 * image_put() may end up freeing the image.
497 */
498 if ( replacement ) {
499 DBGC ( image, "IMAGE %s replacing self with IMAGE %s\n",
500 image->name, replacement->name );
501 }
502
503 /* Drop temporary reference to the original image */
504 image_put ( image );
505
506 /* Restore previous currently-running image */
507 image_tag ( saved_current_image, &current_image );
508
509 /* Reset current working directory */
510 churi ( old_cwuri );
511 uri_put ( old_cwuri );
512
513 /* Tail-recurse into replacement image, if one exists */
514 if ( replacement )
515 return image_exec ( replacement );
516
517 return rc;
518}
void churi(struct uri *uri)
Change working URI.
Definition cwuri.c:46
struct uri * cwuri
Current working URI.
Definition cwuri.c:39
const char * replacement
Definition editstring.h:54
#define ENOEXEC
Exec format error.
Definition errno.h:520
#define LOG_ERR
Error: error conditions.
Definition syslog.h:36
#define LOG_NOTICE
Notice: normal but significant conditions.
Definition syslog.h:42
#define EACCES_UNTRUSTED
Definition image.c:49
void unregister_image(struct image *image)
Unregister executable image.
Definition image.c:358
int image_exec(struct image *image)
Execute image.
Definition image.c:414
static int require_trusted_images
Current image trust requirement.
Definition image.c:72
int register_image(struct image *image)
Register executable image.
Definition image.c:315
struct image_tag current_image
#define IMAGE_TRUSTED
Image is trusted.
Definition image.h:80
static struct image * image_tag(struct image *image, struct image_tag *tag)
Tag image.
Definition image.h:297
#define IMAGE_AUTO_UNREGISTER
Image will be automatically unregistered after execution.
Definition image.h:83
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
int(* exec)(struct image *image)
Execute image.
Definition image.h:113
#define syslog(priority, fmt,...)
Write message to system log.
Definition syslog.h:94

References assert, churi(), current_image, cwuri, DBGC, EACCES_UNTRUSTED, ENOEXEC, image_type::exec, image::flags, IMAGE_AUTO_UNREGISTER, image_exec(), image_get(), image_put(), IMAGE_REGISTERED, image_tag(), IMAGE_TRUSTED, LOG_ERR, LOG_NOTICE, image::name, NULL, rc, register_image(), image::replacement, replacement, require_trusted_images, strerror(), syslog, image::type, unregister_image(), image::uri, uri_get(), and uri_put().

Referenced by image_exec(), imgexec(), ipxe(), and uriboot().

◆ image_replace()

int image_replace ( struct image * replacement)
extern

Set replacement image.

Parameters
replacementReplacement image
Return values
rcReturn status code

The replacement image must already be registered, and must remain registered until the currently-executing image returns.

Definition at line 529 of file image.c.

529 {
530 struct image *image = current_image.image;
531 int rc;
532
533 /* Sanity check */
535
536 /* Fail unless there is a currently-executing image */
537 if ( ! image ) {
538 rc = -ENOTTY;
539 DBGC ( replacement, "IMAGE %s cannot replace non-existent "
540 "image: %s\n", replacement->name, strerror ( rc ) );
541 return rc;
542 }
543
544 /* Check that the replacement image can be executed */
545 if ( ! ( replacement->type && replacement->type->exec ) )
546 return -ENOEXEC;
547
548 /* Clear any existing replacement */
550
551 /* Set replacement */
553 DBGC ( image, "IMAGE %s will replace self with IMAGE %s\n",
554 image->name, replacement->name );
555
556 return 0;
557}

References assert, current_image, DBGC, ENOEXEC, ENOTTY, image_get(), image_put(), IMAGE_REGISTERED, image::name, rc, image::replacement, replacement, and strerror().

Referenced by comboot_fetch_kernel(), image_extract_exec(), and imgexec().

◆ image_select()

int image_select ( struct image * image)
extern

Select image for execution.

Parameters
imageExecutable image
Return values
rcReturn status code

Definition at line 565 of file image.c.

565 {
566
567 /* Check that this image can be executed */
568 if ( ! ( image->type && image->type->exec ) )
569 return -ENOEXEC;
570
571 /* Mark image as selected */
573
574 return 0;
575}
struct image_tag selected_image

References ENOEXEC, image_type::exec, image_tag(), selected_image, and image::type.

Referenced by embedded_init(), and imgselect().

◆ image_set_trust()

int image_set_trust ( int require_trusted,
int permanent )
extern

Change image trust requirement.

Parameters
require_trustedRequire trusted images
permanentMake trust requirement permanent
Return values
rcReturn status code

Definition at line 584 of file image.c.

584 {
585
586 /* Update trust requirement, if permitted to do so */
588 require_trusted_images = require_trusted;
590 }
591
592 /* Fail if we attempted to change the trust requirement but
593 * were not permitted to do so.
594 */
595 if ( require_trusted_images != require_trusted )
596 return -EACCES_PERMANENT;
597
598 return 0;
599}
static int require_trusted_images_permanent
Prevent changes to image trust requirement.
Definition image.c:75
#define EACCES_PERMANENT
Definition image.c:53

References EACCES_PERMANENT, require_trusted_images, and require_trusted_images_permanent.

Referenced by imgtrust_exec().

◆ image_memory()

struct image * image_memory ( const char * name,
const void * data,
size_t len )
extern

Create registered image from block of memory.

Parameters
nameName
dataImage data
lenLength
Return values
imageImage, or NULL on error

Definition at line 609 of file image.c.

610 {
611 struct image *image;
612 int rc;
613
614 /* Allocate image */
615 image = alloc_image ( NULL );
616 if ( ! image ) {
617 rc = -ENOMEM;
618 goto err_alloc_image;
619 }
620
621 /* Set name */
622 if ( ( rc = image_set_name ( image, name ) ) != 0 )
623 goto err_set_name;
624
625 /* Set data */
626 if ( ( rc = image_set_data ( image, data, len ) ) != 0 )
627 goto err_set_data;
628
629 /* Register image */
630 if ( ( rc = register_image ( image ) ) != 0 )
631 goto err_register;
632
633 /* Drop local reference to image */
634 image_put ( image );
635
636 return image;
637
638 err_register:
639 err_set_data:
640 err_set_name:
641 image_put ( image );
642 err_alloc_image:
643 return NULL;
644}
struct image * alloc_image(struct uri *uri)
Allocate executable image.
Definition image.c:124
int image_set_data(struct image *image, const void *data, size_t len)
Set image data.
Definition image.c:270

References alloc_image(), data, ENOMEM, image_put(), image_set_data(), image_set_name(), len, name, NULL, rc, and register_image().

Referenced by fdt_test_exec(), gzip_okx(), imgmem(), initrd_init(), and zlib_okx().

◆ image_argument()

const char * image_argument ( struct image * image,
const char * key )
extern

Find argument within image command line.

Parameters
imageImage
keyArgument search key (including trailing delimiter)
Return values
valueArgument value, or NULL if not found

Definition at line 653 of file image.c.

653 {
654 const char *cmdline = image->cmdline;
655 const char *search;
656 const char *match;
657 const char *next;
658
659 /* Find argument */
660 for ( search = cmdline ; search ; search = next ) {
661
662 /* Find next occurrence, if any */
663 match = strstr ( search, key );
664 if ( ! match )
665 break;
666 next = ( match + strlen ( key ) );
667
668 /* Check preceding delimiter, if any */
669 if ( ( match == cmdline ) || isspace ( match[-1] ) )
670 return next;
671 }
672
673 return NULL;
674}
union @162305117151260234136356364136041353210355154177 key
Sense key.
Definition scsi.h:3
int isspace(int character)
Check to see if character is a space.
Definition ctype.c:42
uint32_t next
Next descriptor address.
Definition dwmac.h:11
char * strstr(const char *haystack, const char *needle)
Find substring.
Definition string.c:310
size_t strlen(const char *src)
Get length of string.
Definition string.c:244

References cmdline, image::cmdline, isspace(), key, next, NULL, strlen(), and strstr().

Referenced by bzimage_parse_cmdline(), and cpio_parse_cmdline().

◆ image_pixbuf()

int image_pixbuf ( struct image * image,
struct pixel_buffer ** pixbuf )
extern

Create pixel buffer from image.

Parameters
imageImage
pixbufPixel buffer to fill in
Return values
rcReturn status code

Definition at line 100 of file pixbuf.c.

100 {
101 int rc;
102
103 /* Check that this image can be used to create a pixel buffer */
104 if ( ! ( image->type && image->type->pixbuf ) )
105 return -ENOTSUP;
106
107 /* Try creating pixel buffer */
108 if ( ( rc = image->type->pixbuf ( image, pixbuf ) ) != 0 ) {
109 DBGC ( image, "IMAGE %s could not create pixel buffer: %s\n",
110 image->name, strerror ( rc ) );
111 return rc;
112 }
113
114 return 0;
115}
#define ENOTSUP
Operation not supported.
Definition errno.h:590
int(* pixbuf)(struct image *image, struct pixel_buffer **pixbuf)
Create pixel buffer from image.
Definition image.h:121

References DBGC, ENOTSUP, image::name, image_type::pixbuf, rc, strerror(), and image::type.

Referenced by console_exec(), pixbuf_okx(), and REQUIRING_SYMBOL().

◆ image_asn1()

int image_asn1 ( struct image * image,
size_t offset,
struct asn1_cursor ** cursor )
extern

Extract ASN.1 object from image.

Parameters
imageImage
offsetOffset within image
cursorASN.1 cursor to fill in
Return values
nextOffset to next image, or negative error

The caller is responsible for eventually calling free() on the allocated ASN.1 cursor.

Definition at line 1028 of file asn1.c.

1029 {
1030 int next;
1031 int rc;
1032
1033 /* Sanity check */
1035
1036 /* Check that this image can be used to extract an ASN.1 object */
1037 if ( ! ( image->type && image->type->asn1 ) )
1038 return -ENOTSUP;
1039
1040 /* Try creating ASN.1 cursor */
1041 next = image->type->asn1 ( image, offset, cursor );
1042 if ( next < 0 ) {
1043 rc = next;
1044 DBGC ( image, "IMAGE %s could not extract ASN.1 object: %s\n",
1045 image->name, strerror ( rc ) );
1046 return rc;
1047 }
1048
1049 return next;
1050}
uint16_t offset
Offset to command line.
Definition bzimage.h:3
int(* asn1)(struct image *image, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from image.
Definition image.h:133

References image_type::asn1, assert, DBGC, ENOTSUP, len, image::name, next, offset, rc, strerror(), and image::type.

Referenced by asn1_okx(), cms_message(), image_x509(), and REQUIRING_SYMBOL().

◆ image_extract()

int image_extract ( struct image * image,
const char * name,
struct image ** extracted )
extern

Extract archive image.

Parameters
imageImage
nameExtracted image name
extractedExtracted image to fill in
Return values
rcReturn status code

Definition at line 45 of file archive.c.

46 {
47 int rc;
48
49 /* Check that this image can be used to extract an archive image */
50 if ( ! ( image->type && image->type->extract ) ) {
51 rc = -ENOTSUP;
52 goto err_unsupported;
53 }
54
55 /* Allocate new image */
56 *extracted = alloc_image ( image->uri );
57 if ( ! *extracted ) {
58 rc = -ENOMEM;
59 goto err_alloc;
60 }
61
62 /* Set image name */
63 if ( ( rc = image_set_name ( *extracted,
64 ( name ? name : image->name ) ) ) != 0 ) {
65 goto err_set_name;
66 }
67
68 /* Strip any archive or compression suffix from implicit name */
69 if ( ! name )
70 image_strip_suffix ( *extracted );
71
72 /* Try extracting archive image */
73 if ( ( rc = image->type->extract ( image, *extracted ) ) != 0 ) {
74 DBGC ( image, "IMAGE %s could not extract image: %s\n",
75 image->name, strerror ( rc ) );
76 goto err_extract;
77 }
78
79 /* Register image */
80 if ( ( rc = register_image ( *extracted ) ) != 0 )
81 goto err_register;
82
83 /* Propagate trust flag */
84 if ( image->flags & IMAGE_TRUSTED )
85 image_trust ( *extracted );
86
87 /* Drop local reference to image */
88 image_put ( *extracted );
89
90 return 0;
91
92 unregister_image ( *extracted );
93 err_register:
94 err_extract:
95 err_set_name:
96 image_put ( *extracted );
97 err_alloc:
98 err_unsupported:
99 return rc;
100}
char * image_strip_suffix(struct image *image)
Strip dot suffix from image name, if present.
Definition image.c:206
static void image_trust(struct image *image)
Set image as trusted.
Definition image.h:268
int(* extract)(struct image *image, struct image *extracted)
Extract archive image.
Definition image.h:142

References alloc_image(), DBGC, ENOMEM, ENOTSUP, image_type::extract, image::flags, image_put(), image_set_name(), image_strip_suffix(), image_trust(), IMAGE_TRUSTED, image::name, name, rc, register_image(), strerror(), image::type, unregister_image(), and image::uri.

Referenced by gzip_okx(), image_extract_exec(), imgextract(), REQUIRING_SYMBOL(), and zlib_okx().

◆ image_extract_exec()

int image_extract_exec ( struct image * image)
extern

Extract and execute image.

Parameters
imageImage
Return values
rcReturn status code

Definition at line 108 of file archive.c.

108 {
109 struct image *extracted;
110 int rc;
111
112 /* Extract image */
113 if ( ( rc = image_extract ( image, NULL, &extracted ) ) != 0 )
114 goto err_extract;
115
116 /* Set image command line */
117 if ( ( rc = image_set_cmdline ( extracted, image->cmdline ) ) != 0 )
118 goto err_set_cmdline;
119
120 /* Set auto-unregister flag */
121 extracted->flags |= IMAGE_AUTO_UNREGISTER;
122
123 /* Replace current image */
124 if ( ( rc = image_replace ( extracted ) ) != 0 )
125 goto err_replace;
126
127 /* Return to allow replacement image to be executed */
128 return 0;
129
130 err_replace:
131 err_set_cmdline:
132 unregister_image ( extracted );
133 err_extract:
134 return rc;
135}
int image_extract(struct image *image, const char *name, struct image **extracted)
Extract archive image.
Definition archive.c:45
int image_set_cmdline(struct image *image, const char *cmdline)
Set image command line.
Definition image.c:226
int image_replace(struct image *replacement)
Set replacement image.
Definition image.c:529

References image::cmdline, image::flags, IMAGE_AUTO_UNREGISTER, image_extract(), image_replace(), image_set_cmdline(), NULL, rc, and unregister_image().

Referenced by __image_type().

◆ image_get()

struct image * image_get ( struct image * image)
inlinestatic

Increment reference count on an image.

Parameters
imageImage
Return values
imageImage

Definition at line 240 of file image.h.

240 {
241 ref_get ( &image->refcnt );
242 return image;
243}
#define ref_get(refcnt)
Get additional reference to object.
Definition refcnt.h:93

References ref_get, and image::refcnt.

Referenced by bzimage_exec(), cms_decrypt(), create_downloader(), efi_file_open_image(), image_exec(), image_replace(), and register_image().

◆ image_put()

void image_put ( struct image * image)
inlinestatic

Decrement reference count on an image.

Parameters
imageImage

Definition at line 250 of file image.h.

250 {
251 ref_put ( &image->refcnt );
252}
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107

References ref_put, and image::refcnt.

Referenced by alloc_image(), cmdline_init(), cms_decrypt(), cpio_okx(), downloader_free(), efi_cmdline_init(), efi_file_free(), free_image(), image_exec(), image_extract(), image_memory(), image_replace(), imgdownload(), and unregister_image().

◆ image_clear_cmdline()

void image_clear_cmdline ( struct image * image)
inlinestatic

Clear image command line.

Parameters
imageImage

Definition at line 259 of file image.h.

259 {
261}
int image_set_cmdline(struct image *image, const char *cmdline)
Set image command line.
Definition image.c:226

References image_set_cmdline(), and NULL.

◆ image_trust()

void image_trust ( struct image * image)
inlinestatic

Set image as trusted.

Parameters
imageImage

Definition at line 268 of file image.h.

268 {
270}

References image::flags, and IMAGE_TRUSTED.

Referenced by cms_verify(), embedded_init(), and image_extract().

◆ image_untrust()

void image_untrust ( struct image * image)
inlinestatic

Set image as untrusted.

Parameters
imageImage

Definition at line 277 of file image.h.

277 {
279}

References image::flags, and IMAGE_TRUSTED.

Referenced by cms_decrypt(), and cms_verify().

◆ image_hide()

void image_hide ( struct image * image)
inlinestatic

Mark image as hidden.

Parameters
imageImage

Definition at line 286 of file image.h.

286 {
288}
#define IMAGE_HIDDEN
Image will be hidden from enumeration.
Definition image.h:86

References image::flags, and IMAGE_HIDDEN.

Referenced by imgfdt(), and shim().

◆ image_tag()

struct image * image_tag ( struct image * image,
struct image_tag * tag )
inlinestatic

Tag image.

Parameters
imageImage
tagImage tag
Return values
prevPrevious tagged image (if any)

Definition at line 297 of file image.h.

298 {
299 struct image *prev = tag->image;
300
301 tag->image = image;
302 return prev;
303}

References tag.

Referenced by fdt_test_exec(), image_exec(), image_select(), imgfdt(), and shim().

Variable Documentation

◆ images

struct list_head images
extern

List of registered images.

Definition at line 59 of file image.c.

Referenced by first_image(), initrd_dump(), initrd_load(), initrd_region(), initrd_squash_high(), initrd_startup(), initrd_swap(), lkrn_exec(), and register_image().

◆ current_image

struct image_tag current_image
extern

◆ selected_image

struct image_tag selected_image
extern