mirror of https://github.com/n1nj4sec/pupy.git
71 lines
1.5 KiB
C
71 lines
1.5 KiB
C
|
/* --- Code for inlining --- */
|
||
|
|
||
|
#include "LzmaDec.h"
|
||
|
|
||
|
static void *_lzalloc(void *p, size_t size) { p = p; return malloc(size); }
|
||
|
static void _lzfree(void *p, void *address) { p = p; free(address); }
|
||
|
static ISzAlloc _lzallocator = { _lzalloc, _lzfree };
|
||
|
|
||
|
static void *lzmaunpack(const char *data, size_t size, size_t *puncompressed_size) {
|
||
|
char *uncompressed = NULL;
|
||
|
size_t uncompressed_size = 0;
|
||
|
|
||
|
const Byte *wheader = data + sizeof(unsigned int);
|
||
|
const Byte *woheader = wheader + LZMA_PROPS_SIZE;
|
||
|
|
||
|
CLzmaDec state;
|
||
|
ELzmaStatus status;
|
||
|
size_t srcLen;
|
||
|
int res;
|
||
|
|
||
|
union {
|
||
|
unsigned int l;
|
||
|
unsigned char c[4];
|
||
|
} x;
|
||
|
|
||
|
x.c[3] = data[0];
|
||
|
x.c[2] = data[1];
|
||
|
x.c[1] = data[2];
|
||
|
x.c[0] = data[3];
|
||
|
|
||
|
uncompressed_size = x.l;
|
||
|
|
||
|
uncompressed = malloc(uncompressed_size);
|
||
|
if (!uncompressed) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
srcLen = size - sizeof(unsigned int) - LZMA_PROPS_SIZE;
|
||
|
|
||
|
res = LzmaDecode(
|
||
|
uncompressed, &uncompressed_size, woheader, &srcLen, wheader,
|
||
|
LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &_lzallocator
|
||
|
);
|
||
|
|
||
|
if (res != SZ_OK) {
|
||
|
free(uncompressed);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
if (puncompressed_size) {
|
||
|
*puncompressed_size = uncompressed_size;
|
||
|
}
|
||
|
|
||
|
return uncompressed;
|
||
|
}
|
||
|
|
||
|
static PyObject *PyObject_lzmaunpack(const char *data, size_t size) {
|
||
|
PyObject * object;
|
||
|
size_t uncompressed_size = 0;
|
||
|
void *uncompressed = lzmaunpack(data, size, &uncompressed_size);
|
||
|
if (!uncompressed) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
object = PyMarshal_ReadObjectFromString(
|
||
|
uncompressed, uncompressed_size);
|
||
|
|
||
|
free(uncompressed);
|
||
|
return object;
|
||
|
}
|