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/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)
 
static 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, userptr_t 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, userptr_t 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 47 of file image.c.

◆ EINFO_EACCES_UNTRUSTED

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

Definition at line 49 of file image.c.

◆ EACCES_PERMANENT

#define EACCES_PERMANENT   __einfo_error ( EINFO_EACCES_PERMANENT )

Definition at line 51 of file image.c.

◆ EINFO_EACCES_PERMANENT

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

Definition at line 53 of file image.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ free_image()

static void free_image ( struct refcnt refcnt)
static

Free executable image.

Parameters
refcntReference counter

Definition at line 80 of file image.c.

80  {
81  struct image *image = container_of ( refcnt, struct image, refcnt );
82  struct image_tag *tag;
83 
84  DBGC ( image, "IMAGE %s freed\n", image->name );
86  if ( tag->image == image )
87  tag->image = NULL;
88  }
89  free ( image->name );
90  free ( image->cmdline );
91  uri_put ( image->uri );
92  ufree ( image->data );
94  free ( image );
95 }
userptr_t data
Raw file image.
Definition: image.h:41
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
An image tag.
Definition: image.h:154
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
char * cmdline
Command line to pass to image.
Definition: image.h:39
A reference counter.
Definition: refcnt.h:26
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define IMAGE_TAGS
Image tag table.
Definition: image.h:162
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:32
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:229
static __always_inline void ufree(userptr_t userptr)
Free external memory.
Definition: umalloc.h:65
struct image * replacement
Replacement image.
Definition: image.h:60
uint64_t tag
Identity tag.
Definition: edd.h:30
char * name
Name.
Definition: image.h:34
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References image::cmdline, container_of, image::data, DBGC, for_each_table_entry, free, image_put(), IMAGE_TAGS, image::name, NULL, image::replacement, tag, ufree(), image::uri, and uri_put().

Referenced by alloc_image().

◆ alloc_image()

struct image* alloc_image ( struct uri uri)

Allocate executable image.

Parameters
uriURI, or NULL
Return values
imageExecutable image

Definition at line 103 of file image.c.

103  {
104  struct image *image;
105  int rc;
106 
107  /* Allocate image */
108  image = zalloc ( sizeof ( *image ) );
109  if ( ! image )
110  goto err_alloc;
111 
112  /* Initialise image */
114  if ( uri && ( ( rc = image_set_uri ( image, uri ) ) != 0 ) )
115  goto err_set_uri;
116 
117  return image;
118 
119  err_set_uri:
120  image_put ( image );
121  err_alloc:
122  return NULL;
123 }
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:132
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
An executable image.
Definition: image.h:24
static void free_image(struct refcnt *refcnt)
Free executable image.
Definition: image.c:80
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:229
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:26

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

Referenced by 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 132 of file image.c.

132  {
133  const char *name;
134  int rc;
135 
136  /* Set name, if image does not already have one */
137  if ( ! ( image->name && image->name[0] ) ) {
138  name = ( uri->path ? uri->path : uri->opaque );
139  if ( name ) {
140  name = basename ( ( char * ) name );
141  if ( ( rc = image_set_name ( image, name ) ) != 0 )
142  return rc;
143  }
144  }
145 
146  /* Update image URI */
147  uri_put ( image->uri );
148  image->uri = uri_get ( uri );
149 
150  return 0;
151 }
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:24
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:160
struct uri * uri
URI of image.
Definition: image.h:32
const char * opaque
Opaque part.
Definition: uri.h:70
A Uniform Resource Identifier.
Definition: uri.h:64
char * name
Name.
Definition: image.h:34

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

160  {
161  char *name_copy;
162 
163  /* Duplicate name */
164  name_copy = strdup ( name );
165  if ( ! name_copy )
166  return -ENOMEM;
167 
168  /* Replace existing name */
169  free ( image->name );
170  image->name = name_copy;
171 
172  return 0;
173 }
const char * name
Definition: ath9k_hw.c:1984
An executable image.
Definition: image.h:24
#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
char * name
Name.
Definition: image.h:34

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

Referenced by cms_decrypt(), 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 181 of file image.c.

