iPXE
Macros | Functions | Variables
image.c File Reference

Executable images. More...

#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <libgen.h>
#include <syslog.h>
#include <ipxe/list.h>
#include <ipxe/uaccess.h>
#include <ipxe/umalloc.h>
#include <ipxe/uri.h>
#include <ipxe/image.h>

Go to the source code of this file.

Macros

#define EACCES_UNTRUSTED   __einfo_error ( EINFO_EACCES_UNTRUSTED )
 
#define EINFO_EACCES_UNTRUSTED   __einfo_uniqify ( EINFO_EACCES, 0x01, "Untrusted image" )
 
#define EACCES_PERMANENT   __einfo_error ( EINFO_EACCES_PERMANENT )
 
#define EINFO_EACCES_PERMANENT   __einfo_uniqify ( EINFO_EACCES, 0x02, "Trust requirement is permanent" )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void free_image (struct refcnt *refcnt)
 Free executable image. More...
 
struct imagealloc_image (struct uri *uri)
 Allocate executable image. More...
 
int image_set_uri (struct image *image, struct uri *uri)
 Set image URI. More...
 
int image_set_name (struct image *image, const char *name)
 Set image name. More...
 
char * image_strip_suffix (struct image *image)
 Strip dot suffix from image name, if present. More...
 
int image_set_cmdline (struct image *image, const char *cmdline)
 Set image command line. More...
 
int image_set_len (struct image *image, size_t len)
 Set image length. More...
 
int image_set_data (struct image *image, const void *data, size_t len)
 Set image data. More...
 
static int image_probe (struct image *image)
 Determine image type. More...
 
int register_image (struct image *image)
 Register executable image. More...
 
void unregister_image (struct image *image)
 Unregister executable image. More...
 
struct imagefind_image (const char *name)
 Find image by name. More...
 
struct imagefind_image_tag (struct image_tag *tag)
 Find image by tag. More...
 
int image_exec (struct image *image)
 Execute image. More...
 
int image_replace (struct image *replacement)
 Set replacement image. More...
 
int image_select (struct image *image)
 Select image for execution. More...
 
int image_set_trust (int require_trusted, int permanent)
 Change image trust requirement. More...
 
struct imageimage_memory (const char *name, const void *data, size_t len)
 Create registered image from block of memory. More...
 
const char * image_argument (struct image *image, const char *key)
 Find argument within image command line. More...
 

Variables

struct list_head images = LIST_HEAD_INIT ( images )
 List of registered images. More...
 
struct image_tag selected_image __image_tag
 Image selected for execution. More...
 
static int require_trusted_images = 0
 Current image trust requirement. More...
 
static int require_trusted_images_permanent = 0
 Prevent changes to image trust requirement. More...
 

Detailed Description

Executable images.

Definition in file image.c.

Macro Definition Documentation

◆ EACCES_UNTRUSTED

#define EACCES_UNTRUSTED   __einfo_error ( EINFO_EACCES_UNTRUSTED )

Definition at line 48 of file image.c.

◆ EINFO_EACCES_UNTRUSTED

#define EINFO_EACCES_UNTRUSTED   __einfo_uniqify ( EINFO_EACCES, 0x01, "Untrusted image" )

Definition at line 50 of file image.c.

◆ EACCES_PERMANENT

#define EACCES_PERMANENT   __einfo_error ( EINFO_EACCES_PERMANENT )

Definition at line 52 of file image.c.

◆ EINFO_EACCES_PERMANENT

#define EINFO_EACCES_PERMANENT   __einfo_uniqify ( EINFO_EACCES, 0x02, "Trust requirement is permanent" )

Definition at line 54 of file image.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ free_image()

void free_image ( struct refcnt refcnt)

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 85 of file image.c.

