iPXE
Functions
zlib.c File Reference

zlib compressed images More...

#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <ipxe/deflate.h>
#include <ipxe/uaccess.h>
#include <ipxe/image.h>
#include <ipxe/zlib.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int zlib_deflate (enum deflate_format format, struct deflate_chunk *in, struct image *extracted)
 Extract compressed data to image. More...
 
static int zlib_extract (struct image *image, struct image *extracted)
 Extract zlib image. More...
 
static int zlib_probe (struct image *image)
 Probe zlib image. More...
 
struct image_type zlib_image_type __image_type (PROBE_NORMAL)
 zlib image type More...
 

Detailed Description

zlib compressed images

Definition in file zlib.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ zlib_deflate()

int zlib_deflate ( enum deflate_format  format,
struct deflate_chunk in,
struct image extracted 
)

Extract compressed data to image.

Parameters
formatCompression format code
inCompressed input chunk
extractedExtracted image
Return values
rcReturn status code

Definition at line 48 of file zlib.c.

49  {
50  struct deflate *deflate;
51  struct deflate_chunk out;
52  int rc;
53 
54  /* Allocate and initialise decompressor */
55  deflate = zalloc ( sizeof ( *deflate ) );
56  if ( ! deflate ) {
57  rc = -ENOMEM;
58  goto err_alloc;
59  }
60 
61  /* Decompress data, (re)allocating if necessary */
62  while ( 1 ) {
63 
64  /* (Re)initialise decompressor */
66 
67  /* (Re)initialise input chunk */
68  in->offset = 0;
69 
70  /* Initialise output chunk */
71  deflate_chunk_init ( &out, extracted->data, 0, extracted->len );
72 
73  /* Decompress data */
74  if ( ( rc = deflate_inflate ( deflate, in, &out ) ) != 0 ) {
75  DBGC ( extracted, "ZLIB %p could not decompress: %s\n",
76  extracted, strerror ( rc ) );
77  goto err_inflate;
78  }
79 
80  /* Check that decompression is valid */
81  if ( ! deflate_finished ( deflate ) ) {
82  DBGC ( extracted, "ZLIB %p decompression incomplete\n",
83  extracted );
84  rc = -EINVAL;
85  goto err_unfinished;
86  }
87 
88  /* Finish if output image size was correct */
89  if ( out.offset == extracted->len )
90  break;
91 
92  /* Otherwise, resize output image and retry */
93  if ( ( rc = image_set_len ( extracted, out.offset ) ) != 0 ) {
94  DBGC ( extracted, "ZLIB %p could not resize: %s\n",
95  extracted, strerror ( rc ) );
96  goto err_set_size;
97  }
98  }
99 
100  /* Success */
101  rc = 0;
102 
103  err_set_size:
104  err_unfinished:
105  err_inflate:
106  free ( deflate );
107  err_alloc:
108  return rc;
109 }
int deflate_inflate(struct deflate *deflate, struct deflate_chunk *in, struct deflate_chunk *out)
Inflate compressed data.
Definition: deflate.c:492
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
userptr_t data
Raw file image.
Definition: image.h:41
__be32 in[4]
Definition: CIB_PRM.h:35
#define DBGC(...)
Definition: compiler.h:505
__be32 out[4]
Definition: CIB_PRM.h:36
#define ENOMEM
Not enough space.
Definition: errno.h:534
A chunk of data.
Definition: deflate.h:241
void deflate_init(struct deflate *deflate, enum deflate_format format)
Initialise decompressor.
Definition: deflate.c:999
static int deflate_finished(struct deflate *deflate)
Check if decompression has finished.
Definition: deflate.h:273
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
size_t len
Length of raw file image.
Definition: image.h:43
int image_set_len(struct image *image, size_t len)
Set image length.
Definition: image.c:201
int const char * format
Definition: xfer.h:104
Decompressor.
Definition: deflate.h:156

References image::data, DBGC, deflate_finished(), deflate_inflate(), deflate_init(), EINVAL, ENOMEM, format, free, image_set_len(), in, image::len, out, rc, strerror(), and zalloc().

Referenced by gzip_extract(), and zlib_extract().

◆ zlib_extract()

static int zlib_extract ( struct image image,
struct image extracted 
)
static

Extract zlib image.

Parameters
imageImage
extractedExtracted image
Return values
rcReturn status code

Definition at line 118 of file zlib.c.

118  {
119  struct deflate_chunk in;
120  int rc;
121 
122  /* Initialise input chunk */
123  deflate_chunk_init ( &in, image->data, 0, image->len );
124 
125  /* Decompress image */
126  if ( ( rc = zlib_deflate ( DEFLATE_ZLIB, &in, extracted ) ) != 0 )
127  return rc;
128 
129  return 0;
130 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
userptr_t data
Raw file image.
Definition: image.h:41
__be32 in[4]
Definition: CIB_PRM.h:35
An executable image.
Definition: image.h:24
A chunk of data.
Definition: deflate.h:241
int zlib_deflate(enum deflate_format format, struct deflate_chunk *in, struct image *extracted)
Extract compressed data to image.
Definition: zlib.c:48
ZLIB header and footer.
Definition: deflate.h:21
size_t len
Length of raw file image.
Definition: image.h:43

References image::data, DEFLATE_ZLIB, in, image::len, rc, and zlib_deflate().

◆ zlib_probe()

static int zlib_probe ( struct image image)
static

Probe zlib image.

Parameters
imagezlib image
Return values
rcReturn status code

Definition at line 138 of file zlib.c.

138  {
139  union zlib_magic magic;
140 
141  /* Sanity check */
142  if ( image->len < sizeof ( magic ) ) {
143  DBGC ( image, "ZLIB %p image too short\n", image );
144  return -ENOEXEC;
145  }
146 
147  /* Check magic header */
148  copy_from_user ( &magic, image->data, 0, sizeof ( magic ) );
149  if ( ! zlib_magic_is_valid ( &magic ) ) {
150  DBGC ( image, "ZLIB %p invalid magic data\n", image );
151  return -ENOEXEC;
152  }
153 
154  return 0;
155 }
userptr_t data
Raw file image.
Definition: image.h:41
#define ENOEXEC
Exec format error.
Definition: errno.h:519
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
Definition: uaccess.h:337
#define DBGC(...)
Definition: compiler.h:505
uint32_t magic
Magic signature.
Definition: fdt.h:12
An executable image.
Definition: image.h:24
zlib magic header
Definition: zlib.h:18
size_t len
Length of raw file image.
Definition: image.h:43
static int zlib_magic_is_valid(union zlib_magic *magic)
Check that zlib magic header is valid.
Definition: zlib.h:31

References copy_from_user(), image::data, DBGC, ENOEXEC, image::len, magic, and zlib_magic_is_valid().

◆ __image_type()

struct image_type zlib_image_type __image_type ( PROBE_NORMAL  )

zlib image type