[libvirt] [PATCH] Make all bitfields unsigned ints to avoid unexpected values in casts

Daniel Veillard veillard at redhat.com
Tue Jan 19 12:38:33 UTC 2010


On Tue, Jan 19, 2010 at 12:10:24PM +0000, Daniel P. Berrange wrote:
> The 'int virInterfaceIsActive()' method was directly returning the
> value of the 'int active:1' bitfield in virIntefaceDefPtr. A bitfield
> with a signed integer, will hold the values 0 and -1, not 0 and +1
> as might be expected. This meant that virInterfaceIsActive() was
> always returning -1 when the interface was active, not +1 & thus all
> callers thought an error had occurred. To protect against this kind
> of mistake again, change all bitfields to be unsigned ints
> 
> * daemon/libvirtd.h, src/conf/domain_conf.h, src/conf/interface_conf.h,
>   src/conf/network_conf.h: Change bitfields to unsigned int.
> ---
>  daemon/libvirtd.h         |   14 +++++++-------
>  src/conf/domain_conf.h    |   14 +++++++-------
>  src/conf/interface_conf.h |    2 +-
>  src/conf/network_conf.h   |    2 +-
>  4 files changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/daemon/libvirtd.h b/daemon/libvirtd.h
> index 2f647f3..a7591fc 100644
> --- a/daemon/libvirtd.h
> +++ b/daemon/libvirtd.h
> @@ -175,9 +175,9 @@ struct qemud_client {
>  
>      int fd;
>      int watch;
> -    int readonly:1;
> -    int closing:1;
> -    int domain_events_registered:1;
> +    unsigned int readonly :1;
> +    unsigned int closing :1;
> +    unsigned int domain_events_registered :1;
>  
>      struct sockaddr_storage addr;
>      socklen_t addrlen;
> @@ -185,7 +185,7 @@ struct qemud_client {
>      int type; /* qemud_sock_type */
>      gnutls_session_t tlssession;
>      int auth;
> -    int handshake : 1; /* If we're in progress for TLS handshake */
> +    unsigned int handshake :1; /* If we're in progress for TLS handshake */
>  #if HAVE_SASL
>      sasl_conn_t *saslconn;
>      int saslSSF;
> @@ -244,9 +244,9 @@ struct qemud_socket {
>  
>  struct qemud_worker {
>      pthread_t thread;
> -    int hasThread :1;
> -    int processingCall :1;
> -    int quitRequest : 1;
> +    unsigned int hasThread :1;
> +    unsigned int processingCall :1;
> +    unsigned int quitRequest :1;
>  
>      /* back-pointer to our server */
>      struct qemud_server *server;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 1413273..7be090d 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -400,8 +400,8 @@ enum virDomainVideoType {
>  typedef struct _virDomainVideoAccelDef virDomainVideoAccelDef;
>  typedef virDomainVideoAccelDef *virDomainVideoAccelDefPtr;
>  struct _virDomainVideoAccelDef {
> -    int support3d : 1;
> -    int support2d : 1;
> +    unsigned int support3d :1;
> +    unsigned int support2d :1;
>  };
>  
>  
> @@ -432,7 +432,7 @@ struct _virDomainGraphicsDef {
>      union {
>          struct {
>              int port;
> -            int autoport : 1;
> +            unsigned int autoport :1;
>              char *listenAddr;
>              char *keymap;
>              char *passwd;
> @@ -445,13 +445,13 @@ struct _virDomainGraphicsDef {
>          struct {
>              int port;
>              char *listenAddr;
> -            int autoport : 1;
> -            int replaceUser : 1;
> -            int multiUser : 1;
> +            unsigned int autoport :1;
> +            unsigned int replaceUser :1;
> +            unsigned int multiUser :1;
>          } rdp;
>          struct {
>              char *display;
> -            int fullscreen : 1;
> +            unsigned int fullscreen :1;
>          } desktop;
>      } data;
>  };
> diff --git a/src/conf/interface_conf.h b/src/conf/interface_conf.h
> index 2683eee..5b201d3 100644
> --- a/src/conf/interface_conf.h
> +++ b/src/conf/interface_conf.h
> @@ -170,7 +170,7 @@ typedef virInterfaceObj *virInterfaceObjPtr;
>  struct _virInterfaceObj {
>      virMutex lock;
>  
> -    int active:1;           /* 1 if interface is active (up) */
> +    unsigned int active:1;           /* 1 if interface is active (up) */
>      virInterfaceDefPtr def; /* The interface definition */
>  };
>  
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index 0214d1a..9e50659 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -65,7 +65,7 @@ struct _virNetworkDef {
>      char *bridge;       /* Name of bridge device */
>      char *domain;
>      unsigned long delay;   /* Bridge forward delay (ms) */
> -    int stp : 1; /* Spanning tree protocol */
> +    unsigned int stp :1; /* Spanning tree protocol */
>  
>      int forwardType;    /* One of virNetworkForwardType constants */
>      char *forwardDev;   /* Destination device for forwarding */

  ACK, one checking point to keep in mind, good idea !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list