85  {
86  struct image *image = container_of ( refcnt, struct image, refcnt );
87  struct image_tag *tag;
88 
89  /* Sanity check: free_image() should not be called directly on
90  * dynamically allocated images.
91  */
92  assert ( refcnt->count < 0 );
93  DBGC ( image, "IMAGE %s freed\n", image->name );
94 
95  /* Clear any tag weak references */
97  if ( tag->image == image )
98  tag->image = NULL;
99  }
100 
101  /* Free dynamic allocations used by both static and dynamic images */
102  free ( image->cmdline );
103  uri_put ( image->uri );
105 
106  /* Free image name, if dynamically allocated */
107  if ( ! ( image->flags & IMAGE_STATIC_NAME ) )
108  free ( image->name );
109 
110  /* Free image data and image itself, if dynamically allocated */
111  if ( ! ( image->flags & IMAGE_STATIC ) ) {
112  ufree ( image->rwdata );
113  free ( image );
114  }
115 }
static __always_inline void ufree(void *ptr)
Free external memory.
Definition: umalloc.h:67
unsigned int flags
Flags.
Definition: image.h:39
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
An image tag.
Definition: image.h:172
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:23
char * cmdline
Command line to pass to image.
Definition: image.h:42
A reference counter.
Definition: refcnt.h:26
int count
Current reference count.
Definition: refcnt.h:32
#define IMAGE_STATIC
Image is statically allocated.
Definition: image.h:88
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define IMAGE_TAGS
Image tag table.
Definition: image.h:180
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
struct uri * uri
URI of image.
Definition: image.h:31
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:249
void * rwdata
Writable data.
Definition: image.h:52
#define IMAGE_STATIC_NAME
Image name is statically allocated.
Definition: image.h:91
struct image * replacement
Replacement image.
Definition: image.h:72
uint64_t tag
Identity tag.
Definition: edd.h:30
char * name
Name.
Definition: image.h:37
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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)

Allocate executable image.

Parameters
uriURI, or NULL
Return values
imageExecutable image

Definition at line 123 of file image.c.

123  {
124  struct image *image;
125  int rc;
126 
127  /* Allocate image */
128  image = zalloc ( sizeof ( *image ) );
129  if ( ! image )
130  goto err_alloc;
131 
132  /* Initialise image */
134  if ( uri && ( ( rc = image_set_uri ( image, uri ) ) != 0 ) )
135  goto err_set_uri;
136 
137  return image;
138 
139  err_set_uri:
140  image_put ( image );
141  err_alloc:
142  return NULL;
143 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int image_set_uri(struct image *image, struct uri *uri)
Set image URI.
Definition: image.c:152
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
An executable image.
Definition: image.h:23
void free_image(struct refcnt *refcnt)
Free executable image.
Definition: image.c:85
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:249
A Uniform Resource Identifier.
Definition: uri.h:64
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct refcnt refcnt
Reference count.
Definition: image.h:25

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 
)

Set image URI.

Parameters
imageImage
uriNew image URI
Return values
rcReturn status code

Definition at line 152 of file image.c.

152  {
153  const char *name;
154  int rc;
155 
156  /* Set name, if image does not already have one */
157  if ( ! ( image->name && image->name[0] ) ) {
158  name = ( uri->path ? uri->path : uri->opaque );
159  if ( name ) {
160  name = basename ( ( char * ) name );
161  if ( ( rc = image_set_name ( image, name ) ) != 0 )
162  return rc;
163  }
164  }
165 
166  /* Update image URI */
167  uri_put ( image->uri );
168  image->uri = uri_get ( uri );
169 
170  return 0;
171 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
static struct uri * uri_get(struct uri *uri)
Increment URI reference count.
Definition: uri.h:194
An executable image.
Definition: image.h:23
const char * path
Path (after URI decoding)
Definition: uri.h:80
char * basename(char *path)
Return base name from path.
Definition: basename.c:42
int image_set_name(struct image *image, const char *name)
Set image name.
Definition: image.c:180
struct uri * uri
URI of image.
Definition: image.h:31
const char * opaque
Opaque part.
Definition: uri.h:70
A Uniform Resource Identifier.
Definition: uri.h:64
char * name
Name.
Definition: image.h:37

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 
)

Set image name.

Parameters
imageImage
nameNew image name
Return values
rcReturn status code

