strlen-avx2.S

David Newall glibc@davidnewall.com
Mon Jul 1 02:34:11 GMT 2024


Bump!

On 18/6/24 15:33, David Newall wrote:
>
> I recently upgraded my PC to one with Intel i9-14900HX, and installed 
> Ubuntu22.04.  Since then, remmina (as RDP client) has been 
> periodically crashing.  I've tracked it down to a debug statement, 
> which uses the result of strlen():
>
> REMMINA_PLUGIN_DEBUG("gp=%p returning %zu bytes of text in clipboard 
> to requesting application", gp, strlen(clipboard->srv_data));
>
> REMMINA_PLUGIN_DEBUG is defined as:
>
> remmina_plugin_service->_remmina_debug(__func__, fmt, ##__VA_ARGS__)
>
> The core file shows SIGSEG at __strlen_avx2 () at 
> ../sysdeps/x86_64/multiarch/strlen-avx2.S:74, called from 
> remmina_rdp_cliprdr_request_data(), so the direct call of strlen (i.e. 
> not called from _remmina_debug).
>
> Clipboard has a reasonable value as does srv_data, which is a generic 
> pointer.  Cast to char*, gdb shows the first value as '\0', so 
> strlen() should be 0.
>
> Libc6 is glibc-2.35 (with Canonical's patches), but 
> sysdeps/x86_64/multiarch/strlen-avx2.S (as strlen) is unchanged up to 
> 2.39.
>
> Disassembling _strlen_avx2 shows this:
>
> Dump of assembler code for function __strlen_avx2:
>     0x0000758b5c19d7e0 <+0>:	endbr64
>     0x0000758b5c19d7e4 <+4>:	mov    %edi,%eax
>     0x0000758b5c19d7e6 <+6>:	mov    %rdi,%rdx
>     0x0000758b5c19d7e9 <+9>:	vpxor  %xmm0,%xmm0,%xmm0
>     0x0000758b5c19d7ed <+13>:	and    $0xfff,%eax
>     0x0000758b5c19d7f2 <+18>:	cmp    $0xfe0,%eax
>     0x0000758b5c19d7f7 <+23>:	ja     0x758b5c19d930 <__strlen_avx2+336>
> => 0x0000758b5c19d7fd <+29>:	vpcmpeqb (%rdi),%ymm0,%ymm1
>     0x0000758b5c19d801 <+33>:	vpmovmskb %ymm1,%eax
>     0x0000758b5c19d805 <+37>:	test   %eax,%eax
>     0x0000758b5c19d807 <+39>:	je     0x758b5c19d860 <__strlen_avx2+128>
>     0x0000758b5c19d809 <+41>:	tzcnt  %eax,%eax
>     0x0000758b5c19d80d <+45>:	vzeroupper
>     0x0000758b5c19d810 <+48>:	ret
>
> I'm focusing on the instruction causing SIGSEG (marked with "=>"):
>
> Do I understand it properly, as comparing memory addressed by RDI with 
> YMM0, saving the result in YMM1?
>
> YMM0 is 0.  I see where the lower 128-bits were zeroed (by zeroing 
> XMM0), but not the upper 128-bits.  What clears them?
>
> RDI is 0.  Is this expected?  Am I right that this is why I'm getting 
> SIGSEG?
>
Regards,

David


More information about the Libc-help mailing list