On Tue, Apr 24, 2012 at 01:05:52AM -0400, Mansour Moufid wrote:
> In getenv.c, the __findenv function is changed to use size_t for its
> length parameter, and ptrdiff_t for its offset parameter.
> The getenv function is modified accordingly.
> 
> In setenv.c, the setenv function is also modified to match the changes
> to __findenv, as well as to use size_t for all variables representing
> object sizes.
> ---

Even better than in-lining the diff would be to provide a cvs diff
rather than a git diff. The official tree is distributed and
maintained in cvs, and thus we can't know what or where your git
tree comes from. A cvs diff also usually includes the information
necessary to find out where the diff applies. And some developers just
don't react well to git. :-)

Just reading the diff, since I'm not sure how or where to apply it,
I can't see much need for or concern about environment information
larger than MAXINT in size. Nor am I a fan of the (to me) silly
proliferation of types like ptrdiff_t.

Is there some standards/known constraint/current behaviour on other
unix's that this would address?

.... Ken

>  getenv.c |   11 ++++++-----
>  setenv.c |   31 +++++++++++++++++--------------
>  2 files changed, 23 insertions(+), 19 deletions(-)
> 
> diff --git a/getenv.c b/getenv.c
> index fd8482e..0b7a5f6 100644
> --- a/getenv.c
> +++ b/getenv.c
> @@ -29,9 +29,10 @@
>   */
>  
>  #include <stdlib.h>
> +#include <stddef.h>
>  #include <string.h>
>  
> -char *__findenv(const char *name, int len, int *offset);
> +char *__findenv(const char *name, size_t len, ptrdiff_t *offset);
>  
>  /*
>   * __findenv --
> @@ -44,10 +45,10 @@ char *__findenv(const char *name, int len, int *offset);
>   *   This routine *should* be a static; don't use it.
>   */
>  char *
> -__findenv(const char *name, int len, int *offset)
> +__findenv(const char *name, size_t len, ptrdiff_t *offset)
>  {
>       extern char **environ;
> -     int i;
> +     size_t i;
>       const char *np;
>       char **p, *cp;
>  
> @@ -72,10 +73,10 @@ __findenv(const char *name, int len, int *offset)
>  char *
>  getenv(const char *name)
>  {
> -     int offset = 0;
> +     ptrdiff_t offset = 0;
>       const char *np;
>  
>       for (np = name; *np && *np != '='; ++np)
>               ;
> -     return (__findenv(name, (int)(np - name), &offset));
> +     return (__findenv(name, (size_t)(np - name), &offset));
>  }
> diff --git a/setenv.c b/setenv.c
> index 089ab92..4f2b915 100644
> --- a/setenv.c
> +++ b/setenv.c
> @@ -30,9 +30,10 @@
>  
>  #include <errno.h>
>  #include <stdlib.h>
> +#include <stddef.h>
>  #include <string.h>
>  
> -char *__findenv(const char *name, int len, int *offset);
> +char *__findenv(const char *name, size_t len, ptrdiff_t *offset);
>  
>  extern char **environ;
>  static char **lastenv;                               /* last value of 
> environ */
> @@ -47,7 +48,7 @@ putenv(char *str)
>  {
>       char **P, *cp;
>       size_t cnt;
> -     int offset = 0;
> +     ptrdiff_t offset = 0;
>  
>       for (cp = str; *cp && *cp != '='; ++cp)
>               ;
> @@ -56,10 +57,10 @@ putenv(char *str)
>               return (-1);                    /* missing `=' in string */
>       }
>  
> -     if (__findenv(str, (int)(cp - str), &offset) != NULL) {
> +     if (__findenv(str, (size_t)(cp - str), &offset) != NULL) {
>               environ[offset++] = str;
>               /* could be set multiple times */
> -             while (__findenv(str, (int)(cp - str), &offset)) {
> +             while (__findenv(str, (size_t)(cp - str), &offset)) {
>                       for (P = &environ[offset];; ++P)
>                               if (!(*P = *(P + 1)))
>                                       break;
> @@ -92,7 +93,8 @@ setenv(const char *name, const char *value, int rewrite)
>  {
>       char *C, **P;
>       const char *np;
> -     int l_value, offset = 0;
> +     size_t value_len, name_len;
> +     ptrdiff_t offset = 0;
>  
>       for (np = name; *np && *np != '='; ++np)
>               ;
> @@ -102,21 +104,22 @@ setenv(const char *name, const char *value, int rewrite)
>               return (-1);                    /* has `=' in name */
>       }
>  #endif
> +     name_len = (size_t)(np - name);
>  
> -     l_value = strlen(value);
> -     if ((C = __findenv(name, (int)(np - name), &offset)) != NULL) {
> -             int tmpoff = offset + 1;
> +     value_len = strlen(value);
> +     if ((C = __findenv(name, name_len, &offset)) != NULL) {
> +             ptrdiff_t tmpoff = offset + 1;
>               if (!rewrite)
>                       return (0);
>  #if 0 /* XXX - existing entry may not be writable */
> -             if (strlen(C) >= l_value) {     /* old larger; copy over */
> +             if (strlen(C) >= value_len) {   /* old larger; copy over */
>                       while ((*C++ = *value++))
>                               ;
>                       return (0);
>               }
>  #endif
>               /* could be set multiple times */
> -             while (__findenv(name, (int)(np - name), &tmpoff)) {
> +             while (__findenv(name, name_len, &tmpoff)) {
>                       for (P = &environ[tmpoff];; ++P)
>                               if (!(*P = *(P + 1)))
>                                       break;
> @@ -136,8 +139,8 @@ setenv(const char *name, const char *value, int rewrite)
>               offset = cnt;
>               environ[cnt + 1] = NULL;
>       }
> -     if (!(environ[offset] =                 /* name + `=' + value */
> -         malloc((size_t)((int)(np - name) + l_value + 2))))
> +     /* name + `=' + value */
> +     if (!(environ[offset] = malloc(name_len + value_len + 2)))
>               return (-1);
>       for (C = environ[offset]; (*C = *name++) && *C != '='; ++C)
>               ;
> @@ -155,7 +158,7 @@ unsetenv(const char *name)
>  {
>       char **P;
>       const char *np;
> -     int offset = 0;
> +     ptrdiff_t offset = 0;
>  
>       if (!name || !*name) {
>               errno = EINVAL;
> @@ -169,7 +172,7 @@ unsetenv(const char *name)
>       }
>  
>       /* could be set multiple times */
> -     while (__findenv(name, (int)(np - name), &offset)) {
> +     while (__findenv(name, (size_t)(np - name), &offset)) {
>               for (P = &environ[offset];; ++P)
>                       if (!(*P = *(P + 1)))
>                               break;
> -- 
> 1.7.7.5 (Apple Git-26)

Reply via email to