Definition at line 180 of file image.c.

180  {
181  char *name_copy;
182 
183  /* Duplicate name */
184  name_copy = strdup ( name );
185  if ( ! name_copy )
186  return -ENOMEM;
187 
188  /* Free existing name, if not statically allocated */
189  if ( ! ( image->flags & IMAGE_STATIC_NAME ) )
190  free ( image->name );
191 
192  /* Replace existing name */
193  image->name = name_copy;
195 
196  return 0;
197 }
unsigned int flags
Flags.
Definition: image.h:39
const char * name
Definition: ath9k_hw.c:1984
An executable image.
Definition: image.h:23
#define ENOMEM
Not enough space.
Definition: errno.h:534
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
char * strdup(const char *src)
Duplicate string.
Definition: string.c:393
#define IMAGE_STATIC_NAME
Image name is statically allocated.
Definition: image.h:91
char * name
Name.
Definition: image.h:37

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)

Strip dot suffix from image name, if present.

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

Definition at line 205 of file image.c.

205  {
206  char *dot;
207 
208  /* Locate and strip suffix, if present */
209  if ( image->name &&
210  ( ( dot = strrchr ( image->name, '.' ) ) != NULL ) ) {
211  *dot = '\0';
212  return dot;
213  }
214 
215  return NULL;
216 }
char * strrchr(const char *src, int character)
Find rightmost character within a string.
Definition: string.c:289
An executable image.
Definition: image.h:23
char * name
Name.
Definition: image.h:37
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 
)

Set image command line.

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

Definition at line 225 of file image.c.

225  {
226 
227  free ( image->cmdline );
228  image->cmdline = NULL;
229  if ( cmdline ) {
230  image->cmdline = strdup ( cmdline );
231  if ( ! image->cmdline )
232  return -ENOMEM;
233  }
234  return 0;
235 }
An executable image.
Definition: image.h:23
char * cmdline
Command line to pass to image.
Definition: image.h:42
#define ENOMEM
Not enough space.
Definition: errno.h:534
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
char * strdup(const char *src)
Duplicate string.
Definition: string.c:393
uint32_t cmdline
Definition: multiboot.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 
)

Set image length.

Parameters
imageImage
lenLength of image data
Return values
rcReturn status code

Definition at line 244 of file image.c.

244  {
245  void *new;
246 
247  /* Refuse to reallocate static images */
248  if ( image->flags & IMAGE_STATIC )
249  return -ENOTTY;
250 
251  /* (Re)allocate image data */
252  new = urealloc ( image->rwdata, len );
253  if ( ! new )
254  return -ENOMEM;
255  image->rwdata = new;
256  image->len = len;
257 
258  return 0;
259 }
unsigned int flags
Flags.
Definition: image.h:39
An executable image.
Definition: image.h:23
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define IMAGE_STATIC
Image is statically allocated.
Definition: image.h:88
ring len
Length.
Definition: dwmac.h:231
size_t len
Length of raw file image.
Definition: image.h:55
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
void * rwdata
Writable data.
Definition: image.h:52
void * urealloc(void *ptr, size_t new_size)
Reallocate external memory.

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 
)

Set image data.

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

Definition at line 269 of file image.c.

