The Postfix fsspace() function wraps system APIs and represents the
result thusly:

struct fsspace {
    unsigned long block_size;           /* block size */
    unsigned long block_free;           /* free space */
};

If 'unsigned long' is a 32-bit type, then block_free will overflow if

    free space / block_size > 4 giga

The warning message may also suffer from overflow:

 /*
  * Multiplication factor for free space check. Free space must be at least
  * smtpd_space_multf * message_size_limit.
  */
double  smtpd_space_multf = 1.5;

        msg_warn("not enough free space in mail queue: %lu bytes < "
                 "%g*message size limit",
                 (unsigned long) fsbuf.block_free * fsbuf.block_size,
                 smtpd_space_multf);

The number in the warning message will overflow if 'unsigned long'
is a 32-bit type, and the free space is > 4GB.

So yes, I agree with the suggestion that this could be a 32-bit
problem. On a 64-bit system you want to have 64-bit longs.

Can you run the test program below? On my laptop (the default LP64 
environment, i.e. 64-bit long and pointer) the output looks like:

sizeof char: 1
sizeof short: 2
sizeof int: 4
sizeof long: 8
sizeof off_t: 8
sizeof ssize_t: 8
sizeof &char: 8
...

        Wietse

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

int     main(int argc, char **argv)
{
#define PRINT_SIZE_NP(x) do { \
        printf("sizeof %s: %ld\n", #x, (long) sizeof(x)); \
    } while (0)

    PRINT_SIZE_NP(char);
    PRINT_SIZE_NP(short);
    PRINT_SIZE_NP(int);
    PRINT_SIZE_NP(long);
    PRINT_SIZE_NP(off_t);
    PRINT_SIZE_NP(ssize_t);

#define PRINT_SIZE_PT(x) do { \
        x *y; printf("sizeof &%s: %ld\n", #x, (long) sizeof(y)); \
    } while (0)

    PRINT_SIZE_PT(char);
    PRINT_SIZE_PT(short);
    PRINT_SIZE_PT(int);
    PRINT_SIZE_PT(off_t);
    PRINT_SIZE_PT(ssize_t);

    return (0);
}

Reply via email to