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)