181  {
182  char *dot;
183 
184  /* Locate and strip suffix, if present */
185  if ( image->name &&
186  ( ( dot = strrchr ( image->name, '.' ) ) != NULL ) ) {
187  *dot = '\0';
188  return dot;
189  }
190 
191  return NULL;
192 }
char * strrchr(const char *src, int character)
Find rightmost character within a string.
Definition: string.c:289
An executable image.
Definition: image.h:24
char * name
Name.
Definition: image.h:34
#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 201 of file image.c.

201  {
202 
203  free ( image->cmdline );
204  image->cmdline = NULL;
205  if ( cmdline ) {
206  image->cmdline = strdup ( cmdline );
207  if ( ! image->cmdline )
208  return -ENOMEM;
209  }
210  return 0;
211 }
An executable image.
Definition: image.h:24
char * cmdline
Command line to pass to image.
Definition: image.h:39
#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 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 220 of file image.c.

220  {
221  userptr_t new;
222 
223  /* (Re)allocate image data */
224  new = urealloc ( image->data, len );
225  if ( ! new )
226  return -ENOMEM;
227  image->data = new;
228  image->len = len;
229 
230  return 0;
231 }
userptr_t data
Raw file image.
Definition: image.h:41
An executable image.
Definition: image.h:24
#define ENOMEM
Not enough space.
Definition: errno.h:534
uint32_t userptr_t
A pointer to a user buffer.
Definition: libkir.h:159
userptr_t urealloc(userptr_t userptr, size_t new_size)
Reallocate external memory.
size_t len
Length of raw file image.
Definition: image.h:43
uint32_t len
Length.
Definition: ena.h:14

References image::data, ENOMEM, len, image::len, and urealloc().

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

◆ image_set_data()

int image_set_data ( struct image image,
userptr_t  data,
size_t  len 
)

Set image data.

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

Definition at line 241 of file image.c.