269  {
270  int rc;
271 
272  /* Set image length */
273  if ( ( rc = image_set_len ( image, len ) ) != 0 )
274  return rc;
275 
276  /* Copy in new image data */
277  memcpy ( image->rwdata, data, len );
278 
279  return 0;
280 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An executable image.
Definition: image.h:23
void * memcpy(void *dest, const void *src, size_t len) __nonnull
ring len
Length.
Definition: dwmac.h:231
int image_set_len(struct image *image, size_t len)
Set image length.
Definition: image.c:244
void * rwdata
Writable data.
Definition: image.h:52
uint8_t data[48]
Additional event data.
Definition: ena.h:22

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

Referenced by image_memory(), and zimg_extract().

◆ image_probe()

static int image_probe ( struct image image)
static

Determine image type.

Parameters
imageExecutable image
Return values
rcReturn status code

Definition at line 288 of file image.c.

288  {
289  struct image_type *type;
290  int rc;
291 
292  /* Try each type in turn */
294  if ( ( rc = type->probe ( image ) ) == 0 ) {
295  image->type = type;
296  DBGC ( image, "IMAGE %s is %s\n",
297  image->name, type->name );
298  return 0;
299  }
300  DBGC ( image, "IMAGE %s is not %s: %s\n", image->name,
301  type->name, strerror ( rc ) );
302  }
303 
304  DBGC ( image, "IMAGE %s format not recognised\n", image->name );
305  return -ENOTSUP;
306 }
#define IMAGE_TYPES
Executable image type table.
Definition: image.h:166
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct image_type * type
Image type, if known.
Definition: image.h:58
uint32_t type
Operating system type.
Definition: ena.h:12
#define DBGC(...)
Definition: compiler.h:505
An executable image type.
Definition: image.h:94
An executable image.
Definition: image.h:23
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
char * name
Name.
Definition: image.h:37

References DBGC, ENOTSUP, for_each_table_entry, IMAGE_TYPES, image::name, rc, strerror(), type, and image::type.

Referenced by register_image().

◆ register_image()

int register_image ( struct image image)

Register executable image.

Parameters
imageExecutable image
Return values
rcReturn status code

Definition at line 314 of file image.c.

314  {
315  static unsigned int imgindex = 0;
316  char name[8]; /* "imgXXXX" */
317  int rc;
318 
319  /* Sanity checks */
320  if ( image->flags & IMAGE_STATIC ) {
321  assert ( ( image->name == NULL ) ||
322  ( image->flags & IMAGE_STATIC_NAME ) );
323  assert ( image->cmdline == NULL );
324  }
325 
326  /* Create image name if it doesn't already have one */
327  if ( ! image->name ) {
328  snprintf ( name, sizeof ( name ), "img%d", imgindex++ );
329  if ( ( rc = image_set_name ( image, name ) ) != 0 )
330  return rc;
331  }
332 
333  /* Add to image list */
334  image_get ( image );
336  list_add_tail ( &image->list, &images );
337  DBGC ( image, "IMAGE %s at [%lx,%lx) registered\n",
338  image->name, virt_to_phys ( image->data ),
339  ( virt_to_phys ( image->data ) + image->len ) );
340 
341  /* Try to detect image type, if applicable. Ignore failures,
342  * since we expect to handle some unrecognised images
343  * (e.g. kernel initrds, multiboot modules, random files
344  * provided via our EFI virtual filesystem, etc).
345  */
346  if ( ! image->type )
347  image_probe ( image );
348 
349  return 0;
350 }
unsigned int flags
Flags.
Definition: image.h:39
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
const void * data
Read-only data.
Definition: image.h:50
struct image_type * type
Image type, if known.
Definition: image.h:58
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition: image.h:239
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:23
char * cmdline
Command line to pass to image.
Definition: image.h:42
static int image_probe(struct image *image)
Determine image type.
Definition: image.c:288
#define IMAGE_STATIC
Image is statically allocated.
Definition: image.h:88
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
#define IMAGE_REGISTERED
Image is registered.
Definition: image.h:76
size_t len
Length of raw file image.
Definition: image.h:55
struct list_head images
List of registered images.
Definition: image.c:58
int image_set_name(struct image *image, const char *name)
Set image name.
Definition: image.c:180
#define IMAGE_STATIC_NAME
Image name is statically allocated.
Definition: image.h:91
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
struct list_head list
List of registered images.
Definition: image.h:28
char * name
Name.
Definition: image.h:37
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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)

Unregister executable image.

Parameters
imageExecutable image

Definition at line 357 of file image.c.

