Patchwork osdep: pass const char pointer to setsockopt

login
register
mail settings
Submitter Lei Li
Date March 5, 2013, 9:51 a.m.
Message ID <1362477081-31843-1-git-send-email-lilei@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/224976/
State New
Headers show

Comments

Lei Li - March 5, 2013, 9:51 a.m.
Pass the right type for setsockopt(), and this will also
fix the compiler warning when cross build for qemu-ga.exe:

util/osdep.c: In function 'socket_set_nodelay':
util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
                   incompatible pointer type [enabled by default]
In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
                 from /home/lei/qemu_b/include/qemu-common.h:46,
                 from util/osdep.c:48:
/usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
                 expected 'const char *' but argument is of type 'int *'

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 util/osdep.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Markus Armbruster - March 6, 2013, 8:59 a.m.
Lei Li <lilei@linux.vnet.ibm.com> writes:

> Pass the right type for setsockopt(), and this will also
> fix the compiler warning when cross build for qemu-ga.exe:
>
> util/osdep.c: In function 'socket_set_nodelay':
> util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
>                    incompatible pointer type [enabled by default]
> In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
>                  from /home/lei/qemu_b/include/qemu-common.h:46,
>                  from util/osdep.c:48:
> /usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
>                  expected 'const char *' but argument is of type 'int *'
>
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
>  util/osdep.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/util/osdep.c b/util/osdep.c
> index c408261..ce472a9 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> @@ -57,7 +57,7 @@ static const char *qemu_version = QEMU_VERSION;
>  int socket_set_cork(int fd, int v)
>  {
>  #if defined(SOL_TCP) && defined(TCP_CORK)
> -    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
> +    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
>  #else
>      return 0;
>  #endif
> @@ -66,7 +66,7 @@ int socket_set_cork(int fd, int v)
>  int socket_set_nodelay(int fd)
>  {
>      int v = 1;
> -    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
> +    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));
>  }
>  
>  int qemu_madvise(void *addr, size_t len, int advice)

Please cast to void * instead, for clarity.

The parameter is void * in modern setsockopt().  No cast required.
Winsock appears to be stuck in the stone age: it takes char *.
Stefan Hajnoczi - March 6, 2013, 9:56 a.m.
On Tue, Mar 05, 2013 at 05:51:21PM +0800, Lei Li wrote:
> Pass the right type for setsockopt(), and this will also
> fix the compiler warning when cross build for qemu-ga.exe:
> 
> util/osdep.c: In function 'socket_set_nodelay':
> util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
>                    incompatible pointer type [enabled by default]
> In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
>                  from /home/lei/qemu_b/include/qemu-common.h:46,
>                  from util/osdep.c:48:
> /usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
>                  expected 'const char *' but argument is of type 'int *'
> 
> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> ---
>  util/osdep.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/util/osdep.c b/util/osdep.c
> index c408261..ce472a9 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> @@ -57,7 +57,7 @@ static const char *qemu_version = QEMU_VERSION;
>  int socket_set_cork(int fd, int v)
>  {
>  #if defined(SOL_TCP) && defined(TCP_CORK)
> -    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
> +    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
>  #else
>      return 0;
>  #endif
> @@ -66,7 +66,7 @@ int socket_set_cork(int fd, int v)
>  int socket_set_nodelay(int fd)
>  {
>      int v = 1;
> -    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
> +    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));

Please use qemu_setsockopt() instead of open-coding this.

