Hi Stefan,

Stefan <stefan-g...@vodafonemail.de> skribis:

> * gnu/packages/virtualization.scm (qemu): Add a snippet to fix a bug in the
> do_ioctl_ifconf() function of qemu to make ioclt(…, SIOCGIFCONF, …) work for
> emulated 64 bit architectures.
>
> The sizeof(struct ifreq) is 40 for 64 bit and 32 for 32 bit architectures.
> This structure contains a union of other structures, of which struct ifmap
> is the biggest for 64 bit architectures. Calling ioclt(…, SIOCGIFCONF, …)
> fills a struct sockaddr of that union, and do_ioctl_ifconf() only considered
> that struct sockaddr for the size of the union, which has the same size as
> struct ifmap on 32 bit architectures. So do_ioctl_ifconf() assumed a wrong
> size of 32 for struct ifreq instead of the correct size of 40 on 64 bit
> architectures.
>
> The fix makes do_ioctl_ifconf() handle struct ifmap as the biggest part of
> the union, treating struct ifreq with the correct size.
>
> This fixes (@ (guix build syscalls) network-interface-names) when used in
> emulated 64 bit architectures.

Woow, good catch!

> +              (modules '((guix build utils)))
> +              (snippet
> +               '(begin
> +                  (substitute* '("linux-user/syscall.c")
> +                    (("^([[:blank:]]*)const argtype ifreq_arg_type.*$" line 
> indent)
> +                     (string-append line indent
> +                                    "const argtype ifreq_max_type[] = { 
> MK_STRUCT(STRUCT_ifmap_ifreq) };\n"))
> +                    (("^([[:blank:]]*)target_ifreq_size[[:blank:]]=.*$" _ 
> indent)
> +                     (string-append indent "target_ifreq_size = 
> thunk_type_size(ifreq_max_type, 0);")))
> +                  #t))))

Could you move the explanation as a comment above the ‘substitute*’
form, and/or link to the upstream bug report/discussion/submission?

Thank you!

Ludo’.



Reply via email to