357  {
358 
359  /* Do nothing unless image is registered */
360  if ( ! ( image->flags & IMAGE_REGISTERED ) )
361  return;
362 
363  DBGC ( image, "IMAGE %s unregistered\n", image->name );
364  list_del ( &image->list );
366  image_put ( image );
367 }
unsigned int flags
Flags.
Definition: image.h:39
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:23
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define IMAGE_REGISTERED
Image is registered.
Definition: image.h:76
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:249
struct list_head list
List of registered images.
Definition: image.h:28
char * name
Name.
Definition: image.h:37

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)

Find image by name.

Parameters
nameImage name
Return values
imageExecutable image, or NULL

Definition at line 375 of file image.c.

375  {
376  struct image *image;
377 
378  for_each_image ( image ) {
379  if ( strcmp ( image->name, name ) == 0 )
380  return image;
381  }
382 
383  return NULL;
384 }
const char * name
Definition: ath9k_hw.c:1984
An executable image.
Definition: image.h:23
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:190
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:173
char * name
Name.
Definition: image.h:37
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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)

Find image by tag.

Parameters
tagImage tag
Return values
imageExecutable image, or NULL

Definition at line 392 of file image.c.

392  {
393  struct image *image;
394 
395  for_each_image ( image ) {
396  if ( tag->image == image )
397  return image;
398  }
399 
400  return NULL;
401 }
An executable image.
Definition: image.h:23
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:190
uint64_t tag
Identity tag.
Definition: edd.h:30
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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)

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 413 of file image.c.

413  {
414  struct image *saved_current_image;
415  struct image *replacement = NULL;
416  struct uri *old_cwuri;
417  int rc;
418 
419  /* Sanity check */
421 
422  /* Switch current working directory to be that of the image
423  * itself, if applicable
424  */
425  old_cwuri = uri_get ( cwuri );
426  if ( image->uri )
427  churi ( image->uri );
428 
429  /* Set as currently running image */
430  saved_current_image = image_tag ( image, &current_image );
431 
432  /* Take out a temporary reference to the image, so that it
433  * does not get freed when temporarily unregistered.
434  */
435  image_get ( image );
436 
437  /* Check that this image can be executed */
438  if ( ! ( image->type && image->type->exec ) ) {
439  rc = -ENOEXEC;
440  goto err;
441  }
442 
443  /* Check that image is trusted (if applicable) */
444  if ( require_trusted_images && ! ( image->flags & IMAGE_TRUSTED ) ) {
445  DBGC ( image, "IMAGE %s is not trusted\n", image->name );
446  rc = -EACCES_UNTRUSTED;
447  goto err;
448  }
449 
450  /* Record boot attempt */
451  syslog ( LOG_NOTICE, "Executing \"%s\"\n", image->name );
452 
453  /* Temporarily unregister the image during its execution */
455 
456  /* Try executing the image */
457  if ( ( rc = image->type->exec ( image ) ) != 0 ) {
458  DBGC ( image, "IMAGE %s could not execute: %s\n",
459  image->name, strerror ( rc ) );
460  /* Do not return yet; we still have clean-up to do */
461  }
462 
463  /* Record result of boot attempt */
464  if ( rc == 0 ) {
465  syslog ( LOG_NOTICE, "Execution of \"%s\" completed\n",
466  image->name );
467  } else {
468  syslog ( LOG_ERR, "Execution of \"%s\" failed: %s\n",
469  image->name, strerror ( rc ) );
470  }
471 
472  /* Re-register image (unless due to be replaced) */
473  if ( ! image->replacement )
474  register_image ( image );
475 
476  /* Pick up replacement image before we drop the original
477  * image's temporary reference. The replacement image must
478  * already be registered, so we don't need to hold a temporary
479  * reference (which would complicate the tail-recursion).
480  */
482  if ( replacement )
483  assert ( replacement->flags & IMAGE_REGISTERED );
484 
485  /* Clear any recorded replacement image */
488 
489  err:
490  /* Unregister image if applicable */
493 
494  /* Debug message for tail-recursion. Placed here because the
495  * image_put() may end up freeing the image.
496  */
497  if ( replacement ) {
498  DBGC ( image, "IMAGE %s replacing self with IMAGE %s\n",
499  image->name, replacement->name );
500  }
501 
502  /* Drop temporary reference to the original image */
503  image_put ( image );
504 
505  /* Restore previous currently-running image */
506  image_tag ( saved_current_image, &current_image );
507 
508  /* Reset current working directory */
509  churi ( old_cwuri );
510  uri_put ( old_cwuri );
511 
512  /* Tail-recurse into replacement image, if one exists */
513  if ( replacement )
514  return image_exec ( replacement );
515 
516  return rc;
517 }
unsigned int flags
Flags.
Definition: image.h:39
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
static struct uri * uri_get(struct uri *uri)
Increment URI reference count.
Definition: uri.h:194
#define EACCES_UNTRUSTED
Definition: image.c:48
#define ENOEXEC
Exec format error.
Definition: errno.h:519
struct image_type * type
Image type, if known.
Definition: image.h:58
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition: image.h:239
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:23
#define LOG_ERR
Error: error conditions.
Definition: syslog.h:35
#define IMAGE_AUTO_UNREGISTER
Image will be automatically unregistered after execution.
Definition: image.h:82
int(* exec)(struct image *image)
Execute image.
Definition: image.h:112
int image_exec(struct image *image)
Execute image.
Definition: image.c:413
struct image_tag current_image
void churi(struct uri *uri)
Change working URI.
Definition: cwuri.c:45
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
const char * replacement
Definition: editstring.h:53
#define IMAGE_REGISTERED
Image is registered.
Definition: image.h:76
int register_image(struct image *image)
Register executable image.
Definition: image.c:314
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define IMAGE_TRUSTED
Image is trusted.
Definition: image.h:79
struct uri * uri
URI of image.
Definition: image.h:31
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:249
void unregister_image(struct image *image)
Unregister executable image.
Definition: image.c:357
#define syslog(priority, fmt,...)
Write message to system log.
Definition: syslog.h:93
struct image * replacement
Replacement image.
Definition: image.h:72
A Uniform Resource Identifier.
Definition: uri.h:64
static int require_trusted_images
Current image trust requirement.
Definition: image.c:71
struct uri * cwuri
Current working URI.
Definition: cwuri.c:38
static struct image * image_tag(struct image *image, struct image_tag *tag)
Tag image.
Definition: image.h:296
char * name
Name.
Definition: image.h:37
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define LOG_NOTICE
Notice: normal but significant conditions.
Definition: syslog.h:41

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(), replacement, image::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)

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 528 of file image.c.

