/* Bounded-pointer checking macros for C. Copyright (C) 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Greg McGary The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #if __BOUNDED_POINTERS__ /* The command-line arg vector and environment vector come to us from the OS as an unbounded pointer to an array of unbounded strings. The user's main expects argv and __environ to be bounded pointers to arrays of bounded strings. */ # define INIT_ARGV_and_ENVIRON \ do { \ int envc; \ for (envc = 0; *ubp_ev; ubp_ev++, envc++) \ ; \ ubp_ev -= envc; \ \ /* GKM FIXME: we could save some space by allocating only enough for \ the additional low & high words, and destructively rewriting \ argv in place. */ \ __ptrvalue (argv) = __ptrlow (argv) \ = alloca ((argc + envc + 2) * sizeof (*argv)); \ __ptrhigh (argv) = __ptrvalue (argv) + argc + 1; \ __ptrvalue (__environ) = __ptrlow (__environ) = __ptrhigh (argv); \ __ptrhigh (__environ) = __ptrvalue (__environ) + envc + 1; \ boundify_vector (__environ, ubp_ev); \ boundify_vector (argv, ubp_av); \ } while (0) /* Copy an unbounded vector of unbounded strings into a bounded counterpart. */ static void boundify_vector (char **dest, char *__unbounded *__unbounded src) { char *__unbounded s; for (; *src; src++, dest++) { __ptrvalue (*dest) = __ptrlow (*dest) = *src; __ptrhigh (*dest) = src[1]; } *dest = 0; /* The OS lays out strings contiguously in vector order, so */ for (s = __ptrvalue (dest[-1]); *s; s++) ; __ptrhigh (dest[-1]) = ++s; } #else # define INIT_ARGV_and_ENVIRON __environ = ubp_ev #endif