Friday 7 June 2013

libxml2 패치를 통한 10MB이상 XML 파일 로드 시키기


libxml2 패치를 통한 10MB이상 XML 파일 로드 시키기

다음 테스트 환경은 CentOS 6.2 x86_64 에서 진행하였다.
다음 실행을 위해서는 Development Tools 그룹 패키지 중 일부(c++ 관련)를 필요로 한다.

1. RPM Rebuild를 위한 디렉토리 생성하기

다음 과정은 시스템 디렉토리와 충돌을 피하기 위해 반드시 root 계정이 아닌 일반 계정으로 진행하도록 해야함.
예로 다음 코드는 StudyMachine 리눅스에서 DaeHyung 계정으로 실행하고 있음
RPM Rebuild 환경 만들기
[DaeHyung@StudyMachine ~]$ mkdir -p src/rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
[DaeHyung@StudyMachine ~]$ mkdir -p src/rpm/RPMS/{athlon,i386,i486,i586,i686,noarch}
[DaeHyung@StudyMachine ~]$ echo touch .rpmmacros
[DaeHyung@StudyMachine ~]$ echo "# Path to top of build area" >> .rpmmacros
[DaeHyung@StudyMachine ~]$ echo "%_topdir    /home/DaeHyung/src/rpm" >> .rpmmacros

2. 패키지 다운로드 및 설치

Rebuild할 libxml2 라이브러리 소스 RPM을 다운로드 받는다.
Source RPM Download
[DaeHyung@StudyMachine ~]$ wget http://vault.centos.org/6.2/os/Source/SPackages/libxml2-2.7.6-4.el6.src.rpm
다운로드 받은 소스 RPM을 설치한다.
일반적으로 RPM설치는 root만 할 수 있으나 소스 RPM은 일반 사용자도 가능한다. 단, 시스템은 설치 불가.
Source RPM Installation
[DaeHyung@StudyMachine ~]$ rpm -ihv libxml2-2.7.6-4.el6.src.rpm

3. 라이브러리 패키지 수정

XML_MAX_TEXT_LENGTH 값을 변경하는 Patch 파일 생성

Create Patch File for JPEG
cat << EOF > src/rpm/SOURCES/libxml2-2.7.6-4.el6.src.rpm
--- libxml2-2.7.6/include/libxml/parserInternals.h 2009-09-25 00:31:59.000000000 +0900
+++ libxml2-2.7.6_patched/include/libxml/parserInternals.h 2012-07-10 17:37:08.630646696 +0900
@@ -37,7 +37,7 @@
  * This is not a limitation of the parser but a safety boundary feature,
  * use XML_PARSE_HUGE option to override it.
  */
-#define XML_MAX_TEXT_LENGTH 10000000
+#define XML_MAX_TEXT_LENGTH 100000000
 
 /**
  * XML_MAX_NAMELEN:
EOF

SPEC 파일 수정 : src/rpm/SPECS/libxml2.spec

Summary: Library providing XML and HTML support
Name: libxml2
Version: 2.7.6
Release: 4%{?dist}%{?extra_release}
License: MIT
Group: Development/Libraries
Source: ftp://xmlsoft.org/libxml2/libxml2-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: python python-devel zlib-devel pkgconfig
URL: http://xmlsoft.org/
Patch0: libxml2-multilib.patch
Patch1: libxml2-2.7.6-xpath-leak.patch
Patch2: libxml2-2.7.7-xpath-bug.patch
Patch3: libxml2-2.7.7-xpath-leak.patch
Patch4: libxml2-2.7.7-xpath-axis-semantic.patch
Patch5: libxml2-2.7.7-xpath-axis-semantic2.patch
Patch6: libxml2-2.7.7-xpath-rounding.patch
Patch7: libxml2-2.7.8-xpath-freeing.patch
Patch8: libxml2-2.7.8-xpath-freeing2.patch
Patch9: CVE-2011-1944.patch
Patch10: libxml2-2.7.8-xpath-hardening.patch
Patch11: CVE-2011-0216.patch
Patch12: CVE-2011-2834.patch
Patch13: libxml2-max-text-length.patch   ---> 추가
... 생략 ...
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1    ---> 추가
... 생략 ...

SRPM 빌드

rpmbuild -ba src/rpm/SPECS/libxml2.spec
이제 새로이 생성된 RPM 파일을 시스템에 설치하도록 한다.
rpm -Uhv --force --nodeps src/rpm/RPMS/x86_64/libxml2-2.7.6-4.el6.x86_64.rpm
이 과정은 시스템 라이브러리를 변경시키는 과정이므로 root의 권한이 필요하다.

No comments:

Post a Comment