Rizin
unix-like reverse engineering framework and cli tools
common.c
Go to the documentation of this file.
1 //
5 //
6 // Author: Lasse Collin
7 //
8 // This file has been put into the public domain.
9 // You can do whatever you want with this file.
10 //
12 
13 #include "common.h"
14 
15 
17 // Version //
19 
21 lzma_version_number(void)
22 {
23  return LZMA_VERSION;
24 }
25 
26 
27 extern LZMA_API(const char *)
28 lzma_version_string(void)
29 {
30  return LZMA_VERSION_STRING;
31 }
32 
33 
35 // Memory allocation //
37 
38 extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1)
40 {
41  // Some malloc() variants return NULL if called with size == 0.
42  if (size == 0)
43  size = 1;
44 
45  void *ptr;
46 
47  if (allocator != NULL && allocator->alloc != NULL)
48  ptr = allocator->alloc(allocator->opaque, 1, size);
49  else
50  ptr = malloc(size);
51 
52  return ptr;
53 }
54 
55 
56 extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1)
57 lzma_alloc_zero(size_t size, const lzma_allocator *allocator)
58 {
59  // Some calloc() variants return NULL if called with size == 0.
60  if (size == 0)
61  size = 1;
62 
63  void *ptr;
64 
65  if (allocator != NULL && allocator->alloc != NULL) {
66  ptr = allocator->alloc(allocator->opaque, 1, size);
67  if (ptr != NULL)
68  memzero(ptr, size);
69  } else {
70  ptr = calloc(1, size);
71  }
72 
73  return ptr;
74 }
75 
76 
77 extern void
79 {
80  if (allocator != NULL && allocator->free != NULL)
81  allocator->free(allocator->opaque, ptr);
82  else
83  free(ptr);
84 
85  return;
86 }
87 
88 
90 // Misc //
92 
93 extern size_t
95  size_t in_size, uint8_t *restrict out,
96  size_t *restrict out_pos, size_t out_size)
97 {
98  const size_t in_avail = in_size - *in_pos;
99  const size_t out_avail = out_size - *out_pos;
100  const size_t copy_size = my_min(in_avail, out_avail);
101 
102  // Call memcpy() only if there is something to copy. If there is
103  // nothing to copy, in or out might be NULL and then the memcpy()
104  // call would trigger undefined behavior.
105  if (copy_size > 0)
106  memcpy(out + *out_pos, in + *in_pos, copy_size);
107 
108  *in_pos += copy_size;
109  *out_pos += copy_size;
110 
111  return copy_size;
112 }
113 
114 
115 extern lzma_ret
117  const lzma_filter_info *filters)
118 {
120  next->id = filters[0].id;
121  return filters[0].init == NULL
122  ? LZMA_OK : filters[0].init(next, allocator, filters);
123 }
124 
125 
126 extern lzma_ret
128  const lzma_filter *reversed_filters)
129 {
130  // Check that the application isn't trying to change the Filter ID.
131  // End of filters is indicated with LZMA_VLI_UNKNOWN in both
132  // reversed_filters[0].id and next->id.
133  if (reversed_filters[0].id != next->id)
134  return LZMA_PROG_ERROR;
135 
136  if (reversed_filters[0].id == LZMA_VLI_UNKNOWN)
137  return LZMA_OK;
138 
139  assert(next->update != NULL);
140  return next->update(next->coder, allocator, NULL, reversed_filters);
141 }
142 
143 
144 extern void
146 {
147  if (next->init != (uintptr_t)(NULL)) {
148  // To avoid tiny end functions that simply call
149  // lzma_free(coder, allocator), we allow leaving next->end
150  // NULL and call lzma_free() here.
151  if (next->end != NULL)
152  next->end(next->coder, allocator);
153  else
154  lzma_free(next->coder, allocator);
155 
156  // Reset the variables so the we don't accidentally think
157  // that it is an already initialized coder.
158  *next = LZMA_NEXT_CODER_INIT;
159  }
160 
161  return;
162 }
163 
164 
166 // External to internal API wrapper //
168 
169 extern lzma_ret
171 {
172  if (strm == NULL)
173  return LZMA_PROG_ERROR;
174 
175  if (strm->internal == NULL) {
177  strm->allocator);
178  if (strm->internal == NULL)
179  return LZMA_MEM_ERROR;
180 
182  }
183 
185  sizeof(strm->internal->supported_actions));
186  strm->internal->sequence = ISEQ_RUN;
187  strm->internal->allow_buf_error = false;
188 
189  strm->total_in = 0;
190  strm->total_out = 0;
191 
192  return LZMA_OK;
193 }
194 
195 
197 lzma_code(lzma_stream *strm, lzma_action action)
198 {
199  // Sanity checks
200  if ((strm->next_in == NULL && strm->avail_in != 0)
201  || (strm->next_out == NULL && strm->avail_out != 0)
202  || strm->internal == NULL
203  || strm->internal->next.code == NULL
204  || (unsigned int)(action) > LZMA_ACTION_MAX
206  return LZMA_PROG_ERROR;
207 
208  // Check if unsupported members have been set to non-zero or non-NULL,
209  // which would indicate that some new feature is wanted.
210  if (strm->reserved_ptr1 != NULL
211  || strm->reserved_ptr2 != NULL
212  || strm->reserved_ptr3 != NULL
213  || strm->reserved_ptr4 != NULL
214  || strm->reserved_int1 != 0
215  || strm->reserved_int2 != 0
216  || strm->reserved_int3 != 0
217  || strm->reserved_int4 != 0
220  return LZMA_OPTIONS_ERROR;
221 
222  switch (strm->internal->sequence) {
223  case ISEQ_RUN:
224  switch (action) {
225  case LZMA_RUN:
226  break;
227 
228  case LZMA_SYNC_FLUSH:
229  strm->internal->sequence = ISEQ_SYNC_FLUSH;
230  break;
231 
232  case LZMA_FULL_FLUSH:
233  strm->internal->sequence = ISEQ_FULL_FLUSH;
234  break;
235 
236  case LZMA_FINISH:
237  strm->internal->sequence = ISEQ_FINISH;
238  break;
239 
240  case LZMA_FULL_BARRIER:
241  strm->internal->sequence = ISEQ_FULL_BARRIER;
242  break;
243  }
244 
245  break;
246 
247  case ISEQ_SYNC_FLUSH:
248  // The same action must be used until we return
249  // LZMA_STREAM_END, and the amount of input must not change.
250  if (action != LZMA_SYNC_FLUSH
252  return LZMA_PROG_ERROR;
253 
254  break;
255 
256  case ISEQ_FULL_FLUSH:
257  if (action != LZMA_FULL_FLUSH
259  return LZMA_PROG_ERROR;
260 
261  break;
262 
263  case ISEQ_FINISH:
264  if (action != LZMA_FINISH
266  return LZMA_PROG_ERROR;
267 
268  break;
269 
270  case ISEQ_FULL_BARRIER:
273  return LZMA_PROG_ERROR;
274 
275  break;
276 
277  case ISEQ_END:
278  return LZMA_STREAM_END;
279 
280  case ISEQ_ERROR:
281  default:
282  return LZMA_PROG_ERROR;
283  }
284 
285  size_t in_pos = 0;
286  size_t out_pos = 0;
287  lzma_ret ret = strm->internal->next.code(
291 
292  strm->next_in += in_pos;
293  strm->avail_in -= in_pos;
294  strm->total_in += in_pos;
295 
296  strm->next_out += out_pos;
297  strm->avail_out -= out_pos;
298  strm->total_out += out_pos;
299 
301 
302  // Cast is needed to silence a warning about LZMA_TIMED_OUT, which
303  // isn't part of lzma_ret enumeration.
304  switch ((unsigned int)(ret)) {
305  case LZMA_OK:
306  // Don't return LZMA_BUF_ERROR when it happens the first time.
307  // This is to avoid returning LZMA_BUF_ERROR when avail_out
308  // was zero but still there was no more data left to written
309  // to next_out.
310  if (out_pos == 0 && in_pos == 0) {
312  ret = LZMA_BUF_ERROR;
313  else
314  strm->internal->allow_buf_error = true;
315  } else {
316  strm->internal->allow_buf_error = false;
317  }
318  break;
319 
320  case LZMA_TIMED_OUT:
321  strm->internal->allow_buf_error = false;
322  ret = LZMA_OK;
323  break;
324 
325  case LZMA_STREAM_END:
326  if (strm->internal->sequence == ISEQ_SYNC_FLUSH
327  || strm->internal->sequence == ISEQ_FULL_FLUSH
328  || strm->internal->sequence
329  == ISEQ_FULL_BARRIER)
330  strm->internal->sequence = ISEQ_RUN;
331  else
332  strm->internal->sequence = ISEQ_END;
333 
334  // Fall through
335 
336  case LZMA_NO_CHECK:
338  case LZMA_GET_CHECK:
339  case LZMA_MEMLIMIT_ERROR:
340  // Something else than LZMA_OK, but not a fatal error,
341  // that is, coding may be continued (except if ISEQ_END).
342  strm->internal->allow_buf_error = false;
343  break;
344 
345  default:
346  // All the other errors are fatal; coding cannot be continued.
347  assert(ret != LZMA_BUF_ERROR);
348  strm->internal->sequence = ISEQ_ERROR;
349  break;
350  }
351 
352  return ret;
353 }
354 
355 
356 extern LZMA_API(void)
357 lzma_end(lzma_stream *strm)
358 {
359  if (strm != NULL && strm->internal != NULL) {
362  strm->internal = NULL;
363  }
364 
365  return;
366 }
367 
368 
369 extern LZMA_API(void)
370 lzma_get_progress(lzma_stream *strm,
371  uint64_t *progress_in, uint64_t *progress_out)
372 {
373  if (strm->internal->next.get_progress != NULL) {
375  progress_in, progress_out);
376  } else {
378  *progress_out = strm->total_out;
379  }
380 
381  return;
382 }
383 
384 
386 lzma_get_check(const lzma_stream *strm)
387 {
388  // Return LZMA_CHECK_NONE if we cannot know the check type.
389  // It's a bug in the application if this happens.
390  if (strm->internal->next.get_check == NULL)
391  return LZMA_CHECK_NONE;
392 
394 }
395 
396 
398 lzma_memusage(const lzma_stream *strm)
399 {
400  uint64_t memusage;
401  uint64_t old_memlimit;
402 
403  if (strm == NULL || strm->internal == NULL
407  &memusage, &old_memlimit, 0) != LZMA_OK)
408  return 0;
409 
410  return memusage;
411 }
412 
413 
414 extern LZMA_API(uint64_t)
415 lzma_memlimit_get(const lzma_stream *strm)
416 {
417  uint64_t old_memlimit;
418  uint64_t memusage;
419 
420  if (strm == NULL || strm->internal == NULL
424  &memusage, &old_memlimit, 0) != LZMA_OK)
425  return 0;
426 
427  return old_memlimit;
428 }
429 
430 
431 extern LZMA_API(lzma_ret)
432 lzma_memlimit_set(lzma_stream *strm, uint64_t new_memlimit)
433 {
434  // Dummy variables to simplify memconfig functions
435  uint64_t old_memlimit;
436  uint64_t memusage;
437 
438  if (strm == NULL || strm->internal == NULL
439  || strm->internal->next.memconfig == NULL)
440  return LZMA_PROG_ERROR;
441 
442  // Zero is a special value that cannot be used as an actual limit.
443  // If 0 was specified, use 1 instead.
444  if (new_memlimit == 0)
445  new_memlimit = 1;
446 
448  &memusage, &old_memlimit, new_memlimit);
449 }
lzma_check
Type of the integrity check (Check ID)
Definition: check.h:27
@ LZMA_CHECK_NONE
Definition: check.h:28
const lzma_allocator const uint8_t size_t uint8_t size_t * out_pos
Definition: block.h:528
const lzma_allocator const uint8_t size_t * in_pos
Definition: block.h:579
const lzma_allocator const uint8_t size_t in_size
Definition: block.h:527
const lzma_allocator * allocator
Definition: block.h:377
const lzma_allocator const uint8_t * in
Definition: block.h:527
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
const lzma_filter * filters
Definition: container.h:315
#define NULL
Definition: cris-opc.c:27
static lzma_stream strm
Definition: full_flush.c:20
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
voidpf void uLong size
Definition: ioapi.h:138
#define restrict
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
#define const
Definition: ansidecl.h:240
void * malloc(size_t size)
Definition: malloc.c:123
void * calloc(size_t number, size_t size)
Definition: malloc.c:102
assert(limit<=UINT32_MAX/2)
unsigned int uint32_t
Definition: sftypes.h:29
unsigned long uint64_t
Definition: sftypes.h:28
unsigned char uint8_t
Definition: sftypes.h:31
_W64 unsigned int uintptr_t
Custom functions for memory handling.
Definition: base.h:372
void * opaque
Pointer passed to .alloc() and .free()
Definition: base.h:432
void *LZMA_API_CALL * alloc(void *opaque, size_t nmemb, size_t size)
Pointer to a custom memory allocation function.
Filter options.
Definition: filter.h:43
lzma_vli id
Filter ID.
Definition: filter.h:54
lzma_next_coder next
The actual coder that should do something useful.
Definition: common.h:198
bool supported_actions[LZMA_ACTION_MAX+1]
Indicates which lzma_action values are allowed by next.code.
Definition: common.h:220
bool allow_buf_error
Definition: common.h:224
enum lzma_internal_s::@645 sequence
size_t avail_in
Definition: common.h:217
Hold data and function pointers of the next filter in the chain.
Definition: common.h:135
void(* get_progress)(void *coder, uint64_t *progress_in, uint64_t *progress_out)
Definition: common.h:159
lzma_code_function code
Pointer to function to do the actual coding.
Definition: common.h:150
void * coder
Pointer to coder-specific data.
Definition: common.h:137
lzma_vli id
Definition: common.h:141
lzma_check(* get_check)(const void *coder)
Definition: common.h:164
uintptr_t init
Definition: common.h:147
lzma_end_function end
Definition: common.h:155
lzma_ret(* update)(void *coder, const lzma_allocator *allocator, const lzma_filter *filters, const lzma_filter *reversed_filters)
Definition: common.h:173
lzma_ret(* memconfig)(void *coder, uint64_t *memusage, uint64_t *old_memlimit, uint64_t new_memlimit)
Definition: common.h:168
Passing data to and from liblzma.
Definition: base.h:485
uint64_t reserved_int1
Definition: base.h:517
void * reserved_ptr3
Definition: base.h:515
uint8_t * next_out
Definition: base.h:490
uint64_t total_in
Definition: base.h:488
lzma_internal * internal
Definition: base.h:505
size_t reserved_int3
Definition: base.h:519
const lzma_allocator * allocator
Custom memory allocation functions.
Definition: base.h:502
size_t avail_out
Definition: base.h:491
const uint8_t * next_in
Definition: base.h:486
uint64_t total_out
Definition: base.h:492
void * reserved_ptr1
Definition: base.h:513
lzma_reserved_enum reserved_enum2
Definition: base.h:522
lzma_reserved_enum reserved_enum1
Definition: base.h:521
void * reserved_ptr2
Definition: base.h:514
size_t avail_in
Definition: base.h:487
void * reserved_ptr4
Definition: base.h:516
size_t reserved_int4
Definition: base.h:520
uint64_t reserved_int2
Definition: base.h:518
bool init
Definition: core.c:77
Definitions common to the whole liblzma library.
#define LZMA_NEXT_CODER_INIT
Macro to initialize lzma_next_coder structure.
Definition: common.h:180
#define lzma_next_coder_init(func, next, allocator)
Definition: common.h:291
#define LZMA_TIMED_OUT
Definition: common.h:88
#define LZMA_ACTION_MAX
Largest valid lzma_action value as unsigned integer.
Definition: common.h:81
void * lzma_alloc(size_t size, const lzma_allocator *allocator) lzma_attribute((__malloc__)) lzma_attr_alloc_size(1)
Allocates memory.
#define my_min(x, y)
Definition: sysdefs.h:185
#define memzero(s, n)
Definition: sysdefs.h:180
#define lzma_attr_alloc_size(x)
Definition: sysdefs.h:196
#define LZMA_VLI_UNKNOWN
VLI value to denote that the value is unknown.
Definition: vli.h:39
@ LZMA_RESERVED_ENUM
Definition: base.h:45
lzma_ret
Return values used by several functions in liblzma.
Definition: base.h:57
@ LZMA_PROG_ERROR
Programming error.
Definition: base.h:218
@ LZMA_MEM_ERROR
Cannot allocate memory.
Definition: base.h:128
@ LZMA_STREAM_END
End of stream was reached.
Definition: base.h:63
@ LZMA_UNSUPPORTED_CHECK
Cannot calculate the integrity check.
Definition: base.h:90
@ LZMA_BUF_ERROR
No progress is possible.
Definition: base.h:191
@ LZMA_MEMLIMIT_ERROR
Definition: base.h:140
@ LZMA_GET_CHECK
Integrity check type is now available.
Definition: base.h:115
@ LZMA_NO_CHECK
Input stream has no integrity check.
Definition: base.h:75
@ LZMA_OPTIONS_ERROR
Invalid or unsupported options.
Definition: base.h:160
@ LZMA_OK
Operation completed successfully.
Definition: base.h:58
lzma_action
The ‘action’ argument for lzma_code()
Definition: base.h:250
@ LZMA_SYNC_FLUSH
Make all the input available at output.
Definition: base.h:265
@ LZMA_FINISH
Finish the coding operation.
Definition: base.h:328
@ LZMA_RUN
Continue coding.
Definition: base.h:251
@ LZMA_FULL_FLUSH
Finish encoding of the current Block.
Definition: base.h:290
@ LZMA_FULL_BARRIER
Finish encoding of the current Block.
Definition: base.h:305
uint64_t * progress_in
Definition: base.h:599
#define LZMA_VERSION
Compile-time version number.
Definition: version.h:57
#define LZMA_VERSION_STRING
Compile-time version as a string.
Definition: version.h:92
lzma_ret lzma_next_filter_init(lzma_next_coder *next, const lzma_allocator *allocator, const lzma_filter_info *filters)
Definition: common.c:116
void lzma_free(void *ptr, const lzma_allocator *allocator)
Frees memory.
Definition: common.c:78
void * lzma_attribute((__malloc__))
Definition: common.c:38
lzma_ret lzma_strm_init(lzma_stream *strm)
Definition: common.c:170
LZMA_API(uint32_t)
Definition: common.c:20
size_t lzma_bufcpy(const uint8_t *restrict in, size_t *restrict in_pos, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size)
Definition: common.c:94
lzma_ret lzma_next_filter_update(lzma_next_coder *next, const lzma_allocator *allocator, const lzma_filter *reversed_filters)
Definition: common.c:127
void lzma_next_end(lzma_next_coder *next, const lzma_allocator *allocator)
Definition: common.c:145