Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Feb 2015 08:27:04 -0800
From:      "Simon J. Gerraty" <sjg@juniper.net>
To:        Poul-Henning Kamp <phk@phk.freebsd.dk>
Cc:        "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org>, Anuranjan Shukla <anshukla@juniper.net>, sjg@juniper.net
Subject:   Re: Buggy sbspace() on 64bit builds?
Message-ID:  <2705.1423240024@chaos>
In-Reply-To: <37282.1423208201@critter.freebsd.dk>
References:  <D0F95E21.2489D%anshukla@juniper.net> <37282.1423208201@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
Poul-Henning Kamp <phk@phk.freebsd.dk> wrote:
> >Any thoughts on what a fix should be for this?
> 
> size_t or intptr_t ?

I don't think so, the bug lies in the fact that on 64bit long is much
bigger than the uint's that are being manipulated.
Using a result object the same size works.

Here's a simple demo of the problem:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    uint a, b;
    long r1;
    int r2;

    a = 1;
    b = 2;

    r1 = a - b;
    r2 = a - b;

    printf("r1=%ld\nr2=%d\n", r1, r2);
    exit(0);
}

32bit version outputs:

r1=-1
r2=-1

64bit version outputs:

r1=4294967295
r2=-1

the r1 value is obviously not what is expected by the caller.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2705.1423240024>