241  {
242  int rc;
243 
244  /* Set image length */
245  if ( ( rc = image_set_len ( image, len ) ) != 0 )
246  return rc;
247 
248  /* Copy in new image data */
249  memcpy_user ( image->data, 0, data, 0, len );
250 
251  return 0;
252 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
userptr_t data
Raw file image.
Definition: image.h:41
An executable image.
Definition: image.h:24
int image_set_len(struct image *image, size_t len)
Set image length.
Definition: image.c:220
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14
void memcpy_user(userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
Copy data between user buffers.

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

Referenced by image_memory().

◆ image_probe()

static int image_probe ( struct image image)
static

Determine image type.

Parameters
imageExecutable image
Return values
rcReturn status code

Definition at line 260 of file image.c.

260  {
261  struct image_type *type;
262  int rc;
263 
264  /* Try each type in turn */
266  if ( ( rc = type->probe ( image ) ) == 0 ) {
267  image->type = type;
268  DBGC ( image, "IMAGE %s is %s\n",
269  image->name, type->name );
270  return 0;
271  }
272  DBGC ( image, "IMAGE %s is not %s: %s\n", image->name,
273  type->name, strerror ( rc ) );
274  }
275 
276  DBGC ( image, "IMAGE %s format not recognised\n", image->name );
277  return -ENOTSUP;
278 }
#define IMAGE_TYPES
Executable image type table.
Definition: image.h:148
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct image_type * type
Image type, if known.
Definition: image.h:46
uint32_t type
Operating system type.
Definition: ena.h:12
#define DBGC(...)
Definition: compiler.h:505
An executable image type.
Definition: image.h:76
An executable image.
Definition: image.h:24
#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:34

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

286  {
287  static unsigned int imgindex = 0;
288  char name[8]; /* "imgXXXX" */
289  int rc;
290 
291  /* Create image name if it doesn't already have one */
292  if ( ! image->name ) {
293  snprintf ( name, sizeof ( name ), "img%d", imgindex++ );
294  if ( ( rc = image_set_name ( image, name ) ) != 0 )
295  return rc;
296  }
297 
298  /* Add to image list */
299  image_get ( image );
301  list_add_tail ( &image->list, &images );
302  DBGC ( image, "IMAGE %s at [%lx,%lx) registered\n",
303  image->name, user_to_phys ( image->data, 0 ),
304  user_to_phys ( image->data, image->len ) );
305 
306  /* Try to detect image type, if applicable. Ignore failures,
307  * since we expect to handle some unrecognised images
308  * (e.g. kernel initrds, multiboot modules, random files
309  * provided via our EFI virtual filesystem, etc).
310  */
311  if ( ! image->type )
312  image_probe ( image );
313 
314  return 0;
315 }
unsigned int flags
Flags.
Definition: image.h:36
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
userptr_t data
Raw file image.
Definition: image.h:41
struct image_type * type
Image type, if known.
Definition: image.h:46
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition: image.h:219
unsigned long user_to_phys(userptr_t userptr, off_t offset)
Convert user pointer to physical address.
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
static int image_probe(struct image *image)
Determine image type.
Definition: image.c:260
#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:64
size_t len
Length of raw file image.
Definition: image.h:43
struct list_head images
List of registered images.
Definition: image.c:57
int image_set_name(struct image *image, const char *name)
Set image name.
Definition: image.c:160
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:29
char * name
Name.
Definition: image.h:34

References image::data, DBGC, image::flags, image_get(), image_probe(), IMAGE_REGISTERED, image_set_name(), images, image::len, image::list, list_add_tail, image::name, name, rc, snprintf(), image::type, and user_to_phys().

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

322  {
323 
324  /* Do nothing unless image is registered */
325  if ( ! ( image->flags & IMAGE_REGISTERED ) )
326  return;
327 
328  DBGC ( image, "IMAGE %s unregistered\n", image->name );
329  list_del ( &image->list );
331  image_put ( image );
332 }
unsigned int flags
Flags.
Definition: image.h:36
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define IMAGE_REGISTERED
Image is registered.
Definition: image.h:64
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:229
struct list_head list
List of registered images.
Definition: image.h:29
char * name
Name.
Definition: image.h:34

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(), 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 340 of file image.c.

340  {
341  struct image *image;
342 
343  for_each_image ( image ) {
344  if ( strcmp ( image->name, name ) == 0 )
345  return image;
346  }
347 
348  return NULL;
349 }
const char * name
Definition: ath9k_hw.c:1984
An executable image.
Definition: image.h:24
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:173
char * name
Name.
Definition: image.h:34
#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 357 of file image.c.

357  {
358  struct image *image;
359 
360  for_each_image ( image ) {
361  if ( tag->image == image )
362  return image;
363  }
364 
365  return NULL;
366 }
An executable image.
Definition: image.h:24
#define for_each_image(image)
Iterate over all registered images.
Definition: image.h:172
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(), 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 378 of file image.c.

378  {
379  struct image *saved_current_image;
380  struct image *replacement = NULL;
381  struct uri *old_cwuri;
382  int rc;
383 
384  /* Sanity check */
386 
387  /* Switch current working directory to be that of the image
388  * itself, if applicable
389  */
390  old_cwuri = uri_get ( cwuri );
391  if ( image->uri )
392  churi ( image->uri );
393 
394  /* Set as currently running image */
395  saved_current_image = image_tag ( image, &current_image );
396 
397  /* Take out a temporary reference to the image, so that it
398  * does not get freed when temporarily unregistered.
399  */
400  image_get ( image );
401 
402  /* Check that this image can be executed */
403  if ( ! ( image->type && image->type->exec ) ) {
404  rc = -ENOEXEC;
405  goto err;
406  }
407 
408  /* Check that image is trusted (if applicable) */
409  if ( require_trusted_images && ! ( image->flags & IMAGE_TRUSTED ) ) {
410  DBGC ( image, "IMAGE %s is not trusted\n", image->name );
411  rc = -EACCES_UNTRUSTED;
412  goto err;
413  }
414 
415  /* Record boot attempt */
416  syslog ( LOG_NOTICE, "Executing \"%s\"\n", image->name );
417 
418  /* Temporarily unregister the image during its execution */
420 
421  /* Try executing the image */
422  if ( ( rc = image->type->exec ( image ) ) != 0 ) {
423  DBGC ( image, "IMAGE %s could not execute: %s\n",
424  image->name, strerror ( rc ) );
425  /* Do not return yet; we still have clean-up to do */
426  }
427 
428  /* Record result of boot attempt */
429  if ( rc == 0 ) {
430  syslog ( LOG_NOTICE, "Execution of \"%s\" completed\n",
431  image->name );
432  } else {
433  syslog ( LOG_ERR, "Execution of \"%s\" failed: %s\n",
434  image->name, strerror ( rc ) );
435  }
436 
437  /* Re-register image (unless due to be replaced) */
438  if ( ! image->replacement )
439  register_image ( image );
440 
441  /* Pick up replacement image before we drop the original
442  * image's temporary reference. The replacement image must
443  * already be registered, so we don't need to hold a temporary
444  * reference (which would complicate the tail-recursion).
445  */
447  if ( replacement )
448  assert ( replacement->flags & IMAGE_REGISTERED );
449 
450  err:
451  /* Unregister image if applicable */
454 
455  /* Debug message for tail-recursion. Placed here because the
456  * image_put() may end up freeing the image.
457  */
458  if ( replacement ) {
459  DBGC ( image, "IMAGE %s replacing self with IMAGE %s\n",
460  image->name, replacement->name );
461  }
462 
463  /* Drop temporary reference to the original image */
464  image_put ( image );
465 
466  /* Restore previous currently-running image */
467  image_tag ( saved_current_image, &current_image );
468 
469  /* Reset current working directory */
470  churi ( old_cwuri );
471  uri_put ( old_cwuri );
472 
473  /* Tail-recurse into replacement image, if one exists */
474  if ( replacement )
475  return image_exec ( replacement );
476 
477  return rc;
478 }
unsigned int flags
Flags.
Definition: image.h:36
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:47
#define ENOEXEC
Exec format error.
Definition: errno.h:519
struct image_type * type
Image type, if known.
Definition: image.h:46
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition: image.h:219
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
#define LOG_ERR
Error: error conditions.
Definition: syslog.h:35
#define IMAGE_AUTO_UNREGISTER
Image will be automatically unregistered after execution.
Definition: image.h:70
int(* exec)(struct image *image)
Execute image.
Definition: image.h:94
int image_exec(struct image *image)
Execute image.
Definition: image.c:378
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:64
int register_image(struct image *image)
Register executable image.
Definition: image.c:286
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define IMAGE_TRUSTED
Image is trusted.
Definition: image.h:67
struct uri * uri
URI of image.
Definition: image.h:32
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:229
void unregister_image(struct image *image)
Unregister executable image.
Definition: image.c:322
#define syslog(priority, fmt,...)
Write message to system log.
Definition: syslog.h:93
struct image * replacement
Replacement image.
Definition: image.h:60
A Uniform Resource Identifier.
Definition: uri.h:64
static int require_trusted_images
Current image trust requirement.
Definition: image.c:70
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:276
char * name
Name.
Definition: image.h:34
#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(), image_extract_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 489 of file image.c.

489  {
490  struct image *image = current_image.image;
491  int rc;
492 
493  /* Sanity check */
494  assert ( replacement->flags & IMAGE_REGISTERED );
495 
496  /* Fail unless there is a currently-executing image */
497  if ( ! image ) {
498  rc = -ENOTTY;
499  DBGC ( replacement, "IMAGE %s cannot replace non-existent "
500  "image: %s\n", replacement->name, strerror ( rc ) );
501  return rc;
502  }
503 
504  /* Check that the replacement image can be executed */
505  if ( ! ( replacement->type && replacement->type->exec ) )
506  return -ENOEXEC;
507 
508  /* Clear any existing replacement */
510 
511  /* Set replacement */
513  DBGC ( image, "IMAGE %s will replace self with IMAGE %s\n",
514  image->name, replacement->name );
515 
516  return 0;
517 }
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:219
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
struct image * image
Image (weak reference, nullified when image is freed)
Definition: image.h:158
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:64
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:229
#define ENOTTY
Inappropriate I/O control operation.
Definition: errno.h:594
struct image * replacement
Replacement image.
Definition: image.h:60
char * name
Name.
Definition: image.h:34

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(), 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 525 of file image.c.

525  {
526 
527  /* Check that this image can be executed */
528  if ( ! ( image->type && image->type->exec ) )
529  return -ENOEXEC;
530 
531  /* Mark image as selected */
533 
534  return 0;
535 }
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:46
An executable image.
Definition: image.h:24
int(* exec)(struct image *image)
Execute image.
Definition: image.h:94
static struct image * image_tag(struct image *image, struct image_tag *tag)
Tag image.
Definition: image.h:276

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

544  {
545 
546  /* Update trust requirement, if permitted to do so */
548  require_trusted_images = require_trusted;
550  }
551 
552  /* Fail if we attempted to change the trust requirement but
553  * were not permitted to do so.
554  */
555  if ( require_trusted_images != require_trusted )
556  return -EACCES_PERMANENT;
557 
558  return 0;
559 }
static int require_trusted_images_permanent
Prevent changes to image trust requirement.
Definition: image.c:73
#define EACCES_PERMANENT
Definition: image.c:51
static int require_trusted_images
Current image trust requirement.
Definition: image.c:70

