Re: [Qemu-devel] bug with io/channel-socket.c - variable-sized object may not be initialized

2016-01-18 Thread Daniel P. Berrange
On Fri, Jan 15, 2016 at 04:56:33PM -0700, Eric Blake wrote:
> On 01/13/2016 02:19 PM, Programmingkid wrote:
> > This code causes an error to occur during compiling: 
> > 
> > char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
> > 
> > It is located at line 496 in io/channel-socket.c. 
> > 
> > Here is the full error message:
> > io/channel-socket.c: In function 'qio_channel_socket_writev':
> > io/channel-socket.c:496:18: error: variable-sized object may not be 
> > initialized
> >  char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
> > 
> > This is from gcc 4.9 running on Mac OS 10.6.8. 
> 
> Uggh. That sounds like a bug in the Mac OS headers, for making
> CMSG_SPACE() not be a compile-time constant.  We do NOT want to be using
> variable-sized objects here, so we need a compile-time constant for the
> array size, even if we have to work around your platform's borked headers.

Note it only seems to be complaining about the initialization, not
the actual declaration. We already have similar code in QEMU elsewhere
eg

  qemu-char.c:char control[CMSG_SPACE(sizeof(int) * TCP_MAX_FDS)];

which presumably works on OS-X

So the simple fix is to remove the '{ 0 }' initialization and just
memset instead eg

  memset(control, 0, CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS));


Regards,
Daniel
-- 
|: http://berrange.com  -o-http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org  -o- http://virt-manager.org :|
|: http://autobuild.org   -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org   -o-   http://live.gnome.org/gtk-vnc :|



Re: [Qemu-devel] bug with io/channel-socket.c - variable-sized object may not be initialized

2016-01-16 Thread Programmingkid

On Jan 15, 2016, at 6:56 PM, Eric Blake wrote:

> On 01/13/2016 02:19 PM, Programmingkid wrote:
>> This code causes an error to occur during compiling: 
>> 
>> char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
>> 
>> It is located at line 496 in io/channel-socket.c. 
>> 
>> Here is the full error message:
>> io/channel-socket.c: In function 'qio_channel_socket_writev':
>> io/channel-socket.c:496:18: error: variable-sized object may not be 
>> initialized
>> char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
>> 
>> This is from gcc 4.9 running on Mac OS 10.6.8. 
> 
> Uggh. That sounds like a bug in the Mac OS headers, for making
> CMSG_SPACE() not be a compile-time constant.  We do NOT want to be using
> variable-sized objects here, so we need a compile-time constant for the
> array size, even if we have to work around your platform's borked headers.
> Can you capture what that line expands to after pre-processing, to see
> if my guess is right?

It expands to 76. 




Re: [Qemu-devel] bug with io/channel-socket.c - variable-sized object may not be initialized

2016-01-15 Thread Eric Blake
On 01/13/2016 02:19 PM, Programmingkid wrote:
> This code causes an error to occur during compiling: 
> 
> char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
> 
> It is located at line 496 in io/channel-socket.c. 
> 
> Here is the full error message:
> io/channel-socket.c: In function 'qio_channel_socket_writev':
> io/channel-socket.c:496:18: error: variable-sized object may not be 
> initialized
>  char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };
> 
> This is from gcc 4.9 running on Mac OS 10.6.8. 

Uggh. That sounds like a bug in the Mac OS headers, for making
CMSG_SPACE() not be a compile-time constant.  We do NOT want to be using
variable-sized objects here, so we need a compile-time constant for the
array size, even if we have to work around your platform's borked headers.

Can you capture what that line expands to after pre-processing, to see
if my guess is right?

> 
> A quick fix to this problem is to replace everything in the parentheses with 
> 1000. 

Yeah, but that's probably wrong, unless we know for sure that
sizeof(int)*SOCKET_MAX_FDS will never exceed 1000; in that case, it's
probably over-allocating.

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


[Qemu-devel] bug with io/channel-socket.c - variable-sized object may not be initialized

2016-01-13 Thread Programmingkid
This code causes an error to occur during compiling: 

char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };

It is located at line 496 in io/channel-socket.c. 

Here is the full error message:
io/channel-socket.c: In function 'qio_channel_socket_writev':
io/channel-socket.c:496:18: error: variable-sized object may not be initialized
 char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)] = { 0 };

This is from gcc 4.9 running on Mac OS 10.6.8. 

A quick fix to this problem is to replace everything in the parentheses with 
1000.