Stefan
Lei Li - March 6, 2013, 1:07 p.m.
On 03/06/2013 05:56 PM, Stefan Hajnoczi wrote:
> On Tue, Mar 05, 2013 at 05:51:21PM +0800, Lei Li wrote:
>> Pass the right type for setsockopt(), and this will also
>> fix the compiler warning when cross build for qemu-ga.exe:
>>
>> util/osdep.c: In function 'socket_set_nodelay':
>> util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
>>                     incompatible pointer type [enabled by default]
>> In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
>>                   from /home/lei/qemu_b/include/qemu-common.h:46,
>>                   from util/osdep.c:48:
>> /usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
>>                   expected 'const char *' but argument is of type 'int *'
>>
>> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
>> ---
>>   util/osdep.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/util/osdep.c b/util/osdep.c
>> index c408261..ce472a9 100644
>> --- a/util/osdep.c
>> +++ b/util/osdep.c
>> @@ -57,7 +57,7 @@ static const char *qemu_version = QEMU_VERSION;
>>   int socket_set_cork(int fd, int v)
>>   {
>>   #if defined(SOL_TCP) && defined(TCP_CORK)
>> -    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
>> +    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
>>   #else
>>       return 0;
>>   #endif
>> @@ -66,7 +66,7 @@ int socket_set_cork(int fd, int v)
>>   int socket_set_nodelay(int fd)
>>   {
>>       int v = 1;
>> -    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
>> +    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));
> Please use qemu_setsockopt() instead of open-coding this.
>
> Stefan
>
Hi Stefan,

This compiler warning just shows up without any hacking
when cross build qemu-ga for windows by:

./configure --enable-guest-agent --cross-prefix=i686-w64-mingw32-
make qemu-ga.exe
Lei Li - March 6, 2013, 1:09 p.m.
On 03/06/2013 04:59 PM, Markus Armbruster wrote:
> Lei Li <lilei@linux.vnet.ibm.com> writes:
>
>> Pass the right type for setsockopt(), and this will also
>> fix the compiler warning when cross build for qemu-ga.exe:
>>
>> util/osdep.c: In function 'socket_set_nodelay':
>> util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
>>                     incompatible pointer type [enabled by default]
>> In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
>>                   from /home/lei/qemu_b/include/qemu-common.h:46,
>>                   from util/osdep.c:48:
>> /usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
>>                   expected 'const char *' but argument is of type 'int *'
>>
>> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
>> ---
>>   util/osdep.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/util/osdep.c b/util/osdep.c
>> index c408261..ce472a9 100644
>> --- a/util/osdep.c
>> +++ b/util/osdep.c
>> @@ -57,7 +57,7 @@ static const char *qemu_version = QEMU_VERSION;
>>   int socket_set_cork(int fd, int v)
>>   {
>>   #if defined(SOL_TCP) && defined(TCP_CORK)
>> -    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
>> +    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
>>   #else
>>       return 0;
>>   #endif
>> @@ -66,7 +66,7 @@ int socket_set_cork(int fd, int v)
>>   int socket_set_nodelay(int fd)
>>   {
>>       int v = 1;
>> -    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
>> +    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));
>>   }
>>   
>>   int qemu_madvise(void *addr, size_t len, int advice)
> Please cast to void * instead, for clarity.
>
> The parameter is void * in modern setsockopt().  No cast required.
> Winsock appears to be stuck in the stone age: it takes char *.

Got it, thanks.
Stefan Hajnoczi - March 6, 2013, 1:16 p.m.
On Wed, Mar 06, 2013 at 09:07:25PM +0800, Lei Li wrote:
> On 03/06/2013 05:56 PM, Stefan Hajnoczi wrote:
> >On Tue, Mar 05, 2013 at 05:51:21PM +0800, Lei Li wrote:
> >>Pass the right type for setsockopt(), and this will also
> >>fix the compiler warning when cross build for qemu-ga.exe:
> >>
> >>util/osdep.c: In function 'socket_set_nodelay':
> >>util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
> >>                    incompatible pointer type [enabled by default]
> >>In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
> >>                  from /home/lei/qemu_b/include/qemu-common.h:46,
> >>                  from util/osdep.c:48:
> >>/usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
> >>                  expected 'const char *' but argument is of type 'int *'
> >>
> >>Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
> >>---
> >>  util/osdep.c | 4 ++--
> >>  1 file changed, 2 insertions(+), 2 deletions(-)
> >>
> >>diff --git a/util/osdep.c b/util/osdep.c
> >>index c408261..ce472a9 100644
> >>--- a/util/osdep.c
> >>+++ b/util/osdep.c
> >>@@ -57,7 +57,7 @@ static const char *qemu_version = QEMU_VERSION;
> >>  int socket_set_cork(int fd, int v)
> >>  {
> >>  #if defined(SOL_TCP) && defined(TCP_CORK)
> >>-    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
> >>+    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
> >>  #else
> >>      return 0;
> >>  #endif
> >>@@ -66,7 +66,7 @@ int socket_set_cork(int fd, int v)
> >>  int socket_set_nodelay(int fd)
> >>  {
> >>      int v = 1;
> >>-    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
> >>+    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));
> >Please use qemu_setsockopt() instead of open-coding this.
> >
> >Stefan
> >
> Hi Stefan,
> 
> This compiler warning just shows up without any hacking
> when cross build qemu-ga for windows by:
> 
> ./configure --enable-guest-agent --cross-prefix=i686-w64-mingw32-
> make qemu-ga.exe

