[libvirt] [PATCH] time_t is not a long on FreeBSD, need to add casts

Eric Blake eblake at redhat.com
Sat May 14 15:07:55 UTC 2011


On 05/14/2011 02:32 AM, Matthias Bolte wrote:
>>> +        ignore_value(virAsprintf(&def->name, "%ld", (long)tv.tv_sec));
>>
>> Ouch.  Cygwin is thinking of making time_t a 64-bit entity, but since
>> cygwin is 32-bit, that's larger than long.
>>
>> We need to use %lld and (long long) instead (or %jd and intmax_t).
>>
> 
> Okay here are the two affected patches with long long instead of long.

> From 1d72db6b2e25168c80de6fcd420ca182fb273a6f Mon Sep 17 00:00:00 2001
> From: Matthias Bolte <matthias.bolte at googlemail.com>
> Date: Fri, 13 May 2011 07:07:13 +0200
> Subject: [PATCH] time_t is not a long on FreeBSD, need to add casts
> 
> Cast to long long to be on the safe side when time_t is a 64bit type.
> ---
>  src/conf/domain_conf.c |   13 ++++++++-----
>  1 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index a0eb43e..946297a 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -9070,7 +9070,7 @@ virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr,
>  
>      def->name = virXPathString("string(./name)", ctxt);
>      if (def->name == NULL)
> -        ignore_value(virAsprintf(&def->name, "%ld", tv.tv_sec));
> +        ignore_value(virAsprintf(&def->name, "%lld", (long long)tv.tv_sec));

This part's fine...

>  
>      if (def->name == NULL) {
>          virReportOOMError();
> @@ -9080,13 +9080,16 @@ virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr,
>      def->description = virXPathString("string(./description)", ctxt);
>  
>      if (!newSnapshot) {
> -        if (virXPathLong("string(./creationTime)", ctxt,
> -                         &def->creationTime) < 0) {
> +        long long creationTime;
> +
> +        if (virXPathLongLong("string(./creationTime)", ctxt,
> +                             &creationTime) < 0) {
>              virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                                   _("missing creationTime from existing snapshot"));
>              goto cleanup;
>          }
>  
> +        def->creationTime = creationTime;

But here, we should add a check for overflow, if long long is larger
than time_t, as in:

if (def->creationTime != creationTime) {
  virDomainReportError(..., _("overflow"));
}

> 0002-virsh-time_t-is-not-a-long-on-FreeBSD.patch
> 
> From 17cccebb1e35ae56f61802b796598dc16d8a4d02 Mon Sep 17 00:00:00 2001
> From: Matthias Bolte <matthias.bolte at googlemail.com>
> Date: Fri, 13 May 2011 08:31:03 +0200
> Subject: [PATCH] virsh: time_t is not a long on FreeBSD
> 
> localtime_r expects time_t.
> ---
>  tools/virsh.c |   10 ++++++----
>  1 files changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 3baa015..62ffc8e 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -10406,7 +10406,8 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
>      char *doc = NULL;
>      virDomainSnapshotPtr snapshot = NULL;
>      char *state = NULL;
> -    long creation;
> +    long long creation_longlong;
> +    time_t creation_time_t;
>      char timestr[100];
>      struct tm time_info;
>  
> @@ -10465,10 +10466,11 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
>              state = virXPathString("string(/domainsnapshot/state)", ctxt);
>              if (state == NULL)
>                  continue;
> -            if (virXPathLong("string(/domainsnapshot/creationTime)", ctxt,
> -                             &creation) < 0)
> +            if (virXPathLongLong("string(/domainsnapshot/creationTime)", ctxt,
> +                                 &creation_longlong) < 0)
>                  continue;
> -            localtime_r(&creation, &time_info);
> +            creation_time_t = creation_longlong;

Another instance where we need to check for overflow.

> +            localtime_r(&creation_time_t, &time_info);
>              strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S %z", &time_info);
>  
>              vshPrint(ctl, " %-20s %-25s %s\n", names[i], timestr, state);
> -- 1.7.0.4 

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110514/f384737a/attachment-0001.sig>


More information about the libvir-list mailing list