apr: fix off_t size can't match when configure and in target glibc
v2 cover apr: fix off_t size can't match when configure and in target glibc
The following changes since commit a92d27acd8f42b61a2fc575311838b45d171f0af:
oeqa/utils/commands.py: Fix get_bb_vars() when called without arguments (2016-12-14 16:15:04 +0000)
are available in the git repository at:
git://git.openembedded.org/openembedded-core-contrib dengke/fix-apr-configure-error-for-cross-compiling
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=dengke/fix-apr-configure-error-for-cross-compiling
Dengke Du (2):
Revert "subversion: fix "svnadmin create" fail on x86"
apr: fix off_t size can't match when configure and in target glibc
.../0001-fix-svnadmin-create-fail-on-x86.patch | 56 ---------------------- .../subversion/subversion_1.9.4.bb | 1 - ..._t-size-doesn-t-match-in-glibc-when-cross.patch | 52 ++++++++++++++++++++ meta/recipes-support/apr/apr_1.5.2.bb | 1 + 4 files changed, 53 insertions(+), 57 deletions(-) delete mode 100644 meta/recipes-devtools/subversion/subversion/0001-fix-svnadmin-create-fail-on-x86.patch create mode 100644 meta/recipes-support/apr/apr/0001-apr-fix-off_t-size-doesn-t-match-in-glibc-when-cross.patch
Signature · 1 line
2.7.4
PATCH v2 1/2 Revert "subversion: fix "svnadmin create" fail on x86"
This reverts commit cfe6f3e251240c9d9a70354be0501600357f0b87.
This is because the apr configure wrong, when the apr configure meets the cross compiling, it pass 8 bytes to "off_t", in apr source code configure.in, it was hardcoded:
APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], off_t, 8)
The macro "APR_CHECK_SIZEOF_EXTENDED" was defined in build/apr_common.m4, it use the "AC_TRY_RUN" macro, this macro let the off_t to 8, when cross compiling enable.
But in glibc on the x86 or multilib target the "off_t" was 4 bytes, so this cases dismatch for softwares which use the apr.h, such as subversion, run this:
svnadmin create test
It failed because the "APR_OFF_T_FMT" was "lld" in apr.h when apr configure, but the "apr_off_t" was 4 bytes, in the apr source code: apr_snprintf.c
i_quad = va_arg(ap, apr_int64_t);
When the function apr_vformatter meets "lld", it would use the above to parse, but the above read 8 bytes, so the follow-up data go to wrong.
So we should configure the apr correct when cross compiling. I do this on the following patchs.
--- .../0001-fix-svnadmin-create-fail-on-x86.patch | 56 ---------------------- .../subversion/subversion_1.9.4.bb | 1 - 2 files changed, 57 deletions(-) delete mode 100644 meta/recipes-devtools/subversion/subversion/0001-fix-svnadmin-create-fail-on-x86.patch
meta/recipes-devtools/subversion/subversion/0001-fix-svnadmin-create-fail-on-x86.patch deleted +0 -56
@@ -1,56 +0,0 @@ -From 09475e0befca8d120c957177ce8568fa2209a1a9 Mon Sep 17 00:00:00 2001 -From: Dengke Du <[email protected]> -Date: Wed, 2 Nov 2016 11:09:44 +0800 -Subject: [PATCH] fix "svnadmin create" fail on x86 - -When run the following command on x86: - - svnadmin create /var/test_repo - -It cause segmentation fault error like the following: - - [16499.751837] svnadmin[21117]: segfault at 83 ip 00000000f74bf7f6 sp 00000000ffdd9b34 error 4 in libc-2.24.so[f7441000+1af000] - Segmentation fault (core dumped) - -This is because in source code ./subversion/libsvn_fs_fs/low_level.c, -function svn_fs_fs__unparse_footer, when: - - target arch: x86 - apr_off_t: 4 bytes - -if the "APR_OFF_T_FMT" is "lld", it still use type "apr_off_t" to pass -data to apr, but in apr source code file apr_snprintf.c the function -apr_vformatter meet "lld", it would use the: - - i_quad = va_arg(ap, apr_int64_t); - -It uses the apr_int64_t to deal data, it read 8 bytes, so the follow-up -data may be error. - -Upstream-Status: Pending - -Signed-off-by: Dengke Du <[email protected]> ---- - subversion/libsvn_fs_fs/low_level.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/subversion/libsvn_fs_fs/low_level.c b/subversion/libsvn_fs_fs/low_level.c -index a27bbcc..6ddbe28 100644 ---- a/subversion/libsvn_fs_fs/low_level.c -+++ b/subversion/libsvn_fs_fs/low_level.c -@@ -250,10 +250,10 @@ svn_fs_fs__unparse_footer(apr_off_t l2p_offset, - { - return svn_stringbuf_createf(result_pool, - "%" APR_OFF_T_FMT " %s %" APR_OFF_T_FMT " %s", -- l2p_offset, -+ (APR_OFF_T_FMT=="lld") ? (apr_int64_t)l2p_offset : l2p_offset, - svn_checksum_to_cstring(l2p_checksum, - scratch_pool), -- p2l_offset, -+ (APR_OFF_T_FMT=="lld") ? (apr_int64_t)p2l_offset : p2l_offset, - svn_checksum_to_cstring(p2l_checksum, - scratch_pool)); - } --- -2.7.4 -
meta/recipes-devtools/subversion/subversion_1.9.4.bb +0 -1
@@ -14,7 +14,6 @@ SRC_URI = "${APACHE_MIRROR}/${BPN}/${BPN}-${PV}.tar.bz2 \ file://disable_macos.patch \ file://serf.m4-Regex-modified-to-allow-D-in-paths.patch \ file://0001-Fix-libtool-name-in-configure.ac.patch \ - file://0001-fix-svnadmin-create-fail-on-x86.patch \ file://serfmacro.patch \ "
Signature · 1 line
2.7.4
PATCH v2 2/2 apr: fix off_t size can't match when configure and in target glibc
In reply to Dengke DuWhen subversion run on x86 and lib32 on x86-64, it use the APR's apr.h header file. But when configure the APR, APR meets the cross compiling, it was hardcoded in configure.in in apr source code. As the following:
APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], off_t, 8)
It pass 8 bytes to off_t when meets cross compiling, but on x86 or lib32 the off_t in glibc was 4 bytes, so it let the application who use apr.h go to wrong.
Such as subversion:
svnadmin create test
So we should let the APR detect the correct off_t when cross compiling, change it to the following:
AC_CHECK_SIZEOF(off_t)
--- ..._t-size-doesn-t-match-in-glibc-when-cross.patch | 52 ++++++++++++++++++++++ meta/recipes-support/apr/apr_1.5.2.bb | 1 + 2 files changed, 53 insertions(+) create mode 100644 meta/recipes-support/apr/apr/0001-apr-fix-off_t-size-doesn-t-match-in-glibc-when-cross.patch
meta/recipes-support/apr/apr/0001-apr-fix-off_t-size-doesn-t-match-in-glibc-when-cross.patch new file +52 -0
@@ -0,0 +1,52 @@ +From 537f5b415677b49a52f01bca9f60937654fb9cca Mon Sep 17 00:00:00 2001 +From: Dengke Du <[email protected]> +Date: Wed, 14 Dec 2016 18:13:08 +0800 +Subject: [PATCH] apr: fix off_t size doesn't match in glibc when cross + compiling + +In configure.in, it contains the following: + + APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], off_t, 8) + +the macro "APR_CHECK_SIZEOF_EXTENDED" was defined in build/apr_common.m4, +it use the "AC_TRY_RUN" macro, this macro let the off_t to 8, when cross +compiling enable. + +So it was hardcoded for cross compiling, we should detect it dynamic based on +the sysroot's glibc. We change it to the following: + + AC_CHECK_SIZEOF(off_t) + +I have send a discussing for the upstream, the maintainer said the macro in +APR designed with only any attention paid to the build platform, considering +cross compiling less, we can check the discussing from: + + http://mail-archives.apache.org/mod_mbox/apr-dev/201612.mbox/browser + +text/plain: + + http://mail-archives.apache.org/mod_mbox/apr-dev/201612.mbox/raw/%3CCACsi250oDaqf%2BG4-KoT_0QWhSZdKCJhNZYhWRBqOx5WcmtYO8Q%40mail.gmail.com%3E/1 + +Upstream-Status: Submitted + +Signed-off-by: Dengke Du <[email protected]> +--- + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.in b/configure.in +index 9d57ae6..fcc647e 100644 +--- a/configure.in ++++ b/configure.in +@@ -1784,7 +1784,7 @@ fi + + size_t_fmt="#define APR_SIZE_T_FMT \"$size_t_fmt\"" + +-APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], off_t, 8) ++AC_CHECK_SIZEOF(off_t) + + if test "${ac_cv_sizeof_off_t}${apr_cv_use_lfs64}" = "4yes"; then + # Enable LFS +-- +2.7.4 +
meta/recipes-support/apr/apr_1.5.2.bb +1 -0
@@ -17,6 +17,7 @@ SRC_URI = "${APACHE_MIRROR}/apr/${BPN}-${PV}.tar.bz2 \ file://upgrade-and-fix-1.5.1.patch \ file://Fix-packet-discards-HTTP-redirect.patch \ file://configure.in-fix-LTFLAGS-to-make-it-work-with-ccache.patch \ + file://0001-apr-fix-off_t-size-doesn-t-match-in-glibc-when-cross.patch \ " SRC_URI[md5sum] = "4e9769f3349fe11fc0a5e1b224c236aa"
Signature · 1 line
2.7.4
Quoted 6 lines · Dengke Du
+I have send a discussing for the upstream, the maintainer said the macro in
+APR designed with only any attention paid to the build platform, considering
+cross compiling less, we can check the discussing from:
Sigh...
Have you verified that there are no other instances of that macros in configure.ac? It's clear that it's broken by design and should just be removed.
Ross
Thank you for reminding, the following types were hardcoded in apr source code when cross compiling:
pid_t 8
ssize_t 8
size_t 8
off_t 8
I will send V3.
Quoted 15 lines · Ross
On 19 December 2016 at 05:40, Dengke Du <[email protected] <mailto:[email protected]>> wrote:
+I have send a discussing for the upstream, the maintainer said the macro in
+APR designed with only any attention paid to the build platform, considering
+cross compiling less, we can check the discussing from:Sigh...
Have you verified that there are no other instances of that macros in configure.ac <http://configure.ac>? It's clear that it's broken by design and should just be removed.
Ross
Quoted 5 lines · Dengke Du
Thank you for reminding, the following types were hardcoded in apr source code when cross compiling:
pid_t8
Quoted 8 lines
ssize_t8
size_t8
off_t8I will send V3.
(facepalms at apr)
Thanks!
Ross