[Coco] getenv() bug in cgfx7!

Willard Goosey goosey at virgo.sdc.org
Fri Dec 11 23:45:06 EST 2009


This has not been my day for having computers cooperate with me...

Anyway, I found a bug in getenv() in Mike Sweet's cgfx7 library.

Here's the corrected source for the function:
------cut here-----------------------------------------------
/*
 "getenv.c" - environment variable reading/setting functions.
 updated 8/6/90 by Mike Sweet
 updated 12/11/2k9 by Willard Goosey
 ---compare with the length of the string were looking for
 ---not the string from _ENVFILE
*/
/*#define DEBUG 1*/

char *_ENVFILE=0; /* this global pointer holds the current ENV.FILE contents. */
static char envstr[81];

static char *readenv()
{
 register int path,len;

 if (!(_ENVFILE=malloc(1024)))
  return(0);

 if ((path=open("/dd/sys/env.file",1))==-1)
  {
   free(_ENVFILE);
   _ENVFILE=0;
   return(0);
  };

 if ((len=read(path,_ENVFILE,1023))<0)
  {
   close(path);
   free(_ENVFILE);
   _ENVFILE=0;
   return(0);
  };

 _ENVFILE[len]=0;
 close(path);
 return(_ENVFILE);
}



static char *findenv(s)
char *s;
{
 char *temp;
 register int len;

 if (!_ENVFILE)
  readenv();

 temp=_ENVFILE;

 while (temp)
  {
   if (temp[0]!='*') /* ignore commented lines */
    {
     len=0;
     while ((temp[len]!=' ') && (temp[len]!='='))
      len++;
/*do this compare with len(s) chars, not len(temp) chars*/
     if (strnucmp(temp,s,strlen(s))==0)
      {
#ifdef DEBUG
      printf("matched %s with %s",s,temp);
#endif
       temp+=len;
       while (*temp && *temp!='=')
        temp++;
       temp++;
       while (*temp && *temp==' ')
        temp++;
       return(temp);
      };
    };
   if (temp=strchr(temp,13))
    temp++;
  };
 return(0);
}


char *getenv(s)
char *s;
{
 register char *temp;

 temp=findenv(s);
 strncpy(envstr,temp,(char *)strchr(temp,13)-temp);
 return(envstr);
} 



putenv(v,s)
char *v,*s;
{
 register char *temp;
 int len,slen,path;

 slen=strlen(s);

 if (temp=findenv(v))
  {
   len=(char *)strchr(temp,13)-temp;
   movemem(temp+slen,temp+len,strlen(temp+len)+1);
   movemem(temp,s,slen);
  }
 else if (_ENVFILE)
  {
   if ((strlen(v)+strlen(_ENVFILE)+slen+2)>1023)
    return;
   strcat(_ENVFILE,v);
   strcat(_ENVFILE,"=");
   strcat(_ENVFILE,s);
   strcat(_ENVFILE,"\n");
  }
 else
  return;

 if ((path=open("/dd/sys/env.file",2))==-1)
  return;

 write(path,_ENVFILE,strlen(_ENVFILE));
 close(path);
 return;
}

----------------------------cut here-------------------------

I don't know what else to do with this.  RTSI seems to have quit
updating thier ftp site.

I recommomend compiling this, then do: merge getenv.r cgfx.l > newcgfx.l

I tried to use lb to split the library up and replace the rof file,
but that didn't work because there are 3 modules that are called
mouse.r in the library, and lb overwrites the first 2!  And right now
I'm too cranky to attempt recompiling all of cgfx7.

now maybe I can get back to the bugs in MY code. :-(

Willard
-- 
Willard Goosey  goosey at sdc.org
Socorro, New Mexico, USA
I search my heart and find Cimmeria, land of Darkness and the Night.
  -- R.E. Howard



More information about the Coco mailing list