mirror of
https://github.com/pocoproject/poco.git
synced 2026-01-12 00:04:54 +08:00
enh(expat): Add patch system for POCO-specific xmlparse modifications
This commit is contained in:
21
dependencies/expat/CMakeLists.txt
vendored
21
dependencies/expat/CMakeLists.txt
vendored
@@ -1,4 +1,9 @@
|
||||
|
||||
# Expat XML parser library
|
||||
# Version: 2.7.1
|
||||
# Source: https://github.com/libexpat/libexpat/releases/tag/R_2_7_1
|
||||
#
|
||||
# Note: src/xmlparse.cpp is generated from expat's xmlparse.c with POCO-specific modifications.
|
||||
# Use the patch_expat_xmlparse target to regenerate it after upgrading expat.
|
||||
|
||||
if(POCO_UNBUNDLED)
|
||||
if (ENABLE_XML)
|
||||
@@ -13,6 +18,8 @@ else()
|
||||
|
||||
# Sources
|
||||
file(GLOB SRCS_G "src/*.c" "src/*.cpp")
|
||||
# Exclude original xmlparse.c (we use the patched xmlparse.cpp)
|
||||
list(FILTER SRCS_G EXCLUDE REGEX ".*xmlparse\\.c$")
|
||||
POCO_SOURCES(SRCS expat ${SRCS_G})
|
||||
|
||||
# Headers
|
||||
@@ -40,3 +47,15 @@ else()
|
||||
add_library(EXPAT::EXPAT ALIAS _BUNDLED_EXPAT)
|
||||
endif()
|
||||
|
||||
# Custom target to regenerate xmlparse.cpp from original xmlparse.c
|
||||
# This target is NOT included in ALL - run manually with: cmake --build . --target patch_expat_xmlparse
|
||||
add_custom_target(patch_expat_xmlparse
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "Patching xmlparse.c for POCO..."
|
||||
COMMAND ${CMAKE_COMMAND} -E copy xmlparse.c xmlparse.c.bak
|
||||
COMMAND patch xmlparse.c < ${CMAKE_CURRENT_SOURCE_DIR}/xmlparse_poco.patch
|
||||
COMMAND ${CMAKE_COMMAND} -E rename xmlparse.c xmlparse.cpp
|
||||
COMMAND ${CMAKE_COMMAND} -E rename xmlparse.c.bak xmlparse.c
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "Done. xmlparse.cpp has been updated."
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||
COMMENT "Applying POCO patches to expat xmlparse.c"
|
||||
)
|
||||
|
||||
8841
dependencies/expat/src/xmlparse.c
vendored
Normal file
8841
dependencies/expat/src/xmlparse.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
167
dependencies/expat/xmlparse_poco.patch
vendored
Normal file
167
dependencies/expat/xmlparse_poco.patch
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
# POCO modifications to expat xmlparse.c
|
||||
#
|
||||
# This patch applies POCO-specific modifications to xmlparse.c from the expat library:
|
||||
# 1. Enables EXPAT_POCO mode for POCO-specific entropy generation
|
||||
# 2. Uses Poco::RandomInputStream instead of OS-specific entropy sources
|
||||
# 3. Adds C++ casts for malloc_fcn calls (required for C++ compilation)
|
||||
# 4. Includes expat_config.h for configuration
|
||||
#
|
||||
# To apply this patch:
|
||||
# 1. Copy xmlparse.c from expat release to this directory
|
||||
# 2. Run: patch -p0 < xmlparse_poco.patch
|
||||
# 3. Rename: mv xmlparse.c xmlparse.cpp
|
||||
#
|
||||
# Or use the CMake target: cmake --build . --target patch_expat_xmlparse
|
||||
|
||||
--- xmlparse.c
|
||||
+++ xmlparse.c
|
||||
@@ -103,7 +103,12 @@
|
||||
#include <stdint.h> /* uintptr_t */
|
||||
#include <math.h> /* isnan */
|
||||
|
||||
-#ifdef _WIN32
|
||||
+#define EXPAT_POCO 1
|
||||
+
|
||||
+#if defined(EXPAT_POCO)
|
||||
+# include "Poco/RandomStream.h"
|
||||
+# include "Poco/BinaryReader.h"
|
||||
+#elif defined(_WIN32)
|
||||
# define getpid GetCurrentProcessId
|
||||
#else
|
||||
# include <sys/time.h> /* gettimeofday() */
|
||||
@@ -113,10 +118,12 @@
|
||||
# include <errno.h>
|
||||
#endif
|
||||
|
||||
-#ifdef _WIN32
|
||||
+#ifdef EXPAT_WIN32
|
||||
# include "winconfig.h"
|
||||
#endif
|
||||
|
||||
+#include "expat_config.h"
|
||||
+
|
||||
#include "ascii.h"
|
||||
#include "expat.h"
|
||||
#include "siphash.h"
|
||||
@@ -145,7 +152,7 @@
|
||||
#if ! defined(HAVE_GETRANDOM) && ! defined(HAVE_SYSCALL_GETRANDOM) \
|
||||
&& ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) \
|
||||
&& ! defined(XML_DEV_URANDOM) && ! defined(_WIN32) \
|
||||
- && ! defined(XML_POOR_ENTROPY)
|
||||
+ && ! defined(XML_POOR_ENTROPY) && ! defined(EXPAT_POCO)
|
||||
# error You do not have support for any sources of high quality entropy \
|
||||
enabled. For end user security, that is probably not what you want. \
|
||||
\
|
||||
@@ -804,6 +811,9 @@
|
||||
ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,
|
||||
ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e,
|
||||
'\0'};
|
||||
+
|
||||
+
|
||||
+#if ! defined(EXPAT_POCO)
|
||||
|
||||
/* To avoid warnings about unused functions: */
|
||||
#if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM)
|
||||
@@ -958,6 +968,8 @@
|
||||
|
||||
#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */
|
||||
|
||||
+#endif /* ! defined(EXPAT_POCO) */
|
||||
+
|
||||
static unsigned long
|
||||
ENTROPY_DEBUG(const char *label, unsigned long entropy) {
|
||||
if (getDebugLevel("EXPAT_ENTROPY_DEBUG", 0) >= 1u) {
|
||||
@@ -971,7 +983,12 @@
|
||||
generate_hash_secret_salt(XML_Parser parser) {
|
||||
unsigned long entropy;
|
||||
(void)parser;
|
||||
-
|
||||
+#if defined(EXPAT_POCO)
|
||||
+ Poco::RandomInputStream rstr;
|
||||
+ Poco::BinaryReader rrdr(rstr);
|
||||
+ rrdr >> entropy;
|
||||
+ return ENTROPY_DEBUG("RandomInputStream", entropy);
|
||||
+#else
|
||||
/* "Failproof" high quality providers: */
|
||||
#if defined(HAVE_ARC4RANDOM_BUF)
|
||||
arc4random_buf(&entropy, sizeof(entropy));
|
||||
@@ -1008,6 +1025,7 @@
|
||||
entropy * (unsigned long)2305843009213693951ULL);
|
||||
}
|
||||
#endif
|
||||
+#endif /* defined(EXPAT_POCO) */
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
@@ -1111,7 +1129,7 @@
|
||||
|
||||
if (memsuite) {
|
||||
XML_Memory_Handling_Suite *mtemp;
|
||||
- parser = memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
|
||||
+ parser = (XML_Parser)memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
|
||||
if (parser != NULL) {
|
||||
mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
|
||||
mtemp->malloc_fcn = memsuite->malloc_fcn;
|
||||
@@ -7123,7 +7141,7 @@
|
||||
|
||||
static DTD *
|
||||
dtdCreate(const XML_Memory_Handling_Suite *ms) {
|
||||
- DTD *p = ms->malloc_fcn(sizeof(DTD));
|
||||
+ DTD *p = (DTD*) ms->malloc_fcn(sizeof(DTD));
|
||||
if (p == NULL)
|
||||
return p;
|
||||
poolInit(&(p->pool), ms);
|
||||
@@ -7307,7 +7325,7 @@
|
||||
}
|
||||
#endif
|
||||
newE->defaultAtts
|
||||
- = ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
|
||||
+ = (DEFAULT_ATTRIBUTE*) ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
|
||||
if (! newE->defaultAtts) {
|
||||
return 0;
|
||||
}
|
||||
@@ -7469,7 +7487,7 @@
|
||||
/* table->size is a power of 2 */
|
||||
table->size = (size_t)1 << INIT_POWER;
|
||||
tsize = table->size * sizeof(NAMED *);
|
||||
- table->v = table->mem->malloc_fcn(tsize);
|
||||
+ table->v = (NAMED**) table->mem->malloc_fcn(tsize);
|
||||
if (! table->v) {
|
||||
table->size = 0;
|
||||
return NULL;
|
||||
@@ -7509,7 +7527,7 @@
|
||||
}
|
||||
|
||||
size_t tsize = newSize * sizeof(NAMED *);
|
||||
- NAMED **newV = table->mem->malloc_fcn(tsize);
|
||||
+ NAMED **newV = (NAMED**) table->mem->malloc_fcn(tsize);
|
||||
if (! newV)
|
||||
return NULL;
|
||||
memset(newV, 0, tsize);
|
||||
@@ -7538,7 +7556,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
- table->v[i] = table->mem->malloc_fcn(createSize);
|
||||
+ table->v[i] = (NAMED*) table->mem->malloc_fcn(createSize);
|
||||
if (! table->v[i])
|
||||
return NULL;
|
||||
memset(table->v[i], 0, createSize);
|
||||
@@ -7826,7 +7844,7 @@
|
||||
if (bytesToAllocate == 0)
|
||||
return XML_FALSE;
|
||||
|
||||
- tem = pool->mem->malloc_fcn(bytesToAllocate);
|
||||
+ tem = (BLOCK*) pool->mem->malloc_fcn(bytesToAllocate);
|
||||
if (! tem)
|
||||
return XML_FALSE;
|
||||
tem->size = blockSize;
|
||||
@@ -8074,7 +8092,7 @@
|
||||
charsRequired++;
|
||||
|
||||
/* Now allocate space for the copy */
|
||||
- result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char));
|
||||
+ result = (XML_Char*) memsuite->malloc_fcn(charsRequired * sizeof(XML_Char));
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
/* Copy the original into place */
|
||||
Reference in New Issue
Block a user