Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
duk_alloc_torture.c File Reference
#include "duktape.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

Go to the source code of this file.

Data Structures

struct  alloc_hdr
 

Macros

#define RED_ZONE_SIZE   16
 
#define RED_ZONE_BYTE   0x5a
 
#define INIT_BYTE   0xa5
 
#define WIPE_BYTE   0x27
 

Functions

static void check_red_zone (alloc_hdr *hdr)
 
void * duk_alloc_torture (void *udata, duk_size_t size)
 
void * duk_realloc_torture (void *udata, void *ptr, duk_size_t size)
 
void duk_free_torture (void *udata, void *ptr)
 

Macro Definition Documentation

◆ INIT_BYTE

#define INIT_BYTE   0xa5

◆ RED_ZONE_BYTE

#define RED_ZONE_BYTE   0x5a

◆ RED_ZONE_SIZE

◆ WIPE_BYTE

#define WIPE_BYTE   0x27

Function Documentation

◆ check_red_zone()

static void check_red_zone ( alloc_hdr * hdr)
static

Definition at line 36 of file duktape-1.5.2/examples/alloc-torture/duk_alloc_torture.c.

36 {
37 size_t size;
38 int i;
39 int err;
40 unsigned char *p;
41 unsigned char *userptr;
42
43 size = hdr->u.sz;
44 userptr = (unsigned char *) hdr + sizeof(alloc_hdr) + RED_ZONE_SIZE;
45
46 err = 0;
47 p = (unsigned char *) hdr + sizeof(alloc_hdr);
48 for (i = 0; i < RED_ZONE_SIZE; i++) {
49 if (p[i] != RED_ZONE_BYTE) {
50 err = 1;
51 }
52 }
53 if (err) {
54 fprintf(stderr, "RED ZONE CORRUPTED BEFORE ALLOC: hdr=%p ptr=%p size=%ld\n",
55 (void *) hdr, (void *) userptr, (long) size);
56 fflush(stderr);
57 }
58
59 err = 0;
60 p = (unsigned char *) hdr + sizeof(alloc_hdr) + RED_ZONE_SIZE + size;
61 for (i = 0; i < RED_ZONE_SIZE; i++) {
62 if (p[i] != RED_ZONE_BYTE) {
63 err = 1;
64 }
65 }
66 if (err) {
67 fprintf(stderr, "RED ZONE CORRUPTED AFTER ALLOC: hdr=%p ptr=%p size=%ld\n",
68 (void *) hdr, (void *) userptr, (long) size);
69 fflush(stderr);
70 }
71}
union alloc_hdr::@15 u

References RED_ZONE_BYTE, RED_ZONE_SIZE, alloc_hdr::sz, and alloc_hdr::u.

Referenced by duk_free_torture(), and duk_realloc_torture().

◆ duk_alloc_torture()

void * duk_alloc_torture ( void * udata,
duk_size_t size )

Definition at line 73 of file duktape-1.5.2/examples/alloc-torture/duk_alloc_torture.c.

73 {
74 unsigned char *p;
75
76 (void) udata; /* Suppress warning. */
77
78 if (size == 0) {
79 return NULL;
80 }
81
82 p = (unsigned char *) malloc(size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE);
83 if (!p) {
84 return NULL;
85 }
86
87 ((alloc_hdr *) (void *) p)->u.sz = size;
88 p += sizeof(alloc_hdr);
89 memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE);
90 p += RED_ZONE_SIZE;
91 memset((void *) p, INIT_BYTE, size);
92 p += size;
93 memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE);
94 p -= size;
95 return (void *) p;
96}
#define malloc
Definition civetweb.c:1539
#define NULL
Definition gmacros.h:924

References INIT_BYTE, malloc, NULL, RED_ZONE_BYTE, and RED_ZONE_SIZE.

Referenced by create_duktape_heap(), and create_duktape_heap().

◆ duk_free_torture()

void duk_free_torture ( void * udata,
void * ptr )

Definition at line 166 of file duktape-1.5.2/examples/alloc-torture/duk_alloc_torture.c.

166 {
167 unsigned char *p;
168 size_t old_size;
169
170 (void) udata; /* Suppress warning. */
171
172 if (!ptr) {
173 return;
174 }
175
176 p = (unsigned char *) ptr - sizeof(alloc_hdr) - RED_ZONE_SIZE;
177 old_size = ((alloc_hdr *) (void *) p)->u.sz;
178
179 check_red_zone((alloc_hdr *) (void *) p);
180 memset((void *) p, WIPE_BYTE, old_size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE);
181 free((void *) p);
182}
#define free
Definition civetweb.c:1542
static void check_red_zone(alloc_hdr *hdr)

References check_red_zone(), free, RED_ZONE_SIZE, and WIPE_BYTE.

Referenced by create_duktape_heap(), and create_duktape_heap().

◆ duk_realloc_torture()

void * duk_realloc_torture ( void * udata,
void * ptr,
duk_size_t size )

Definition at line 98 of file duktape-1.5.2/examples/alloc-torture/duk_alloc_torture.c.

98 {
99 unsigned char *p, *old_p;
100 size_t old_size;
101
102 (void) udata; /* Suppress warning. */
103
104 /* Handle the ptr-NULL vs. size-zero cases explicitly to minimize
105 * platform assumptions. You can get away with much less in specific
106 * well-behaving environments.
107 */
108
109 if (ptr) {
110 old_p = (unsigned char *) ptr - sizeof(alloc_hdr) - RED_ZONE_SIZE;
111 old_size = ((alloc_hdr *) (void *) old_p)->u.sz;
112 check_red_zone((alloc_hdr *) (void *) old_p);
113
114 if (size == 0) {
115 memset((void *) old_p, WIPE_BYTE, old_size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE);
116 free((void *) old_p);
117 return NULL;
118 } else {
119 /* Force address change on every realloc. */
120 p = (unsigned char *) malloc(size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE);
121 if (!p) {
122 return NULL;
123 }
124
125 ((alloc_hdr *) (void *) p)->u.sz = size;
126 p += sizeof(alloc_hdr);
127 memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE);
128 p += RED_ZONE_SIZE;
129 if (size > old_size) {
130 memcpy((void *) p, (void *) (old_p + sizeof(alloc_hdr) + RED_ZONE_SIZE), old_size);
131 memset((void *) (p + old_size), INIT_BYTE, size - old_size);
132 } else {
133 memcpy((void *) p, (void *) (old_p + sizeof(alloc_hdr) + RED_ZONE_SIZE), size);
134 }
135 p += size;
136 memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE);
137 p -= size;
138
139 memset((void *) old_p, WIPE_BYTE, old_size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE);
140 free((void *) old_p);
141
142 return (void *) p;
143 }
144 } else {
145 if (size == 0) {
146 return NULL;
147 } else {
148 p = (unsigned char *) malloc(size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE);
149 if (!p) {
150 return NULL;
151 }
152
153 ((alloc_hdr *) (void *) p)->u.sz = size;
154 p += sizeof(alloc_hdr);
155 memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE);
156 p += RED_ZONE_SIZE;
157 memset((void *) p, INIT_BYTE, size);
158 p += size;
159 memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE);
160 p -= size;
161 return (void *) p;
162 }
163 }
164}

References check_red_zone(), free, INIT_BYTE, malloc, NULL, RED_ZONE_BYTE, RED_ZONE_SIZE, and WIPE_BYTE.

Referenced by create_duktape_heap(), and create_duktape_heap().