On Sat, 22 Sep 2007, Sean C. Farley wrote:

On Sat, 22 Sep 2007, Bruce Evans wrote:
...
Partial analysis:
 - the size_t variable must have a small value that is representable
   as an int (else casting it to int would be a bug and/or printing a
   line of that length would be a style bug).

What would be a good maximum that would fit style?  Although still
fairly big, NL_TEXTMAX for the entire line looks plausible.

79 less the length of all other text on the line :-).

Would the best solution be to place a cap on the value?  If the value is
less than INT_MAX, cast it to an int else pass it INT_MAX.  Actually, it

I don't remember where the value comes from.  If it can be from user input
then it needs to be restricted somewhere, to INT_MAX as a last resort

looks like the value should never be greater than ARG_MAX if wanting to
be able to call exec since according to SUSv3 that is the:
   Maximum length of argument to the exec functions including
   environment data.

ARG_MAX can in theory be enormous (too large to be returned in a long
by sysconf()), but in practice it will be much smaller than INT_MAX.

Hopefully, no environment variables (name=value string) are anywhere
close in size to size_t.  :)

Ah I see where the value comes from.  A malicous user could probably
put > INT_MAX bytes in a single string in the environment on machines
with 32-bit ints, 64 bit address space and lots of RAM, and then fork()
but not exec().  That's close enough to user input for me.

Here is a patch (untested) to at least cast safely.  How does this look?

Index: getenv.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/stdlib/getenv.c,v
retrieving revision 1.12
diff -u -r1.12 getenv.c
--- getenv.c    22 Sep 2007 02:30:44 -0000      1.12
+++ getenv.c    22 Sep 2007 19:05:51 -0000
@@ -356,8 +356,8 @@
                activeNdx = envVarsTotal - 1;
                if (__findenv(envVars[envNdx].name, nameLen, &activeNdx,
                    false) == NULL) {
-                       warnx(CorruptEnvFindMsg, (int)nameLen,
-                           envVars[envNdx].name);
+                       warnx(CorruptEnvFindMsg, nameLen > INT_MAX ? INT_MAX
:
+                           (int)nameLen, envVars[envNdx].name);
                        errno = EFAULT;
                        goto Failure;
                }

OK (I think one line is only too long/split due to misquoting).

A more refined version would use something like strvis(), and could
use a smaller limit (with long corrupt strings indicated something
likje debuggers print long binary strings) since this this is only
debugging code, but *env.c is already too large for me.

Bruce
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to