References EACCES_PERMANENT, require_trusted_images, and require_trusted_images_permanent.

Referenced by imgtrust_exec().

◆ image_memory()

struct image* image_memory ( const char *  name,
userptr_t  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 569 of file image.c.

569  {
570  struct image *image;
571  int rc;
572 
573  /* Allocate image */
574  image = alloc_image ( NULL );
575  if ( ! image ) {
576  rc = -ENOMEM;
577  goto err_alloc_image;
578  }
579 
580  /* Set name */
581  if ( ( rc = image_set_name ( image, name ) ) != 0 )
582  goto err_set_name;
583 
584  /* Set data */
585  if ( ( rc = image_set_data ( image, data, len ) ) != 0 )
586  goto err_set_data;
587 
588  /* Register image */
589  if ( ( rc = register_image ( image ) ) != 0 )
590  goto err_register;
591 
592  /* Drop local reference to image */
593  image_put ( image );
594 
595  return image;
596 
597  err_register:
598  err_set_data:
599  err_set_name:
600  image_put ( image );
601  err_alloc_image:
602  return NULL;
603 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
An executable image.
Definition: image.h:24
#define ENOMEM
Not enough space.
Definition: errno.h:534
int register_image(struct image *image)
Register executable image.
Definition: image.c:286
int image_set_name(struct image *image, const char *name)
Set image name.
Definition: image.c:160
static void image_put(struct image *image)
Decrement reference count on an image.
Definition: image.h:229
int image_set_data(struct image *image, userptr_t data, size_t len)
Set image data.
Definition: image.c:241
uint8_t data[48]
Additional event data.
Definition: ena.h:22
struct image * alloc_image(struct uri *uri)
Allocate executable image.
Definition: image.c:103
uint32_t len
Length.
Definition: ena.h:14
#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 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 612 of file image.c.

612  {
613  const char *cmdline = image->cmdline;
614  const char *search;
615  const char *match;
616  const char *next;
617 
618  /* Find argument */
619  for ( search = cmdline ; search ; search = next ) {
620 
621  /* Find next occurrence, if any */
622  match = strstr ( search, key );
623  if ( ! match )
624  break;
625  next = ( match + strlen ( key ) );
626 
627  /* Check preceding delimiter, if any */
628  if ( ( match == cmdline ) || isspace ( match[-1] ) )
629  return next;
630  }
631 
632  return NULL;
633 }
uint32_t next
Next descriptor address.
Definition: myson.h:18
An executable image.
Definition: image.h:24
char * cmdline
Command line to pass to image.
Definition: image.h:39
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 cmdline
Definition: multiboot.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
union @383 key
Sense key.
Definition: scsi.h:18

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

Referenced by first_image(), initrd_dump(), initrd_reshuffle(), initrd_squash_high(), initrd_swap(), and register_image().

◆ __image_tag

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

Image selected for execution.

Currently-executing image.

Definition at line 60 of file image.c.

◆ require_trusted_images

int require_trusted_images = 0
static

Current image trust requirement.

Definition at line 70 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 73 of file image.c.

Referenced by image_set_trust().