528  {
529  struct image *image = current_image.image;
530  int rc;
531 
532  /* Sanity check */
533  assert ( replacement->flags & IMAGE_REGISTERED );
534 
535  /* Fail unless there is a currently-executing image */
536  if ( ! image ) {
537  rc = -ENOTTY;
538  DBGC ( replacement, "IMAGE %s cannot replace non-existent "
539  "image: %s\n", replacement->name, strerror ( rc ) );
540  return rc;
541  }
542 
543  /* Check that the replacement image can be executed */
544  if ( ! ( replacement->type && replacement->type->exec ) )
545  return -ENOEXEC;
546 
547  /* Clear any existing replacement */
549 
550  /* Set replacement */
552  DBGC ( image, "IMAGE %s will replace self with IMAGE %s\n",
553  image->name, replacement->name );
554 
555  return 0;
556 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define ENOEXEC
Exec format error.
Definition: errno.h:519
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition: image.h:239
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:23
struct image * image
Image (weak reference, nullified when image is freed)
Definition: image.h:176
struct image_tag current_image
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
const char * replacement
Definition: editstring.h:53
#define IMAGE_REGISTERED
Image is registered.
Definition: image.h:76
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:249
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
struct image * replacement
Replacement image.
Definition: image.h:72
char * name
Name.
Definition: image.h:37

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

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

◆ image_select()

int image_select ( struct image image)

Select image for execution.

Parameters
imageExecutable image
Return values
rcReturn status code

Definition at line 564 of file image.c.

564  {
565 
566  /* Check that this image can be executed */
567  if ( ! ( image->type && image->type->exec ) )
568  return -ENOEXEC;
569 
570  /* Mark image as selected */
572 
573  return 0;
574 }
struct image_tag selected_image
#define ENOEXEC
Exec format error.
Definition: errno.h:519
struct image_type * type
Image type, if known.
Definition: image.h:58
An executable image.
Definition: image.h:23
int(* exec)(struct image *image)
Execute image.
Definition: image.h:112
static struct image * image_tag(struct image *image, struct image_tag *tag)
Tag image.
Definition: image.h:296

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 
)

