[GRASS5] Re: [winGRASS] ARG_MAX and parser.c

Glynn Clements glynn.clements at virgin.net
Wed Aug 8 15:39:04 EDT 2001


Andreas Lange wrote:

> There is no ARG_MAX in src/libes/gis/parser.c and there will never be
> one. 
> 
> I just added some ifdefs to
> src.garden/grass.postgresql/d.site.pg/main.c, as this did not compile on
> cygwin. 

Er, why is that file using ARG_MAX anyway?

1. AFAICT, if the statement is longer than ARG_MAX, the code will
simply read the first ARG_MAX bytes of the statement then try to
execute that as an SQL query.

2. The buffer which is being limited to ARG_MAX bytes (SQL_stmt) is
being passed to PQexec(); so why is the limit ARG_MAX bytes? The libpq
documentation (from PostgreSQL 6.5.3) says:

    Caveats
    
    The query buffer is 8192 bytes long, and queries over that length
    will be rejected.

However, I don't see that simply truncating the query helps at all. I
suspect it would be better to just pass the entire query and let
PQexec() reject it.

> On my cygwin install there is no ARG_MAX defined anywhere, only
> _POSIX_ARG_MAX (in limits.h). So i defined ARG_MAX to be _POSIX_ARG_MAX
> if it is undefined. This should be 4096 in any case.  

While we're on the subject of ARG_MAX, it might be worth making a
couple of points in case anyone ever finds a *valid* use for it.

1. ARG_MAX is optional. If it's defined, it should be defined in
<limits.h>, but it isn't required to be defined.

2. If ARG_MAX isn't defined, it may be that the maximum size of an
argument list isn't known until run-time. In this case, the value can
be obtained using sysconf(_SC_ARG_MAX).

3. It's possible that there isn't any limit on the size of an argument
list. In this case, sysconf(_SC_ARG_MAX) will return zero and leave
errno unchanged.

4. In the event that there isn't any limit, the appropriate response
depends upon the context. If you're calling exec(), no problem; you
can give it as much data as you want. OTOH, if you want to allocate a
buffer to store the program's arguments (argv), the only correct
option is to dynamically enlarge the buffer as necessary (which should
probably be done anyway; even if the size is fixed, it could be fixed
at very large value, e.g. more memory than the system actually has).

-- 
Glynn Clements <glynn.clements at virgin.net>



More information about the grass-dev mailing list