I understand you didn't introduce the bug and noticed it when compiling
for Windows.

The correct fix is still to use qemu_setsockopt() which was added in
order to solve this portability problem.

You don't need any casts if you use qemu_setsockopt().

Stefan
Lei Li - March 6, 2013, 1:25 p.m.
On 03/06/2013 09:16 PM, Stefan Hajnoczi wrote:
> On Wed, Mar 06, 2013 at 09:07:25PM +0800, Lei Li wrote:
>> On 03/06/2013 05:56 PM, Stefan Hajnoczi wrote:
>>> On Tue, Mar 05, 2013 at 05:51:21PM +0800, Lei Li wrote:
>>>> Pass the right type for setsockopt(), and this will also
>>>> fix the compiler warning when cross build for qemu-ga.exe:
>>>>
>>>> util/osdep.c: In function 'socket_set_nodelay':
>>>> util/osdep.c:69:5: warning: passing argument 4 of 'setsockopt' from
>>>>                     incompatible pointer type [enabled by default]
>>>> In file included from /home/lei/qemu_b/include/sysemu/os-win32.h:30:0,
>>>>                   from /home/lei/qemu_b/include/qemu-common.h:46,
>>>>                   from util/osdep.c:48:
>>>> /usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:990:63: note:
>>>>                   expected 'const char *' but argument is of type 'int *'
>>>>
>>>> Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
>>>> ---
>>>>   util/osdep.c | 4 ++--
>>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/util/osdep.c b/util/osdep.c
>>>> index c408261..ce472a9 100644
>>>> --- a/util/osdep.c
>>>> +++ b/util/osdep.c
>>>> @@ -57,7 +57,7 @@ static const char *qemu_version = QEMU_VERSION;
>>>>   int socket_set_cork(int fd, int v)
>>>>   {
>>>>   #if defined(SOL_TCP) && defined(TCP_CORK)
>>>> -    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
>>>> +    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
>>>>   #else
>>>>       return 0;
>>>>   #endif
>>>> @@ -66,7 +66,7 @@ int socket_set_cork(int fd, int v)
>>>>   int socket_set_nodelay(int fd)
>>>>   {
>>>>       int v = 1;
>>>> -    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
>>>> +    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));
>>> Please use qemu_setsockopt() instead of open-coding this.
>>>
>>> Stefan
>>>
>> Hi Stefan,
>>
>> This compiler warning just shows up without any hacking
>> when cross build qemu-ga for windows by:
>>
>> ./configure --enable-guest-agent --cross-prefix=i686-w64-mingw32-
>> make qemu-ga.exe
> I understand you didn't introduce the bug and noticed it when compiling
> for Windows.
>
> The correct fix is still to use qemu_setsockopt() which was added in
> order to solve this portability problem.
>
> You don't need any casts if you use qemu_setsockopt().
>
> Stefan

Sorry, I understand it just now...  :-[
Sure, thanks!

Patch

diff --git a/util/osdep.c b/util/osdep.c
index c408261..ce472a9 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -57,7 +57,7 @@  static const char *qemu_version = QEMU_VERSION;
 int socket_set_cork(int fd, int v)
 {
 #if defined(SOL_TCP) && defined(TCP_CORK)
-    return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
+    return setsockopt(fd, SOL_TCP, TCP_CORK, (char *)&v, sizeof(v));
 #else
     return 0;
 #endif
@@ -66,7 +66,7 @@  int socket_set_cork(int fd, int v)
 int socket_set_nodelay(int fd)
 {
     int v = 1;
-    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
+    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&v, sizeof(v));
 }
 
 int qemu_madvise(void *addr, size_t len, int advice)