Commit Graph

27314 Commits

Author SHA1 Message Date
Roland McGrath
0a982a2905 Make armv7 strcmp assembly compatible with ARM mode and SFI. 2014-05-09 13:22:00 -07:00
Adhemerval Zanella
0ded08a566 Fix elf/tst-tls9-static build
This patch fixes the tst-tlsmod[5/6].so build in system that uses
-Wl,--as-needed as default in linker option.  Without this option
the testing shared library that does not have libc.so in DT_NEEDED
and the tst-tls9-static fails in architecture that use the
./sysdeps/unix/sysv/linux/<arch>/dl-static.c trick.
2014-05-09 15:35:28 -03:00
Roland McGrath
55d4d550c8 Silence a missing-noreturn warning for _Unwind_Resume. 2014-05-09 10:06:20 -07:00
Joseph Myers
77d08acaad Include SSE state in i386 fenv_t (bug 16064).
This patch fixes bug 16064, i386 fenv_t not including SSE state, using
the technique suggested there of storing the state in the existing
__eip field of fenv_t to avoid needing to increase the size of fenv_t
and add new symbol versions.  The included testcase, which previously
failed for i386 (but passed for x86_64), illustrates how the previous
state was buggy.

This patch causes the SSE state to be included *to the extent it is on
x86_64*.  Where some state should logically be included but isn't for
x86_64 (see bug 16068), this patch does not cause it to be included
for i386 either.  The idea is that any patch fixing that bug should
fix it for both x86_64 and i386 at once.

