@helm2/poc_jenki_rce 0.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of @helm2/poc_jenki_rce might be problematic. Click here for more details.

Files changed (160) hide show
  1. package/LICENSE +19 -0
  2. package/Makefile +18 -0
  3. package/README.md +52 -0
  4. package/binding.gyp +81 -0
  5. package/index.d.ts +273 -0
  6. package/index.js +45 -0
  7. package/lib/bindings.js +1 -0
  8. package/lib/document.js +118 -0
  9. package/lib/element.js +82 -0
  10. package/lib/sax_parser.js +38 -0
  11. package/package.json +70 -0
  12. package/src/html_document.cc +7 -0
  13. package/src/html_document.h +18 -0
  14. package/src/libxmljs.cc +252 -0
  15. package/src/libxmljs.h +53 -0
  16. package/src/xml_attribute.cc +173 -0
  17. package/src/xml_attribute.h +40 -0
  18. package/src/xml_comment.cc +117 -0
  19. package/src/xml_comment.h +30 -0
  20. package/src/xml_document.cc +810 -0
  21. package/src/xml_document.h +67 -0
  22. package/src/xml_element.cc +565 -0
  23. package/src/xml_element.h +61 -0
  24. package/src/xml_namespace.cc +158 -0
  25. package/src/xml_namespace.h +39 -0
  26. package/src/xml_node.cc +761 -0
  27. package/src/xml_node.h +73 -0
  28. package/src/xml_pi.cc +161 -0
  29. package/src/xml_pi.h +34 -0
  30. package/src/xml_sax_parser.cc +424 -0
  31. package/src/xml_sax_parser.h +73 -0
  32. package/src/xml_syntax_error.cc +66 -0
  33. package/src/xml_syntax_error.h +25 -0
  34. package/src/xml_text.cc +320 -0
  35. package/src/xml_text.h +48 -0
  36. package/src/xml_textwriter.cc +315 -0
  37. package/src/xml_textwriter.h +62 -0
  38. package/src/xml_xpath_context.cc +70 -0
  39. package/src/xml_xpath_context.h +23 -0
  40. package/vendor/libxml/Copyright +23 -0
  41. package/vendor/libxml/DOCBparser.c +305 -0
  42. package/vendor/libxml/HTMLparser.c +7287 -0
  43. package/vendor/libxml/HTMLtree.c +1200 -0
  44. package/vendor/libxml/Makefile +2983 -0
  45. package/vendor/libxml/SAX.c +180 -0
  46. package/vendor/libxml/SAX2.c +3036 -0
  47. package/vendor/libxml/buf.c +1351 -0
  48. package/vendor/libxml/buf.h +72 -0
  49. package/vendor/libxml/c14n.c +2234 -0
  50. package/vendor/libxml/catalog.c +3828 -0
  51. package/vendor/libxml/chvalid.c +336 -0
  52. package/vendor/libxml/config.h +294 -0
  53. package/vendor/libxml/config.h.gch +0 -0
  54. package/vendor/libxml/debugXML.c +3423 -0
  55. package/vendor/libxml/dict.c +1298 -0
  56. package/vendor/libxml/elfgcchack.h +17818 -0
  57. package/vendor/libxml/enc.h +32 -0
  58. package/vendor/libxml/encoding.c +3975 -0
  59. package/vendor/libxml/entities.c +1163 -0
  60. package/vendor/libxml/error.c +998 -0
  61. package/vendor/libxml/globals.c +1126 -0
  62. package/vendor/libxml/hash.c +1146 -0
  63. package/vendor/libxml/include/libxml/DOCBparser.h +96 -0
  64. package/vendor/libxml/include/libxml/HTMLparser.h +306 -0
  65. package/vendor/libxml/include/libxml/HTMLtree.h +147 -0
  66. package/vendor/libxml/include/libxml/Makefile +725 -0
  67. package/vendor/libxml/include/libxml/Makefile.am +54 -0
  68. package/vendor/libxml/include/libxml/Makefile.in +725 -0
  69. package/vendor/libxml/include/libxml/SAX.h +173 -0
  70. package/vendor/libxml/include/libxml/SAX2.h +178 -0
  71. package/vendor/libxml/include/libxml/c14n.h +128 -0
  72. package/vendor/libxml/include/libxml/catalog.h +182 -0
  73. package/vendor/libxml/include/libxml/chvalid.h +230 -0
  74. package/vendor/libxml/include/libxml/debugXML.h +217 -0
  75. package/vendor/libxml/include/libxml/dict.h +79 -0
  76. package/vendor/libxml/include/libxml/encoding.h +245 -0
  77. package/vendor/libxml/include/libxml/entities.h +151 -0
  78. package/vendor/libxml/include/libxml/globals.h +508 -0
  79. package/vendor/libxml/include/libxml/hash.h +236 -0
  80. package/vendor/libxml/include/libxml/list.h +137 -0
  81. package/vendor/libxml/include/libxml/nanoftp.h +163 -0
  82. package/vendor/libxml/include/libxml/nanohttp.h +81 -0
  83. package/vendor/libxml/include/libxml/parser.h +1243 -0
  84. package/vendor/libxml/include/libxml/parserInternals.h +644 -0
  85. package/vendor/libxml/include/libxml/pattern.h +100 -0
  86. package/vendor/libxml/include/libxml/relaxng.h +217 -0
  87. package/vendor/libxml/include/libxml/schemasInternals.h +958 -0
  88. package/vendor/libxml/include/libxml/schematron.h +142 -0
  89. package/vendor/libxml/include/libxml/threads.h +89 -0
  90. package/vendor/libxml/include/libxml/tree.h +1311 -0
  91. package/vendor/libxml/include/libxml/uri.h +94 -0
  92. package/vendor/libxml/include/libxml/valid.h +458 -0
  93. package/vendor/libxml/include/libxml/xinclude.h +129 -0
  94. package/vendor/libxml/include/libxml/xlink.h +189 -0
  95. package/vendor/libxml/include/libxml/xmlIO.h +368 -0
  96. package/vendor/libxml/include/libxml/xmlautomata.h +146 -0
  97. package/vendor/libxml/include/libxml/xmlerror.h +945 -0
  98. package/vendor/libxml/include/libxml/xmlexports.h +77 -0
  99. package/vendor/libxml/include/libxml/xmlmemory.h +224 -0
  100. package/vendor/libxml/include/libxml/xmlmodule.h +57 -0
  101. package/vendor/libxml/include/libxml/xmlreader.h +428 -0
  102. package/vendor/libxml/include/libxml/xmlregexp.h +222 -0
  103. package/vendor/libxml/include/libxml/xmlsave.h +88 -0
  104. package/vendor/libxml/include/libxml/xmlschemas.h +246 -0
  105. package/vendor/libxml/include/libxml/xmlschemastypes.h +151 -0
  106. package/vendor/libxml/include/libxml/xmlstring.h +140 -0
  107. package/vendor/libxml/include/libxml/xmlunicode.h +202 -0
  108. package/vendor/libxml/include/libxml/xmlversion.h +484 -0
  109. package/vendor/libxml/include/libxml/xmlwin32version.h +239 -0
  110. package/vendor/libxml/include/libxml/xmlwriter.h +488 -0
  111. package/vendor/libxml/include/libxml/xpath.h +564 -0
  112. package/vendor/libxml/include/libxml/xpathInternals.h +632 -0
  113. package/vendor/libxml/include/libxml/xpointer.h +114 -0
  114. package/vendor/libxml/include/win32config.h +122 -0
  115. package/vendor/libxml/include/wsockcompat.h +54 -0
  116. package/vendor/libxml/legacy.c +1343 -0
  117. package/vendor/libxml/libxml.h +134 -0
  118. package/vendor/libxml/list.c +779 -0
  119. package/vendor/libxml/nanoftp.c +2118 -0
  120. package/vendor/libxml/nanohttp.c +1899 -0
  121. package/vendor/libxml/parser.c +15553 -0
  122. package/vendor/libxml/parserInternals.c +2164 -0
  123. package/vendor/libxml/pattern.c +2621 -0
  124. package/vendor/libxml/relaxng.c +11101 -0
  125. package/vendor/libxml/rngparser.c +1595 -0
  126. package/vendor/libxml/runsuite.c +1157 -0
  127. package/vendor/libxml/save.h +36 -0
  128. package/vendor/libxml/schematron.c +1787 -0
  129. package/vendor/libxml/threads.c +1049 -0
  130. package/vendor/libxml/timsort.h +601 -0
  131. package/vendor/libxml/tree.c +10183 -0
  132. package/vendor/libxml/trio.c +6895 -0
  133. package/vendor/libxml/trio.h +230 -0
  134. package/vendor/libxml/triodef.h +228 -0
  135. package/vendor/libxml/trionan.c +914 -0
  136. package/vendor/libxml/trionan.h +84 -0
  137. package/vendor/libxml/triop.h +150 -0
  138. package/vendor/libxml/triostr.c +2112 -0
  139. package/vendor/libxml/triostr.h +144 -0
  140. package/vendor/libxml/uri.c +2561 -0
  141. package/vendor/libxml/valid.c +7138 -0
  142. package/vendor/libxml/xinclude.c +2657 -0
  143. package/vendor/libxml/xlink.c +183 -0
  144. package/vendor/libxml/xmlIO.c +4135 -0
  145. package/vendor/libxml/xmlcatalog.c +624 -0
  146. package/vendor/libxml/xmllint.c +3796 -0
  147. package/vendor/libxml/xmlmemory.c +1163 -0
  148. package/vendor/libxml/xmlmodule.c +468 -0
  149. package/vendor/libxml/xmlreader.c +6033 -0
  150. package/vendor/libxml/xmlregexp.c +8271 -0
  151. package/vendor/libxml/xmlsave.c +2735 -0
  152. package/vendor/libxml/xmlschemas.c +29173 -0
  153. package/vendor/libxml/xmlschemastypes.c +6276 -0
  154. package/vendor/libxml/xmlstring.c +1050 -0
  155. package/vendor/libxml/xmlunicode.c +3179 -0
  156. package/vendor/libxml/xmlwriter.c +4738 -0
  157. package/vendor/libxml/xpath.c +14734 -0
  158. package/vendor/libxml/xpointer.c +2969 -0
  159. package/vendor/libxml/xzlib.c +815 -0
  160. package/vendor/libxml/xzlib.h +19 -0