Change image trust requirement.

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

Definition at line 583 of file image.c.

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

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 
)

Create registered image from block of memory.

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

Definition at line 608 of file image.c.

609  {
610  struct image *image;
611  int rc;
612 
613  /* Allocate image */
614  image = alloc_image ( NULL );
615  if ( ! image ) {
616  rc = -ENOMEM;
617  goto err_alloc_image;
618  }
619 
620  /* Set name */
621  if ( ( rc = image_set_name ( image, name ) ) != 0 )
622  goto err_set_name;
623 
624  /* Set data */
625  if ( ( rc = image_set_data ( image, data, len ) ) != 0 )
626  goto err_set_data;
627 
628  /* Register image */
629  if ( ( rc = register_image ( image ) ) != 0 )
630  goto err_register;
631 
632  /* Drop local reference to image */
633  image_put ( image );
634 
635  return image;
636 
637  err_register:
638  err_set_data:
639  err_set_name:
640  image_put ( image );
641  err_alloc_image:
642  return NULL;
643 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
An executable image.
Definition: image.h:23
#define ENOMEM
Not enough space.
Definition: errno.h:534
ring len
Length.
Definition: dwmac.h:231
int register_image(struct image *image)
Register executable image.
Definition: image.c:314
int image_set_name(struct image *image, const char *name)
Set image name.
Definition: image.c:180
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:249
int image_set_data(struct image *image, const void *data, size_t len)
Set image data.
Definition: image.c:269
uint8_t data[48]
Additional event data.
Definition: ena.h:22
struct image * alloc_image(struct uri *uri)
Allocate executable image.
Definition: image.c:123
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 
)

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 652 of file image.c.

652  {
653  const char *cmdline = image->cmdline;
654  const char *search;
655  const char *match;
656  const char *next;
657 
658  /* Find argument */
659  for ( search = cmdline ; search ; search = next ) {
660 
661  /* Find next occurrence, if any */
662  match = strstr ( search, key );
663  if ( ! match )
664  break;
665  next = ( match + strlen ( key ) );
666 
667  /* Check preceding delimiter, if any */
668  if ( ( match == cmdline ) || isspace ( match[-1] ) )
669  return next;
670  }
671 
672  return NULL;
673 }
An executable image.
Definition: image.h:23
char * cmdline
Command line to pass to image.
Definition: image.h:42
char * strstr(const char *haystack, const char *needle)
Find substring.
Definition: string.c:309
int isspace(int character)
Check to see if character is a space.
Definition: ctype.c:41
size_t strlen(const char *src)
Get length of string.
Definition: string.c:243
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
uint32_t cmdline
Definition: multiboot.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
union @391 key
Sense key.
Definition: scsi.h:17

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

Referenced by bzimage_parse_cmdline(), and cpio_parse_cmdline().

Variable Documentation

◆ images

struct list_head images = LIST_HEAD_INIT ( images )

List of registered images.

Definition at line 58 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().

◆ __image_tag

struct image_tag current_image __image_tag
Initial value:
= {
.name = "SELECTED",
}

Image selected for execution.

The downloaded flattened device tree tag.

Currently-executing image.

Definition at line 61 of file image.c.

◆ require_trusted_images

int require_trusted_images = 0
static

Current image trust requirement.

Definition at line 71 of file image.c.

Referenced by image_exec(), and image_set_trust().

◆ require_trusted_images_permanent

int require_trusted_images_permanent = 0
static

Prevent changes to image trust requirement.

Definition at line 74 of file image.c.

Referenced by image_set_trust().