Tested i386 and x86_64.  (I haven't tested the case of a CPU without
SSE2 disabling the test.)

	[BZ #16064]
	* sysdeps/i386/fpu/fegetenv.c: Include <unistd.h>, <ldsodefs.h>
	and <dl-procinfo.h>.
	(__fegetenv): Save SSE state in envp->__eip if supported.
	* sysdeps/i386/fpu/feholdexcpt.c (feholdexcept): Save SSE state in
	envp->__eip if supported.
	* sysdeps/i386/fpu/fesetenv.c: Include <unistd.h>, <ldsodefs.h>
	and <dl-procinfo.h>.
	(__fesetenv): Always set __eip, __cs_selector, __opcode,
	__data_offset and __data_selector in environment to 0.  Set SSE
	state if supported.
	* sysdeps/x86/fpu/Makefile [$(subdir) = math] (tests): Add
	test-fenv-sse.
	[$(subdir) = math] (CFLAGS-test-fenv-sse.c): Add -msse2
	-mfpmath=sse.
	* sysdeps/x86/fpu/test-fenv-sse.c: New file.
2014-05-09 16:59:56 +00:00
Will Newton
28162f4dac ARM: Allow auto-detection of linker relro feature
Set values for libc_commonpagesize and libc_relro_required for the
ARM port to enable relro by default and suppress a warning at
configure time.

ChangeLog:

2014-05-09  Will Newton  <will.newton@linaro.org>

	* sysdeps/arm/preconfigure.ac: Set libc_commonpagesize
	and libc_relro_required for ARM.
	* sysdeps/arm/preconfigure: Regenerate.
2014-05-09 16:57:12 +01:00
Dominik Vogt
5a414ff70c S/390: Port of lock elision to System/z
Added support for TX lock elision of pthread mutexes on s390 and
s390x.  This may improve lock scaling of existing programs on TX
capable systems.  The lock elision code is only built with
--enable-lock-elision=yes and then requires a GCC version supporting
the TX builtins.  With lock elision default mutexes are elided via
__builtin_tbegin, if the cpu supports transactions. By default lock
elision is not enabled and the elision code is not built.
2014-05-09 16:58:46 +02:00
Will Newton
f63c86fed0 ARM: Add optimized ARMv7 strcmp implementation
Add an optimized implementation of strcmp for ARMv7-A cores. This
implementation is significantly faster than the current generic C
implementation, particularly for strings of 16 bytes and longer.

Tested with the glibc string tests for arm-linux-gnueabihf and
armeb-linux-gnueabihf.

The code was written by ARM, who have agreed to assign the copyright
to the FSF for integration into glibc.

ChangeLog:

2014-05-09  Will Newton  <will.newton@linaro.org>

	* sysdeps/arm/armv7/strcmp.S: New file.
	* NEWS: Mention addition of ARMv7 optimized strcmp.
2014-05-09 10:01:28 +01:00
Roland McGrath
95afbbe5fc Some configure-related decrufting. 2014-05-08 11:27:14 -07:00
Roland McGrath
7a1a51b513 Fix -Wundef for _UTSNAME_DOMAIN_LENGTH. 2014-05-08 10:47:35 -07:00
Steve Ellcey
e393b1d7ed Add 16922 to list of bugs fixed. 2014-05-07 13:15:52 -07:00
Steve Ellcey
5057ad3b50 2014-05-07 Steve Ellcey <sellcey@mips.com>
[BZ# 16922]
	* sysdeps/mips/sys/asm.h (INT_SUB): Fix definition.
	(LONG_SUB): Ditto.
	(PTR_SUB): Ditto.
2014-05-07 13:10:48 -07:00
Andreas Schwab
8dc9751764 Fix parsing of getai result from nscd for IPv6-only request 2014-05-07 14:21:27 +02:00
Ondřej Bílka
a11892631d Fix typo in nscd/selinux.c 2014-05-07 14:09:24 +02:00
Ondřej Bílka
ce0c5b8f36 Fix typo in nptl/sockperf.c 2014-05-07 14:00:01 +02:00
Roland McGrath
0f58d25277 Move ARM internal unwind.h header to the right sysdeps directory. 2014-05-06 15:55:20 -07:00
Aurelien Jarno
83df9ad0cc SPARC: add EFD_SEMAPHORE in <bits/eventfd.h> (BZ #16916)
EFD_SEMAPHORE has been added in the main <bits/eventfd.h>, but not in
the SPARC specific version. Fix that.
2014-05-07 00:00:56 +02:00
Vidya Ranganathan
f360f94a05 PowerPC: strncpy/stpncpy optimization for PPC64/POWER7
The optimization is achieved by following techniques:
  > data alignment [gain from aligned memory access on read/write]
  > POWER7 gains performance with loop unrolling/unwinding
    [gain by reduction of branch penalty].
  > zero padding done by calling optimized memset
2014-05-06 09:54:25 -05:00
Andreas Schwab
978a41c357 Don't use catomic functions in mcount (BZ #16912)
mcount cannot use catomic functions since it is called by
__libc_start_main before TLS is set up.  This reverts the change made by
commit 8099361.
2014-05-06 16:30:48 +02:00
Roland McGrath
fe6588457a Move rules for Linux-specific pldd program to Linux-specific Makefile. 2014-05-05 13:16:08 -07:00
Roland McGrath
eb1ed03daf Fix -Wundef issues in generated errlist.c. 2014-05-05 13:06:18 -07:00
Adhemerval Zanella
19c4bec0f4 PowerPC: ifunc improvement for internal calls
This patch changes de default symbol redirection for internal call of
memcpy, memset, memchr, and strlen to the IFUNC resolved ones.  The
performance improvement is noticeable in algorithms that uses these
symbols extensible, like the regex functions.
2014-05-05 13:30:16 -05:00
Adam Conrad
7776e6692f Revert incorrect removal of the XDR currency from locale/iso-4217.def
In 7447ccd98e, the XDR currency was
removed from locale/iso-4217.def, despite the fact that it's both
still a part of the standard, according to the official table:

http://www.currency-iso.org/dam/downloads/table_a1.xml

... and, more importantly, is referenced from localedata/i18n, so
any quick-and-dirty locale definition that uses "copy i18n" for
LC_MONETARY wouldn't work anymore.
2014-05-03 23:45:15 -06:00
Allan McRae
d69aeb1239 Update Esperanto translations 2014-05-04 14:14:14 +10:00
Carlos O'Donell
8f1df5cf9d Fix -Wundef warning for FEATURE_INDEX_1.
Define FEATURE_INDEX_1 and FEATURE_INDEX_MAX as macros
for use by both assembly and C code. This fixes the
-Wundef error for cases where FEATURE_INDEX_1 was not
defined but used the correct value of 0 for an undefined
macro.
2014-05-03 00:25:21 -04:00
Steve Ellcey
13e402e77e 2014-05-01 Steve Ellcey <sellcey@mips.com>
* iconvdata/ansi_x3.110.c (ONE_DIRECTION): Define.
	* iconvdata/armscii-8.c (ONE_DIRECTION): Define.
	* iconvdata/big5.c (ONE_DIRECTION): Define.
	* iconvdata/big5hkscs.c (ONE_DIRECTION): Define.
	* iconvdata/cp1255.c (ONE_DIRECTION): Define.
	* iconvdata/cp1258.c (ONE_DIRECTION): Define.
	* iconvdata/cp932.c (ONE_DIRECTION): Define.
	* iconvdata/euc-cn.c (ONE_DIRECTION): Define.
	* iconvdata/euc-jisx0213.c (ONE_DIRECTION): Define.
	* iconvdata/euc-jp-ms.c (ONE_DIRECTION): Define.
	* iconvdata/euc-jp.c (ONE_DIRECTION): Define.
	* iconvdata/euc-kr.c (ONE_DIRECTION): Define.
	* iconvdata/euc-tw.c (ONE_DIRECTION): Define.
	* iconvdata/gb18030.c (ONE_DIRECTION): Define.
	* iconvdata/gbbig5.c (ONE_DIRECTION): Define.
	* iconvdata/gbgbk.c (ONE_DIRECTION): Define.
	* iconvdata/gbk.c (ONE_DIRECTION): Define.
	* iconvdata/ibm1364.c (ONE_DIRECTION): Define.
	* iconvdata/ibm930.c (ONE_DIRECTION): Define.
	* iconvdata/ibm932.c (ONE_DIRECTION): Define.
	* iconvdata/ibm933.c (ONE_DIRECTION): Define.
	* iconvdata/ibm935.c (ONE_DIRECTION): Define.
	* iconvdata/ibm937.c (ONE_DIRECTION): Define.
	* iconvdata/ibm939.c (ONE_DIRECTION): Define.
	* iconvdata/ibm943.c (ONE_DIRECTION): Define.
	* iconvdata/iso-2022-cn-ext.c (ONE_DIRECTION): Define.
	* iconvdata/iso-2022-cn.c (ONE_DIRECTION): Define.
	* iconvdata/iso-2022-jp-3.c (ONE_DIRECTION): Define.
	* iconvdata/iso-2022-jp.c (ONE_DIRECTION): Define.
	* iconvdata/iso-2022-kr.c (ONE_DIRECTION): Define.
	* iconvdata/iso646.c (ONE_DIRECTION): Define.
	* iconvdata/iso8859-1.c (ONE_DIRECTION): Define.
	* iconvdata/iso_11548-1.c (ONE_DIRECTION): Define.
	* iconvdata/iso_6937-2.c (ONE_DIRECTION): Define.
	* iconvdata/iso_6937.c (ONE_DIRECTION): Define.
	* iconvdata/johab.c (ONE_DIRECTION): Define.
	* iconvdata/shift_jisx0213.c (ONE_DIRECTION): Define.
	* iconvdata/sjis.c (ONE_DIRECTION): Define.
	* iconvdata/t.61.c (ONE_DIRECTION): Define.
	* iconvdata/tcvn5712-1.c (ONE_DIRECTION): Define.
	* iconvdata/tscii.c (ONE_DIRECTION): Define.
	* iconvdata/uhc.c (ONE_DIRECTION): Define.
	* iconvdata/unicode.c (ONE_DIRECTION): Define.
	* iconvdata/utf-16.c (ONE_DIRECTION): Define.
	* iconvdata/utf-32.c (ONE_DIRECTION): Define.
	* iconvdata/utf-7.c (ONE_DIRECTION): Define.
2014-05-01 13:42:40 -07:00
David S. Miller
bf895cb9c3 NEWS: Add 16885 to fixed bug list. 2014-05-01 16:36:33 -04:00
Roland McGrath
8f2f08d04f Fix -Wundef warnings for _IO_JUMPS_OFFSET. 2014-05-01 13:33:13 -07:00
Roland McGrath
c727f03253 Deconditionalize use of LLL_LOCK_INITIALIZER in bits/libc-lock.h. 2014-05-01 13:08:30 -07:00
Andreas Schwab
a849e80035 Fix implicit declaration 2014-05-01 22:02:27 +02:00
David S. Miller
5331255b6e Fix v9/64-bit strcmp when string ends in multiple zero bytes.
[BZ #16885]
	* sysdeps/sparc/sparc64/strcmp.S: Fix end comparison handling when
	multiple zero bytes exist at the end of a string.
	Reported by Aurelien Jarno <aurelien@aurel32.net>

	* string/test-strcmp.c (check): Add explicit test for situations where
	there are multiple zero bytes after the first.
2014-05-01 12:15:06 -07:00
Andreas Schwab
4fdfe821e2 Correctly handle %p in wprintf (BZ #16890) 2014-05-01 20:42:08 +02:00
Steve Ellcey
0cdddc25a4 2014-05-01 Steve Ellcey <sellcey@mips.com>
* intl/iconv/skeleton.c (ONE_DIRECTION): Remove define.
	* iconv/gconv_simple.c (ONE_DIRECTION): Define.
	* iconvdata/8bit-gap.c (ONE_DIRECTION): Ditto.
	* iconvdata/8bit-generic.c (ONE_DIRECTION): Ditto.
2014-05-01 10:22:35 -07:00
Steve Ellcey
6426d77e47 2014-05-01 Steve Ellcey <sellcey@mips.com>
* stdlib/longlong.h: Updated from GCC.
2014-05-01 10:09:04 -07:00
Will Newton
7470db0c8e NEWS: Add 15119 to fixed bug list 2014-05-01 16:26:35 +01:00
Will Newton
6d96f5e4c0 ARM: Remove lowlevellock.c
lowlevellock.c for arm differs from the generic lowlevellock.c only in
insignificant ways, so can be removed. Happily, this fixes BZ 15119
(unnecessary busy loop in __lll_timedlock_wait on arm).

The notable differences between the arm and generic implementations are:

1) arm __lll_timedlock_wait has a fast path out if futex has been set
to 0 between since the function was called. This seems unlikely to
happen very often, so it seems at worst harmless to lose this fast
path.

2) Some function in arm's lowlevellock.c set futex to 2 if it was 1.
The generic version always sets the futex to 2. As futex can only be
0, 1 or 2 on entry into these functions, the behaviour is equivalent.
(If the futex manages to be 0 on entry then we've just lost another
unlikely fast path out.)

There are no test suite regressions.

Note that hppa and sparc also have their own lowlevellock.c. I believe
hppa can also be removed, so I'll send a separate patch for that
shortly. sparc's seems to be genuinely needed as it uses a different
locking structure.

Also note that the analysis at
https://sourceware.org/ml/libc-ports/2013-02/msg00021.html indicates a
further locking performance bug to fix - I've got a partial patch for
that which I can submit once I've finished testing.

2014-05-01  Bernard Ogden <bernie.ogden@linaro.org>

	[BZ #15119]
	* sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.c: Remove file.
2014-05-01 14:25:44 +01:00
David S. Miller
4fa262fa9e Add round-mode context support to sparc.
* sysdeps/sparc/fpu/fenv_private.h (HAVE_RM_CTX): Define.
	(libc_feholdexcept_setround_sparc_ctx): New function.
	(libc_fesetenv_sparc_ctx): Likewise.
	(libc_feupdateenv_sparc_ctx): Likewise.
	(libc_feholdsetround_sparc_ctx): Likewise.
	(libc_feholdexcept_setround_ctx): Define.
	(libc_feholdexcept_setroundf_ctx): Likewise.
	(libc_feholdexcept_setroundl_ctx): Likewise.
	(libc_fesetenv_ctx): Likewise.
	(libc_fesetenvf_ctx): Likewise.
	(libc_fesetenvl_ctx): Likewise.
	(libc_feupdateenv_ctx): Likewise.
	(libc_feupdateenvf_ctx): Likewise.
	(libc_feupdateenvl_ctx): Likewise.
	(libc_feresetround_ctx): Likewise.
	(libc_feresetroundf_ctx): Likewise.
	(libc_feresetroundl_ctx): Likewise.
	(libc_feholdsetround_ctx): Likewise.
	(libc_feholdsetroundf_ctx): Likewise.
	(libc_feholdsetroundl_ctx): Likewise.
2014-04-30 15:14:58 -07:00
David S. Miller
1d3d93ef73 Correct sparc CPP guards for EMT_TAGOVF.
* sysdeps/unix/sysv/linux/sparc/bits/siginfo.h (EMT_TAGOVF): Protect
	with __USE_GNU instead of XOPEN cpp guards.
2014-04-30 13:37:04 -07:00
David S. Miller
8aa583c3e0 Fix some sparc -Wundef build warnings.
* sysdeps/sparc/bits/string.h (_STRING_ARCH_unaligned): Define to
	0.
2014-04-30 11:39:47 -07:00
David S. Miller
211d653cb6 Fix some sparc conform test failures in siginfo.h
* sysdeps/unix/sysv/linux/sparc/bits/siginfo.h (EMT_TAGOVF): Protect
	with XOPEN cpp guards.
2014-04-30 11:37:41 -07:00
Roland McGrath
69124b48b9 Move ports/ChangeLog* files to ChangeLog.old-ports*, remove ports/ directory. 2014-04-30 10:40:29 -07:00
Roland McGrath
fff463ed01 Add deprecation header text to remaining ports/ChangeLog* files. 2014-04-30 10:39:28 -07:00
Julian Brown
60c8f1f60b ARM: Fix R_ARM_IRELATIVE RELA relocations.
This patch fixes what I believe to be a bug in the handling of
R_ARM_IRELATIVE RELA relocations. At present, these are handled the
same as REL relocations: i.e. the addend is loaded from the relocation
address. Most of the time this isn't a problem because RELA relocations
aren't used on ARM (GNU/Linux at least) anyway, but it causes problems
with prelink, which uses RELA on all targets for its conflict table.
(Support for ifunc prelinking requires a prelink patch, not yet posted.)

Anyway, this patch works, though I'm not 100% sure if it is correct: I
notice that this code path received attention last year:

https://sourceware.org/ml/libc-ports/2013-07/msg00000.html

I'm not sure under what circumstances that patch would have had an
effect, nor if my patch conflicts with that case.

No regressions using Mentor's usual glibc cross-testing infrastructure.

	[BZ #16888]
	* sysdeps/arm/dl-machine.h (elf_machine_rela): Fix R_ARM_IRELATIVE
	handling.
2014-04-30 16:17:59 +00:00
Joseph Myers
d0f5b3f851 Increase minimum Linux kernel version to 2.6.32.
This patch increases the minimum Linux kernel version for glibc to
2.6.32, as discussed in the thread starting at
<https://sourceware.org/ml/libc-alpha/2014-01/msg00511.html>.

This patch just does the minimal change to arch_minimum_kernel
settings (and LIBC_LINUX_VERSION, which determines the minimum kernel
headers version, as it doesn't make sense for that to be older than
the minimum kernel that can be used at runtime).  Followups would be
expected to do, roughly and not necessarily precisely in this order:

* Remove __LINUX_KERNEL_VERSION checks in kernel-features.h files
  where those checks are always true / always false for kernels 2.6.32
  and above.

* Otherwise simplify/improve conditionals in those files (for example,
  where defining once in the main file then undefining in
  architecture-specific files makes things clearer than having lots of
  separate definitions of the same macro), possibly fixing in the
  process cases where a macro should optimally have been defined for a
  given architecture but wasn't.  (In the review in preparation for
  this version increase I checked what the right conditions should be
  for all macros in the main kernel-features.h whose definitions there
  would have been affected by the increase - but I only fixed that
  subset of the issues found where --enable-kernel=2.6.32 would have
  caused a kernel feature to be wrongly assumed to be present, not any
  cases where a feature is not assumed but could be assumed.)

* Remove conditionals on __ASSUME_* where they can now be taken to be
  always-true, and the definitions when the macros are only used in
  Linux-specific files.

* Split more architectures out of the main kernel-features.h (like
  ex-ports architectures), once various of the architecture
  conditionals there have been eliminated so the new
  architecture-specific files are no larger than actually necessary.

Tested x86_64.

2014-03-27  Joseph Myers  <joseph@codesourcery.com>

	[BZ #9894]
	* sysdeps/unix/sysv/linux/configure.ac (LIBC_LINUX_VERSION):
	Change to 2.6.32.
	(arch_minimum_kernel): Change all 2.6.16 settings to 2.6.32.
	* sysdeps/unix/sysv/linux/configure: Regenerated.
	* sysdeps/unix/sysv/linux/microblaze/configure.ac: Remove file.
	* sysdeps/unix/sysv/linux/microblaze/configure: Likewise.
	* sysdeps/unix/sysv/linux/tile/configure.ac: Likewise.
	* sysdeps/unix/sysv/linux/tile/configure: Likewise.
	* README: Update reference to required Linux kernel version.
	* manual/install.texi (Linux): Update reference to required Linux
	kernel headers version.
	* INSTALL: Regenerated.
2014-04-30 15:41:03 +00:00
Joseph Myers
9a461d467f conformtest: clean up POSIX expectations for stdlib.h, string.h.
Continuing the series of patches to clean up conformtest expectations
for "POSIX" (1995/6) based on review of the expectations against the
standard, this patch cleans up expectations for stdlib.h and
string.h.  Tested x86_64; no new XFAILs needed.

	* conform/data/stdlib.h-data [POSIX] (stddef.h): Do not allow
	header inclusion.
	[POSIX] (limits.h): Likewise.
	[POSIX] (math.h): Likewise.
	[POSIX] (sys/wait.h): Likewise.
	* conform/data/string.h-data [POSIX || UNIX98] (strtok_r): Require
	function.
	[POSIX] (stddef.h): Do not allow header inclusion.
2014-04-30 15:35:18 +00:00
Andreas Schwab
57f41c4097 ChangeLog cleanup 2014-04-30 16:24:31 +02:00
Adhemerval Zanella
1775babf2b More fixes for unsafe compiler optimization
GCC 4.9 -ftree-loop-distribute-patterns now may transform loops in
memcpy.  Add the alias to internal GLIBC symbol to avoid PLT creation.
2014-04-30 08:41:42 -05:00
Yang Yingliang
8f630cca5c Fix lll_unlock twice in pthread_cond_broadcast
lll_unlock() will be called again if it goes to "wake_all" in
pthread_cond_broadcast(). This may make another thread which is
waiting for lock in pthread_cond_timedwait() unlock.  So there are
more than one threads get the lock, it will break the shared data.

It's introduced by commit 8313cb997d2d("FUTEX_*_REQUEUE_PI support for
non-x86 code")
2014-04-30 15:46:19 +05:30
Siddhesh Poyarekar
bc8f194c8c Initialize all of datahead structure in nscd (BZ #16791)
The datahead structure has an unused padding field that remains
uninitialized.  Valgrind prints out a warning for it on querying a
netgroups entry.  This is harmless, but is a potential data leak since
it would result in writing out an uninitialized byte to the cache
file.  Besides, this happens only when there is a cache miss, so we're
not adding computation to any fast path.
2014-04-30 12:00:39 +05:30
Siddhesh Poyarekar
1cdeb2372d Consolidate code to initialize nscd dataset header
This patch consolidates the code to initialize the header of a dataset
into a single set of functions (one for positive and another for
negative datasets) primarily to reduce repetition of code.  The
secondary reason is to simplify Patch 2/2 which fixes the problem of
an uninitialized byte in the header by initializing an unused field in
the structure and hence preventing a possible data leak into the cache
file.
2014-04-30 11:57:09 +05:30
Siddhesh Poyarekar
16b293a7a6 Do not fail if one of the two responses to AF_UNSPEC fails (BZ #14308)
[Fixes BZ #14308, #12994, #13651]

AF_UNSPEC results in sending two queries in parallel, one for the A
record and the other for the AAAA record.  If one of these is a
referral, then the query fails, which is wrong.  It should return at
least the one successful response.

The fix has two parts.  The first part makes the referral fall back to
the SERVFAIL path, which results in using the successful response.
There is a bug in that path however, due to which the second part is
necessary.  The bug here is that if the first response is a failure
and the second succeeds, __libc_res_nsearch does not detect that and
assumes a failure.  The case where the first response is a success and
the second fails, works correctly.

This condition is produced by buggy routers, so here's a crude
interposable library that can simulate such a condition.  The library
overrides the recvfrom syscall and modifies the header of the packet
received to reproduce this scenario.  It has two key variables:
mod_packet and first_error.

The mod_packet variable when set to 0, results in odd packets being
modified to be a referral.  When set to 1, even packets are modified
to be a referral.

The first_error causes the first response to be a failure so that a
domain-appended search is performed to test the second part of the
__libc_nsearch fix.

The driver for this fix is a simple getaddrinfo program that does an
AF_UNSPEC query.  I have omitted this since it should be easy to
implement.

I have tested this on x86_64.

The interceptor library source:

/* Override recvfrom and modify the header of the first DNS response to make it
   a referral and reproduce bz #845218.  We have to resort to this ugly hack
   because we cannot make bind return the buggy response of a referral for the
   AAAA record and an authoritative response for the A record.  */
 #define _GNU_SOURCE
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <stdio.h>
 #include <stdbool.h>
 #include <endian.h>
 #include <dlfcn.h>
 #include <stdlib.h>

/* Lifted from resolv/arpa/nameser_compat.h.  */
typedef struct {
    unsigned        id :16;         /*%< query identification number */
 #if BYTE_ORDER == BIG_ENDIAN
    /* fields in third byte */
    unsigned        qr: 1;          /*%< response flag */
    unsigned        opcode: 4;      /*%< purpose of message */
    unsigned        aa: 1;          /*%< authoritive answer */
    unsigned        tc: 1;          /*%< truncated message */
    unsigned        rd: 1;          /*%< recursion desired */
    /* fields
     * in
     * fourth
     * byte
     * */
    unsigned        ra: 1;          /*%< recursion available */
    unsigned        unused :1;      /*%< unused bits (MBZ as of 4.9.3a3) */
    unsigned        ad: 1;          /*%< authentic data from named */
    unsigned        cd: 1;          /*%< checking disabled by resolver */
    unsigned        rcode :4;       /*%< response code */
 #endif
 #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
    /* fields
     * in
     * third
     * byte
     * */
    unsigned        rd :1;          /*%< recursion desired */
    unsigned        tc :1;          /*%< truncated message */
    unsigned        aa :1;          /*%< authoritive answer */
    unsigned        opcode :4;      /*%< purpose of message */
    unsigned        qr :1;          /*%< response flag */
    /* fields
     * in
     * fourth
     * byte
     * */
    unsigned        rcode :4;       /*%< response code */
    unsigned        cd: 1;          /*%< checking disabled by resolver */
    unsigned        ad: 1;          /*%< authentic data from named */
    unsigned        unused :1;      /*%< unused bits (MBZ as of 4.9.3a3) */
    unsigned        ra :1;          /*%< recursion available */
 #endif
    /* remaining
     * bytes
     * */
    unsigned        qdcount :16;    /*%< number of question entries */
    unsigned        ancount :16;    /*%< number of answer entries */
    unsigned        nscount :16;    /*%< number of authority entries */
    unsigned        arcount :16;    /*%< number of resource entries */
} HEADER;

static int done = 0;

/* Packets to modify.  0 for the odd packets and 1 for even packets.  */
static const int mod_packet = 0;

/* Set to true if the first request should result in an error, resulting in a
   search query.  */
static bool first_error = true;

static ssize_t (*real_recvfrom) (int sockfd, void *buf, size_t len, int flags,
			  struct sockaddr *src_addr, socklen_t *addrlen);

void
__attribute__ ((constructor))
init (void)
{
  real_recvfrom = dlsym (RTLD_NEXT, "recvfrom");

  if (real_recvfrom == NULL)
    {
      printf ("Failed to get reference to recvfrom: %s\n", dlerror ());
      printf ("Cannot simulate test\n");
      abort ();
    }
}

/* Modify the second packet that we receive to set the header in a manner as to
   reproduce BZ #845218.  */
static void
mod_buf (HEADER *h, int port)
{
  if (done % 2 == mod_packet || (first_error && done == 1))
    {
      printf ("(Modifying header)");

      if (first_error && done == 1)
	h->rcode = 3;
      else
	h->rcode = 0;	/* NOERROR == 0.  */
      h->ancount = 0;
      h->aa = 0;
      h->ra = 0;
      h->arcount = 0;
    }
  done++;
}

ssize_t
recvfrom (int sockfd, void *buf, size_t len, int flags,
	  struct sockaddr *src_addr, socklen_t *addrlen)
{
  ssize_t ret = real_recvfrom (sockfd, buf, len, flags, src_addr, addrlen);
  int port = htons (((struct sockaddr_in *) src_addr)->sin_port);
  struct in_addr addr = ((struct sockaddr_in *) src_addr)->sin_addr;
  const char *host = inet_ntoa (addr);
  printf ("\n*** From %s:%d: ", host, port);

  mod_buf (buf, port);

  printf ("returned %zd\n", ret);
  return ret;
}
2014-04-30 11:48:43 +05:30