@@ -0,0 +1,1163 @@
1
+ /*
2
+ * xmlmemory.c: libxml memory allocator wrapper.
3
+ *
4
+ * daniel@veillard.com
5
+ */
6
+
7
+ #define IN_LIBXML
8
+ #include "libxml.h"
9
+
10
+ #include <string.h>
11
+
12
+ #ifdef HAVE_SYS_TYPES_H
13
+ #include <sys/types.h>
14
+ #endif
15
+
16
+ #ifdef HAVE_TIME_H
17
+ #include <time.h>
18
+ #endif
19
+
20
+ #ifdef HAVE_STDLIB_H
21
+ #include <stdlib.h>
22
+ #else
23
+ #ifdef HAVE_MALLOC_H
24
+ #include <malloc.h>
25
+ #endif
26
+ #endif
27
+
28
+ #ifdef HAVE_CTYPE_H
29
+ #include <ctype.h>
30
+ #endif
31
+
32
+ /* #define DEBUG_MEMORY */
33
+
34
+ /**
35
+ * MEM_LIST:
36
+ *
37
+ * keep track of all allocated blocks for error reporting
38
+ * Always build the memory list !
39
+ */
40
+ #ifdef DEBUG_MEMORY_LOCATION
41
+ #ifndef MEM_LIST
42
+ #define MEM_LIST /* keep a list of all the allocated memory blocks */
43
+ #endif
44
+ #endif
45
+
46
+ #include <libxml/globals.h> /* must come before xmlmemory.h */
47
+ #include <libxml/xmlmemory.h>
48
+ #include <libxml/xmlerror.h>
49
+ #include <libxml/threads.h>
50
+
51
+ static int xmlMemInitialized = 0;
52
+ static unsigned long debugMemSize = 0;
53
+ static unsigned long debugMemBlocks = 0;
54
+ static unsigned long debugMaxMemSize = 0;
55
+ static xmlMutexPtr xmlMemMutex = NULL;
56
+
57
+ void xmlMallocBreakpoint(void);
58
+
59
+ /************************************************************************
60
+ * *
61
+ * Macros, variables and associated types *
62
+ * *
63
+ ************************************************************************/
64
+
65
+ #if !defined(LIBXML_THREAD_ENABLED) && !defined(LIBXML_THREAD_ALLOC_ENABLED)
66
+ #ifdef xmlMalloc
67
+ #undef xmlMalloc
68
+ #endif
69
+ #ifdef xmlRealloc
70
+ #undef xmlRealloc
71
+ #endif
72
+ #ifdef xmlMemStrdup
73
+ #undef xmlMemStrdup
74
+ #endif
75
+ #endif
76
+
77
+ /*
78
+ * Each of the blocks allocated begin with a header containing information
79
+ */
80
+
81
+ #define MEMTAG 0x5aa5
82
+
83
+ #define MALLOC_TYPE 1
84
+ #define REALLOC_TYPE 2
85
+ #define STRDUP_TYPE 3
86
+ #define MALLOC_ATOMIC_TYPE 4
87
+ #define REALLOC_ATOMIC_TYPE 5
88
+
89
+ typedef struct memnod {
90
+ unsigned int mh_tag;
91
+ unsigned int mh_type;
92
+ unsigned long mh_number;
93
+ size_t mh_size;
94
+ #ifdef MEM_LIST
95
+ struct memnod *mh_next;
96
+ struct memnod *mh_prev;
97
+ #endif
98
+ const char *mh_file;
99
+ unsigned int mh_line;
100
+ } MEMHDR;
101
+
102
+
103
+ #ifdef SUN4
104
+ #define ALIGN_SIZE 16
105
+ #else
106
+ #define ALIGN_SIZE sizeof(double)
107
+ #endif
108
+ #define HDR_SIZE sizeof(MEMHDR)
109
+ #define RESERVE_SIZE (((HDR_SIZE + (ALIGN_SIZE-1)) \
110
+ / ALIGN_SIZE ) * ALIGN_SIZE)
111
+
112
+ #define MAX_SIZE_T ((size_t)-1)
113
+
114
+ #define CLIENT_2_HDR(a) ((void *) (((char *) (a)) - RESERVE_SIZE))
115
+ #define HDR_2_CLIENT(a) ((void *) (((char *) (a)) + RESERVE_SIZE))
116
+
117
+
118
+ static unsigned int block=0;
119
+ static unsigned int xmlMemStopAtBlock = 0;
120
+ static void *xmlMemTraceBlockAt = NULL;
121
+ #ifdef MEM_LIST
122
+ static MEMHDR *memlist = NULL;
123
+ #endif
124
+
125
+ static void debugmem_tag_error(void *addr);
126
+ #ifdef MEM_LIST
127
+ static void debugmem_list_add(MEMHDR *);
128
+ static void debugmem_list_delete(MEMHDR *);
129
+ #endif
130
+ #define Mem_Tag_Err(a) debugmem_tag_error(a);
131
+
132
+ #ifndef TEST_POINT
133
+ #define TEST_POINT
134
+ #endif
135
+
136
+ /**
137
+ * xmlMallocBreakpoint:
138
+ *
139
+ * Breakpoint to use in conjunction with xmlMemStopAtBlock. When the block
140
+ * number reaches the specified value this function is called. One need to add a breakpoint
141
+ * to it to get the context in which the given block is allocated.
142
+ */
143
+
144
+ void
145
+ xmlMallocBreakpoint(void) {
146
+ xmlGenericError(xmlGenericErrorContext,
147
+ "xmlMallocBreakpoint reached on block %d\n", xmlMemStopAtBlock);
148
+ }
149
+
150
+ /**
151
+ * xmlMallocLoc:
152
+ * @size: an int specifying the size in byte to allocate.
153
+ * @file: the file name or NULL
154
+ * @line: the line number
155
+ *
156
+ * a malloc() equivalent, with logging of the allocation info.
157
+ *
158
+ * Returns a pointer to the allocated area or NULL in case of lack of memory.
159
+ */
160
+
161
+ void *
162
+ xmlMallocLoc(size_t size, const char * file, int line)
163
+ {
164
+ MEMHDR *p;
165
+ void *ret;
166
+
167
+ if (!xmlMemInitialized) xmlInitMemory();
168
+ #ifdef DEBUG_MEMORY
169
+ xmlGenericError(xmlGenericErrorContext,
170
+ "Malloc(%d)\n",size);
171
+ #endif
172
+
173
+ TEST_POINT
174
+
175
+ if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
176
+ xmlGenericError(xmlGenericErrorContext,
177
+ "xmlMallocLoc : Unsigned overflow\n");
178
+ xmlMemoryDump();
179
+ return(NULL);
180
+ }
181
+
182
+ p = (MEMHDR *) malloc(RESERVE_SIZE+size);
183
+
184
+ if (!p) {
185
+ xmlGenericError(xmlGenericErrorContext,
186
+ "xmlMallocLoc : Out of free space\n");
187
+ xmlMemoryDump();
188
+ return(NULL);
189
+ }
190
+ p->mh_tag = MEMTAG;
191
+ p->mh_size = size;
192
+ p->mh_type = MALLOC_TYPE;
193
+ p->mh_file = file;
194
+ p->mh_line = line;
195
+ xmlMutexLock(xmlMemMutex);
196
+ p->mh_number = ++block;
197
+ debugMemSize += size;
198
+ debugMemBlocks++;
199
+ if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize;
200
+ #ifdef MEM_LIST
201
+ debugmem_list_add(p);
202
+ #endif
203
+ xmlMutexUnlock(xmlMemMutex);
204
+
205
+ #ifdef DEBUG_MEMORY
206
+ xmlGenericError(xmlGenericErrorContext,
207
+ "Malloc(%d) Ok\n",size);
208
+ #endif
209
+
210
+ if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint();
211
+
212
+ ret = HDR_2_CLIENT(p);
213
+
214
+ if (xmlMemTraceBlockAt == ret) {
215
+ xmlGenericError(xmlGenericErrorContext,
216
+ "%p : Malloc(%lu) Ok\n", xmlMemTraceBlockAt,
217
+ (long unsigned)size);
218
+ xmlMallocBreakpoint();
219
+ }
220
+
221
+ TEST_POINT
222
+
223
+ return(ret);
224
+ }
225
+
226
+ /**
227
+ * xmlMallocAtomicLoc:
228
+ * @size: an unsigned int specifying the size in byte to allocate.
229
+ * @file: the file name or NULL
230
+ * @line: the line number
231
+ *
232
+ * a malloc() equivalent, with logging of the allocation info.
233
+ *
234
+ * Returns a pointer to the allocated area or NULL in case of lack of memory.
235
+ */
236
+
237
+ void *
238
+ xmlMallocAtomicLoc(size_t size, const char * file, int line)
239
+ {
240
+ MEMHDR *p;
241
+ void *ret;
242
+
243
+ if (!xmlMemInitialized) xmlInitMemory();
244
+ #ifdef DEBUG_MEMORY
245
+ xmlGenericError(xmlGenericErrorContext,
246
+ "Malloc(%d)\n",size);
247
+ #endif
248
+
249
+ TEST_POINT
250
+
251
+ if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
252
+ xmlGenericError(xmlGenericErrorContext,
253
+ "xmlMallocAtomicLoc : Unsigned overflow\n");
254
+ xmlMemoryDump();
255
+ return(NULL);
256
+ }
257
+
258
+ p = (MEMHDR *) malloc(RESERVE_SIZE+size);
259
+
260
+ if (!p) {
261
+ xmlGenericError(xmlGenericErrorContext,
262
+ "xmlMallocAtomicLoc : Out of free space\n");
263
+ xmlMemoryDump();
264
+ return(NULL);
265
+ }
266
+ p->mh_tag = MEMTAG;
267
+ p->mh_size = size;
268
+ p->mh_type = MALLOC_ATOMIC_TYPE;
269
+ p->mh_file = file;
270
+ p->mh_line = line;
271
+ xmlMutexLock(xmlMemMutex);
272
+ p->mh_number = ++block;
273
+ debugMemSize += size;
274
+ debugMemBlocks++;
275
+ if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize;
276
+ #ifdef MEM_LIST
277
+ debugmem_list_add(p);
278
+ #endif
279
+ xmlMutexUnlock(xmlMemMutex);
280
+
281
+ #ifdef DEBUG_MEMORY
282
+ xmlGenericError(xmlGenericErrorContext,
283
+ "Malloc(%d) Ok\n",size);
284
+ #endif
285
+
286
+ if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint();
287
+
288
+ ret = HDR_2_CLIENT(p);
289
+
290
+ if (xmlMemTraceBlockAt == ret) {
291
+ xmlGenericError(xmlGenericErrorContext,
292
+ "%p : Malloc(%lu) Ok\n", xmlMemTraceBlockAt,
293
+ (long unsigned)size);
294
+ xmlMallocBreakpoint();
295
+ }
296
+
297
+ TEST_POINT
298
+
299
+ return(ret);
300
+ }
301
+ /**
302
+ * xmlMemMalloc:
303
+ * @size: an int specifying the size in byte to allocate.
304
+ *
305
+ * a malloc() equivalent, with logging of the allocation info.
306
+ *
307
+ * Returns a pointer to the allocated area or NULL in case of lack of memory.
308
+ */
309
+
310
+ void *
311
+ xmlMemMalloc(size_t size)
312
+ {
313
+ return(xmlMallocLoc(size, "none", 0));
314
+ }
315
+
316
+ /**
317
+ * xmlReallocLoc:
318
+ * @ptr: the initial memory block pointer
319
+ * @size: an int specifying the size in byte to allocate.
320
+ * @file: the file name or NULL
321
+ * @line: the line number
322
+ *
323
+ * a realloc() equivalent, with logging of the allocation info.
324
+ *
325
+ * Returns a pointer to the allocated area or NULL in case of lack of memory.
326
+ */
327
+
328
+ void *
329
+ xmlReallocLoc(void *ptr,size_t size, const char * file, int line)
330
+ {
331
+ MEMHDR *p, *tmp;
332
+ unsigned long number;
333
+ #ifdef DEBUG_MEMORY
334
+ size_t oldsize;
335
+ #endif
336
+
337
+ if (ptr == NULL)
338
+ return(xmlMallocLoc(size, file, line));
339
+
340
+ if (!xmlMemInitialized) xmlInitMemory();
341
+ TEST_POINT
342
+
343
+ p = CLIENT_2_HDR(ptr);
344
+ number = p->mh_number;
345
+ if (xmlMemStopAtBlock == number) xmlMallocBreakpoint();
346
+ if (p->mh_tag != MEMTAG) {
347
+ Mem_Tag_Err(p);
348
+ goto error;
349
+ }
350
+ p->mh_tag = ~MEMTAG;
351
+ xmlMutexLock(xmlMemMutex);
352
+ debugMemSize -= p->mh_size;
353
+ debugMemBlocks--;
354
+ #ifdef DEBUG_MEMORY
355
+ oldsize = p->mh_size;
356
+ #endif
357
+ #ifdef MEM_LIST
358
+ debugmem_list_delete(p);
359
+ #endif
360
+ xmlMutexUnlock(xmlMemMutex);
361
+
362
+ if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
363
+ xmlGenericError(xmlGenericErrorContext,
364
+ "xmlReallocLoc : Unsigned overflow\n");
365
+ xmlMemoryDump();
366
+ return(NULL);
367
+ }
368
+
369
+ tmp = (MEMHDR *) realloc(p,RESERVE_SIZE+size);
370
+ if (!tmp) {
371
+ free(p);
372
+ goto error;
373
+ }
374
+ p = tmp;
375
+ if (xmlMemTraceBlockAt == ptr) {
376
+ xmlGenericError(xmlGenericErrorContext,
377
+ "%p : Realloced(%lu -> %lu) Ok\n",
378
+ xmlMemTraceBlockAt, (long unsigned)p->mh_size,
379
+ (long unsigned)size);
380
+ xmlMallocBreakpoint();
381
+ }
382
+ p->mh_tag = MEMTAG;
383
+ p->mh_number = number;
384
+ p->mh_type = REALLOC_TYPE;
385
+ p->mh_size = size;
386
+ p->mh_file = file;
387
+ p->mh_line = line;
388
+ xmlMutexLock(xmlMemMutex);
389
+ debugMemSize += size;
390
+ debugMemBlocks++;
391
+ if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize;
392
+ #ifdef MEM_LIST
393
+ debugmem_list_add(p);
394
+ #endif
395
+ xmlMutexUnlock(xmlMemMutex);
396
+
397
+ TEST_POINT
398
+
399
+ #ifdef DEBUG_MEMORY
400
+ xmlGenericError(xmlGenericErrorContext,
401
+ "Realloced(%d to %d) Ok\n", oldsize, size);
402
+ #endif
403
+ return(HDR_2_CLIENT(p));
404
+
405
+ error:
406
+ return(NULL);
407
+ }
408
+
409
+ /**
410
+ * xmlMemRealloc:
411
+ * @ptr: the initial memory block pointer
412
+ * @size: an int specifying the size in byte to allocate.
413
+ *
414
+ * a realloc() equivalent, with logging of the allocation info.
415
+ *
416
+ * Returns a pointer to the allocated area or NULL in case of lack of memory.
417
+ */
418
+
419
+ void *
420
+ xmlMemRealloc(void *ptr,size_t size) {
421
+ return(xmlReallocLoc(ptr, size, "none", 0));
422
+ }
423
+
424
+ /**
425
+ * xmlMemFree:
426
+ * @ptr: the memory block pointer
427
+ *
428
+ * a free() equivalent, with error checking.
429
+ */
430
+ void
431
+ xmlMemFree(void *ptr)
432
+ {
433
+ MEMHDR *p;
434
+ char *target;
435
+ #ifdef DEBUG_MEMORY
436
+ size_t size;
437
+ #endif
438
+
439
+ if (ptr == NULL)
440
+ return;
441
+
442
+ if (ptr == (void *) -1) {
443
+ xmlGenericError(xmlGenericErrorContext,
444
+ "trying to free pointer from freed area\n");
445
+ goto error;
446
+ }
447
+
448
+ if (xmlMemTraceBlockAt == ptr) {
449
+ xmlGenericError(xmlGenericErrorContext,
450
+ "%p : Freed()\n", xmlMemTraceBlockAt);
451
+ xmlMallocBreakpoint();
452
+ }
453
+
454
+ TEST_POINT
455
+
456
+ target = (char *) ptr;
457
+
458
+ p = CLIENT_2_HDR(ptr);
459
+ if (p->mh_tag != MEMTAG) {
460
+ Mem_Tag_Err(p);
461
+ goto error;
462
+ }
463
+ if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint();
464
+ p->mh_tag = ~MEMTAG;
465
+ memset(target, -1, p->mh_size);
466
+ xmlMutexLock(xmlMemMutex);
467
+ debugMemSize -= p->mh_size;
468
+ debugMemBlocks--;
469
+ #ifdef DEBUG_MEMORY
470
+ size = p->mh_size;
471
+ #endif
472
+ #ifdef MEM_LIST
473
+ debugmem_list_delete(p);
474
+ #endif
475
+ xmlMutexUnlock(xmlMemMutex);
476
+
477
+ free(p);
478
+
479
+ TEST_POINT
480
+
481
+ #ifdef DEBUG_MEMORY
482
+ xmlGenericError(xmlGenericErrorContext,
483
+ "Freed(%d) Ok\n", size);
484
+ #endif
485
+
486
+ return;
487
+
488
+ error:
489
+ xmlGenericError(xmlGenericErrorContext,
490
+ "xmlMemFree(%p) error\n", ptr);
491
+ xmlMallocBreakpoint();
492
+ return;
493
+ }
494
+
495
+ /**
496
+ * xmlMemStrdupLoc:
497
+ * @str: the initial string pointer
498
+ * @file: the file name or NULL
499
+ * @line: the line number
500
+ *
501
+ * a strdup() equivalent, with logging of the allocation info.
502
+ *
503
+ * Returns a pointer to the new string or NULL if allocation error occurred.
504
+ */
505
+
506
+ char *
507
+ xmlMemStrdupLoc(const char *str, const char *file, int line)
508
+ {
509
+ char *s;
510
+ size_t size = strlen(str) + 1;
511
+ MEMHDR *p;
512
+
513
+ if (!xmlMemInitialized) xmlInitMemory();
514
+ TEST_POINT
515
+
516
+ if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
517
+ xmlGenericError(xmlGenericErrorContext,
518
+ "xmlMemStrdupLoc : Unsigned overflow\n");
519
+ xmlMemoryDump();
520
+ return(NULL);
521
+ }
522
+
523
+ p = (MEMHDR *) malloc(RESERVE_SIZE+size);
524
+ if (!p) {
525
+ goto error;
526
+ }
527
+ p->mh_tag = MEMTAG;
528
+ p->mh_size = size;
529
+ p->mh_type = STRDUP_TYPE;
530
+ p->mh_file = file;
531
+ p->mh_line = line;
532
+ xmlMutexLock(xmlMemMutex);
533
+ p->mh_number = ++block;
534
+ debugMemSize += size;
535
+ debugMemBlocks++;
536
+ if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize;
537
+ #ifdef MEM_LIST
538
+ debugmem_list_add(p);
539
+ #endif
540
+ xmlMutexUnlock(xmlMemMutex);
541
+
542
+ s = (char *) HDR_2_CLIENT(p);
543
+
544
+ if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint();
545
+
546
+ strcpy(s,str);
547
+
548
+ TEST_POINT
549
+
550
+ if (xmlMemTraceBlockAt == s) {
551
+ xmlGenericError(xmlGenericErrorContext,
552
+ "%p : Strdup() Ok\n", xmlMemTraceBlockAt);
553
+ xmlMallocBreakpoint();
554
+ }
555
+
556
+ return(s);
557
+
558
+ error:
559
+ return(NULL);
560
+ }
561
+
562
+ /**
563
+ * xmlMemoryStrdup:
564
+ * @str: the initial string pointer
565
+ *
566
+ * a strdup() equivalent, with logging of the allocation info.
567
+ *
568
+ * Returns a pointer to the new string or NULL if allocation error occurred.
569
+ */
570
+
571
+ char *
572
+ xmlMemoryStrdup(const char *str) {
573
+ return(xmlMemStrdupLoc(str, "none", 0));
574
+ }
575
+
576
+ /**
577
+ * xmlMemUsed:
578
+ *
579
+ * Provides the amount of memory currently allocated
580
+ *
581
+ * Returns an int representing the amount of memory allocated.
582
+ */
583
+
584
+ int
585
+ xmlMemUsed(void) {
586
+ int res;
587
+
588
+ xmlMutexLock(xmlMemMutex);
589
+ res = debugMemSize;
590
+ xmlMutexUnlock(xmlMemMutex);
591
+ return(res);
592
+ }
593
+
594
+ /**
595
+ * xmlMemBlocks:
596
+ *
597
+ * Provides the number of memory areas currently allocated
598
+ *
599
+ * Returns an int representing the number of blocks
600
+ */
601
+
602
+ int
603
+ xmlMemBlocks(void) {
604
+ int res;
605
+
606
+ xmlMutexLock(xmlMemMutex);
607
+ res = debugMemBlocks;
608
+ xmlMutexUnlock(xmlMemMutex);
609
+ return(res);
610
+ }
611
+
612
+ #ifdef MEM_LIST
613
+ /**
614
+ * xmlMemContentShow:
615
+ * @fp: a FILE descriptor used as the output file
616
+ * @p: a memory block header
617
+ *
618
+ * tries to show some content from the memory block
619
+ */
620
+
621
+ static void
622
+ xmlMemContentShow(FILE *fp, MEMHDR *p)
623
+ {
624
+ int i,j,k,len;
625
+ const char *buf;
626
+
627
+ if (p == NULL) {
628
+ fprintf(fp, " NULL");
629
+ return;
630
+ }
631
+ len = p->mh_size;
632
+ buf = (const char *) HDR_2_CLIENT(p);
633
+
634
+ for (i = 0;i < len;i++) {
635
+ if (buf[i] == 0) break;
636
+ if (!isprint((unsigned char) buf[i])) break;
637
+ }
638
+ if ((i < 4) && ((buf[i] != 0) || (i == 0))) {
639
+ if (len >= 4) {
640
+ MEMHDR *q;
641
+ void *cur;
642
+
643
+ for (j = 0;(j < len -3) && (j < 40);j += 4) {
644
+ cur = *((void **) &buf[j]);
645
+ q = CLIENT_2_HDR(cur);
646
+ p = memlist;
647
+ k = 0;
648
+ while (p != NULL) {
649
+ if (p == q) break;
650
+ p = p->mh_next;
651
+ if (k++ > 100) break;
652
+ }
653
+ if ((p != NULL) && (p == q)) {
654
+ fprintf(fp, " pointer to #%lu at index %d",
655
+ p->mh_number, j);
656
+ return;
657
+ }
658
+ }
659
+ }
660
+ } else if ((i == 0) && (buf[i] == 0)) {
661
+ fprintf(fp," null");
662
+ } else {
663
+ if (buf[i] == 0) fprintf(fp," \"%.25s\"", buf);
664
+ else {
665
+ fprintf(fp," [");
666
+ for (j = 0;j < i;j++)
667
+ fprintf(fp,"%c", buf[j]);
668
+ fprintf(fp,"]");
669
+ }
670
+ }
671
+ }
672
+ #endif
673
+
674
+ /**
675
+ * xmlMemDisplayLast:
676
+ * @fp: a FILE descriptor used as the output file, if NULL, the result is
677
+ * written to the file .memorylist
678
+ * @nbBytes: the amount of memory to dump
679
+ *
680
+ * the last nbBytes of memory allocated and not freed, useful for dumping
681
+ * the memory left allocated between two places at runtime.
682
+ */
683
+
684
+ void
685
+ xmlMemDisplayLast(FILE *fp, long nbBytes)
686
+ {
687
+ #ifdef MEM_LIST
688
+ MEMHDR *p;
689
+ unsigned idx;
690
+ int nb = 0;
691
+ #endif
692
+ FILE *old_fp = fp;
693
+
694
+ if (nbBytes <= 0)
695
+ return;
696
+
697
+ if (fp == NULL) {
698
+ fp = fopen(".memorylist", "w");
699
+ if (fp == NULL)
700
+ return;
701
+ }
702
+
703
+ #ifdef MEM_LIST
704
+ fprintf(fp," Last %li MEMORY ALLOCATED : %lu, MAX was %lu\n",
705
+ nbBytes, debugMemSize, debugMaxMemSize);
706
+ fprintf(fp,"BLOCK NUMBER SIZE TYPE\n");
707
+ idx = 0;
708
+ xmlMutexLock(xmlMemMutex);
709
+ p = memlist;
710
+ while ((p) && (nbBytes > 0)) {
711
+ fprintf(fp,"%-5u %6lu %6lu ",idx++,p->mh_number,
712
+ (unsigned long)p->mh_size);
713
+ switch (p->mh_type) {
714
+ case STRDUP_TYPE:fprintf(fp,"strdup() in ");break;
715
+ case MALLOC_TYPE:fprintf(fp,"malloc() in ");break;
716
+ case REALLOC_TYPE:fprintf(fp,"realloc() in ");break;
717
+ case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break;
718
+ case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break;
719
+ default:
720
+ fprintf(fp,"Unknown memory block, may be corrupted");
721
+ xmlMutexUnlock(xmlMemMutex);
722
+ if (old_fp == NULL)
723
+ fclose(fp);
724
+ return;
725
+ }
726
+ if (p->mh_file != NULL) fprintf(fp,"%s(%u)", p->mh_file, p->mh_line);
727
+ if (p->mh_tag != MEMTAG)
728
+ fprintf(fp," INVALID");
729
+ nb++;
730
+ if (nb < 100)
731
+ xmlMemContentShow(fp, p);
732
+ else
733
+ fprintf(fp," skip");
734
+
735
+ fprintf(fp,"\n");
736
+ nbBytes -= (unsigned long)p->mh_size;
737
+ p = p->mh_next;
738
+ }
739
+ xmlMutexUnlock(xmlMemMutex);
740
+ #else
741
+ fprintf(fp,"Memory list not compiled (MEM_LIST not defined !)\n");
742
+ #endif
743
+ if (old_fp == NULL)
744
+ fclose(fp);
745
+ }
746
+
747
+ /**
748
+ * xmlMemDisplay:
749
+ * @fp: a FILE descriptor used as the output file, if NULL, the result is
750
+ * written to the file .memorylist
751
+ *
752
+ * show in-extenso the memory blocks allocated
753
+ */
754
+
755
+ void
756
+ xmlMemDisplay(FILE *fp)
757
+ {
758
+ #ifdef MEM_LIST
759
+ MEMHDR *p;
760
+ unsigned idx;
761
+ int nb = 0;
762
+ #if defined(HAVE_LOCALTIME) && defined(HAVE_STRFTIME)
763
+ time_t currentTime;
764
+ char buf[500];
765
+ struct tm * tstruct;
766
+ #endif
767
+ #endif
768
+ FILE *old_fp = fp;
769
+
770
+ if (fp == NULL) {
771
+ fp = fopen(".memorylist", "w");
772
+ if (fp == NULL)
773
+ return;
774
+ }
775
+
776
+ #ifdef MEM_LIST
777
+ #if defined(HAVE_LOCALTIME) && defined(HAVE_STRFTIME)
778
+ currentTime = time(NULL);
779
+ tstruct = localtime(&currentTime);
780
+ strftime(buf, sizeof(buf) - 1, "%I:%M:%S %p", tstruct);
781
+ fprintf(fp," %s\n\n", buf);
782
+ #endif
783
+
784
+
785
+ fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n",
786
+ debugMemSize, debugMaxMemSize);
787
+ fprintf(fp,"BLOCK NUMBER SIZE TYPE\n");
788
+ idx = 0;
789
+ xmlMutexLock(xmlMemMutex);
790
+ p = memlist;
791
+ while (p) {
792
+ fprintf(fp,"%-5u %6lu %6lu ",idx++,p->mh_number,
793
+ (unsigned long)p->mh_size);
794
+ switch (p->mh_type) {
795
+ case STRDUP_TYPE:fprintf(fp,"strdup() in ");break;
796
+ case MALLOC_TYPE:fprintf(fp,"malloc() in ");break;
797
+ case REALLOC_TYPE:fprintf(fp,"realloc() in ");break;
798
+ case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break;
799
+ case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break;
800
+ default:
801
+ fprintf(fp,"Unknown memory block, may be corrupted");
802
+ xmlMutexUnlock(xmlMemMutex);
803
+ if (old_fp == NULL)
804
+ fclose(fp);
805
+ return;
806
+ }
807
+ if (p->mh_file != NULL) fprintf(fp,"%s(%u)", p->mh_file, p->mh_line);
808
+ if (p->mh_tag != MEMTAG)
809
+ fprintf(fp," INVALID");
810
+ nb++;
811
+ if (nb < 100)
812
+ xmlMemContentShow(fp, p);
813
+ else
814
+ fprintf(fp," skip");
815
+
816
+ fprintf(fp,"\n");
817
+ p = p->mh_next;
818
+ }
819
+ xmlMutexUnlock(xmlMemMutex);
820
+ #else
821
+ fprintf(fp,"Memory list not compiled (MEM_LIST not defined !)\n");
822
+ #endif
823
+ if (old_fp == NULL)
824
+ fclose(fp);
825
+ }
826
+
827
+ #ifdef MEM_LIST
828
+
829
+ static void debugmem_list_add(MEMHDR *p)
830
+ {
831
+ p->mh_next = memlist;
832
+ p->mh_prev = NULL;
833
+ if (memlist) memlist->mh_prev = p;
834
+ memlist = p;
835
+ #ifdef MEM_LIST_DEBUG
836
+ if (stderr)
837
+ Mem_Display(stderr);
838
+ #endif
839
+ }
840
+
841
+ static void debugmem_list_delete(MEMHDR *p)
842
+ {
843
+ if (p->mh_next)
844
+ p->mh_next->mh_prev = p->mh_prev;
845
+ if (p->mh_prev)
846
+ p->mh_prev->mh_next = p->mh_next;
847
+ else memlist = p->mh_next;
848
+ #ifdef MEM_LIST_DEBUG
849
+ if (stderr)
850
+ Mem_Display(stderr);
851
+ #endif
852
+ }
853
+
854
+ #endif
855
+
856
+ /*
857
+ * debugmem_tag_error:
858
+ *
859
+ * internal error function.
860
+ */
861
+
862
+ static void debugmem_tag_error(void *p)
863
+ {
864
+ xmlGenericError(xmlGenericErrorContext,
865
+ "Memory tag error occurs :%p \n\t bye\n", p);
866
+ #ifdef MEM_LIST
867
+ if (stderr)
868
+ xmlMemDisplay(stderr);
869
+ #endif
870
+ }
871
+
872
+ #ifdef MEM_LIST
873
+ static FILE *xmlMemoryDumpFile = NULL;
874
+ #endif
875
+
876
+ /**
877
+ * xmlMemShow:
878
+ * @fp: a FILE descriptor used as the output file
879
+ * @nr: number of entries to dump
880
+ *
881
+ * show a show display of the memory allocated, and dump
882
+ * the @nr last allocated areas which were not freed
883
+ */
884
+
885
+ void
886
+ xmlMemShow(FILE *fp, int nr ATTRIBUTE_UNUSED)
887
+ {
888
+ #ifdef MEM_LIST
889
+ MEMHDR *p;
890
+ #endif
891
+
892
+ if (fp != NULL)
893
+ fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n",
894
+ debugMemSize, debugMaxMemSize);
895
+ #ifdef MEM_LIST
896
+ xmlMutexLock(xmlMemMutex);
897
+ if (nr > 0) {
898
+ fprintf(fp,"NUMBER SIZE TYPE WHERE\n");
899
+ p = memlist;
900
+ while ((p) && nr > 0) {
901
+ fprintf(fp,"%6lu %6lu ",p->mh_number,(unsigned long)p->mh_size);
902
+ switch (p->mh_type) {
903
+ case STRDUP_TYPE:fprintf(fp,"strdup() in ");break;
904
+ case MALLOC_TYPE:fprintf(fp,"malloc() in ");break;
905
+ case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break;
906
+ case REALLOC_TYPE:fprintf(fp,"realloc() in ");break;
907
+ case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break;
908
+ default:fprintf(fp," ??? in ");break;
909
+ }
910
+ if (p->mh_file != NULL)
911
+ fprintf(fp,"%s(%u)", p->mh_file, p->mh_line);
912
+ if (p->mh_tag != MEMTAG)
913
+ fprintf(fp," INVALID");
914
+ xmlMemContentShow(fp, p);
915
+ fprintf(fp,"\n");
916
+ nr--;
917
+ p = p->mh_next;
918
+ }
919
+ }
920
+ xmlMutexUnlock(xmlMemMutex);
921
+ #endif /* MEM_LIST */
922
+ }
923
+
924
+ /**
925
+ * xmlMemoryDump:
926
+ *
927
+ * Dump in-extenso the memory blocks allocated to the file .memorylist
928
+ */
929
+
930
+ void
931
+ xmlMemoryDump(void)
932
+ {
933
+ #ifdef MEM_LIST
934
+ FILE *dump;
935
+
936
+ if (debugMaxMemSize == 0)
937
+ return;
938
+ dump = fopen(".memdump", "w");
939
+ if (dump == NULL)
940
+ xmlMemoryDumpFile = stderr;
941
+ else xmlMemoryDumpFile = dump;
942
+
943
+ xmlMemDisplay(xmlMemoryDumpFile);
944
+
945
+ if (dump != NULL) fclose(dump);
946
+ #endif /* MEM_LIST */
947
+ }
948
+
949
+
950
+ /****************************************************************
951
+ * *
952
+ * Initialization Routines *
953
+ * *
954
+ ****************************************************************/
955
+
956
+ /**
957
+ * xmlInitMemory:
958
+ *
959
+ * Initialize the memory layer.
960
+ *
961
+ * Returns 0 on success
962
+ */
963
+ int
964
+ xmlInitMemory(void)
965
+ {
966
+ #ifdef HAVE_STDLIB_H
967
+ char *breakpoint;
968
+ #endif
969
+ #ifdef DEBUG_MEMORY
970
+ xmlGenericError(xmlGenericErrorContext,
971
+ "xmlInitMemory()\n");
972
+ #endif
973
+ /*
974
+ This is really not good code (see Bug 130419). Suggestions for
975
+ improvement will be welcome!
976
+ */
977
+ if (xmlMemInitialized) return(-1);
978
+ xmlMemInitialized = 1;
979
+ xmlMemMutex = xmlNewMutex();
980
+
981
+ #ifdef HAVE_STDLIB_H
982
+ breakpoint = getenv("XML_MEM_BREAKPOINT");
983
+ if (breakpoint != NULL) {
984
+ sscanf(breakpoint, "%ud", &xmlMemStopAtBlock);
985
+ }
986
+ #endif
987
+ #ifdef HAVE_STDLIB_H
988
+ breakpoint = getenv("XML_MEM_TRACE");
989
+ if (breakpoint != NULL) {
990
+ sscanf(breakpoint, "%p", &xmlMemTraceBlockAt);
991
+ }
992
+ #endif
993
+
994
+ #ifdef DEBUG_MEMORY
995
+ xmlGenericError(xmlGenericErrorContext,
996
+ "xmlInitMemory() Ok\n");
997
+ #endif
998
+ return(0);
999
+ }
1000
+
1001
+ /**
1002
+ * xmlCleanupMemory:
1003
+ *
1004
+ * Free up all the memory allocated by the library for its own
1005
+ * use. This should not be called by user level code.
1006
+ */
1007
+ void
1008
+ xmlCleanupMemory(void) {
1009
+ #ifdef DEBUG_MEMORY
1010
+ xmlGenericError(xmlGenericErrorContext,
1011
+ "xmlCleanupMemory()\n");
1012
+ #endif
1013
+ if (xmlMemInitialized == 0)
1014
+ return;
1015
+
1016
+ xmlFreeMutex(xmlMemMutex);
1017
+ xmlMemMutex = NULL;
1018
+ xmlMemInitialized = 0;
1019
+ #ifdef DEBUG_MEMORY
1020
+ xmlGenericError(xmlGenericErrorContext,
1021
+ "xmlCleanupMemory() Ok\n");
1022
+ #endif
1023
+ }
1024
+
1025
+ /**
1026
+ * xmlMemSetup:
1027
+ * @freeFunc: the free() function to use
1028
+ * @mallocFunc: the malloc() function to use
1029
+ * @reallocFunc: the realloc() function to use
1030
+ * @strdupFunc: the strdup() function to use
1031
+ *
1032
+ * Override the default memory access functions with a new set
1033
+ * This has to be called before any other libxml routines !
1034
+ *
1035
+ * Should this be blocked if there was already some allocations
1036
+ * done ?
1037
+ *
1038
+ * Returns 0 on success
1039
+ */
1040
+ int
1041
+ xmlMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc,
1042
+ xmlReallocFunc reallocFunc, xmlStrdupFunc strdupFunc) {
1043
+ #ifdef DEBUG_MEMORY
1044
+ xmlGenericError(xmlGenericErrorContext,
1045
+ "xmlMemSetup()\n");
1046
+ #endif
1047
+ if (freeFunc == NULL)
1048
+ return(-1);
1049
+ if (mallocFunc == NULL)
1050
+ return(-1);
1051
+ if (reallocFunc == NULL)
1052
+ return(-1);
1053
+ if (strdupFunc == NULL)
1054
+ return(-1);
1055
+ xmlFree = freeFunc;
1056
+ xmlMalloc = mallocFunc;
1057
+ xmlMallocAtomic = mallocFunc;
1058
+ xmlRealloc = reallocFunc;
1059
+ xmlMemStrdup = strdupFunc;
1060
+ #ifdef DEBUG_MEMORY
1061
+ xmlGenericError(xmlGenericErrorContext,
1062
+ "xmlMemSetup() Ok\n");
1063
+ #endif
1064
+ return(0);
1065
+ }
1066
+
1067
+ /**
1068
+ * xmlMemGet:
1069
+ * @freeFunc: place to save the free() function in use
1070
+ * @mallocFunc: place to save the malloc() function in use
1071
+ * @reallocFunc: place to save the realloc() function in use
1072
+ * @strdupFunc: place to save the strdup() function in use
1073
+ *
1074
+ * Provides the memory access functions set currently in use
1075
+ *
1076
+ * Returns 0 on success
1077
+ */
1078
+ int
1079
+ xmlMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc,
1080
+ xmlReallocFunc *reallocFunc, xmlStrdupFunc *strdupFunc) {
1081
+ if (freeFunc != NULL) *freeFunc = xmlFree;
1082
+ if (mallocFunc != NULL) *mallocFunc = xmlMalloc;
1083
+ if (reallocFunc != NULL) *reallocFunc = xmlRealloc;
1084
+ if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup;
1085
+ return(0);
1086
+ }
1087
+
1088
+ /**
1089
+ * xmlGcMemSetup:
1090
+ * @freeFunc: the free() function to use
1091
+ * @mallocFunc: the malloc() function to use
1092
+ * @mallocAtomicFunc: the malloc() function to use for atomic allocations
1093
+ * @reallocFunc: the realloc() function to use
1094
+ * @strdupFunc: the strdup() function to use
1095
+ *
1096
+ * Override the default memory access functions with a new set
1097
+ * This has to be called before any other libxml routines !
1098
+ * The mallocAtomicFunc is specialized for atomic block
1099
+ * allocations (i.e. of areas useful for garbage collected memory allocators
1100
+ *
1101
+ * Should this be blocked if there was already some allocations
1102
+ * done ?
1103
+ *
1104
+ * Returns 0 on success
1105
+ */
1106
+ int
1107
+ xmlGcMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc,
1108
+ xmlMallocFunc mallocAtomicFunc, xmlReallocFunc reallocFunc,
1109
+ xmlStrdupFunc strdupFunc) {
1110
+ #ifdef DEBUG_MEMORY
1111
+ xmlGenericError(xmlGenericErrorContext,
1112
+ "xmlGcMemSetup()\n");
1113
+ #endif
1114
+ if (freeFunc == NULL)
1115
+ return(-1);
1116
+ if (mallocFunc == NULL)
1117
+ return(-1);
1118
+ if (mallocAtomicFunc == NULL)
1119
+ return(-1);
1120
+ if (reallocFunc == NULL)
1121
+ return(-1);
1122
+ if (strdupFunc == NULL)
1123
+ return(-1);
1124
+ xmlFree = freeFunc;
1125
+ xmlMalloc = mallocFunc;
1126
+ xmlMallocAtomic = mallocAtomicFunc;
1127
+ xmlRealloc = reallocFunc;
1128
+ xmlMemStrdup = strdupFunc;
1129
+ #ifdef DEBUG_MEMORY
1130
+ xmlGenericError(xmlGenericErrorContext,
1131
+ "xmlGcMemSetup() Ok\n");
1132
+ #endif
1133
+ return(0);
1134
+ }
1135
+
1136
+ /**
1137
+ * xmlGcMemGet:
1138
+ * @freeFunc: place to save the free() function in use
1139
+ * @mallocFunc: place to save the malloc() function in use
1140
+ * @mallocAtomicFunc: place to save the atomic malloc() function in use
1141
+ * @reallocFunc: place to save the realloc() function in use
1142
+ * @strdupFunc: place to save the strdup() function in use
1143
+ *
1144
+ * Provides the memory access functions set currently in use
1145
+ * The mallocAtomicFunc is specialized for atomic block
1146
+ * allocations (i.e. of areas useful for garbage collected memory allocators
1147
+ *
1148
+ * Returns 0 on success
1149
+ */
1150
+ int
1151
+ xmlGcMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc,
1152
+ xmlMallocFunc *mallocAtomicFunc, xmlReallocFunc *reallocFunc,
1153
+ xmlStrdupFunc *strdupFunc) {
1154
+ if (freeFunc != NULL) *freeFunc = xmlFree;
1155
+ if (mallocFunc != NULL) *mallocFunc = xmlMalloc;
1156
+ if (mallocAtomicFunc != NULL) *mallocAtomicFunc = xmlMallocAtomic;
1157
+ if (reallocFunc != NULL) *reallocFunc = xmlRealloc;
1158
+ if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup;
1159
+ return(0);
1160
+ }
1161
+
1162
+ #define bottom_xmlmemory
1163
+ #include "elfgcchack.h"