patch attached -- Oohara Yuuma <[EMAIL PROTECTED]>
Lord, what fools these mortals be! --- William Shakespeare, "A Midsummer-Night's Dream"
diff -u -rN osh-1.7-unmodified/debian/changelog osh-1.7/debian/changelog --- osh-1.7-unmodified/debian/changelog 2005-11-09 23:34:25.000000000 +0900 +++ osh-1.7/debian/changelog 2005-11-09 23:34:41.000000000 +0900 @@ -1,3 +1,12 @@ +osh (1.7-15) unstable; urgency=high + + * urgency set to high because this version fixes a bug that causes + unauthorized privilege escalation (thanks to Charles Stevenson + <[EMAIL PROTECTED]> for the bug report) + * main.c: don't overwrite the return value of getenv() (closes: #338312) + + -- Oohara Yuuma <[EMAIL PROTECTED]> Wed, 9 Nov 2005 23:05:52 +0900 + osh (1.7-14) unstable; urgency=high * urgency set to high because this version fixes a buffer overflow diff -u -rN osh-1.7-unmodified/main.c osh-1.7/main.c --- osh-1.7-unmodified/main.c 2005-11-09 23:34:25.000000000 +0900 +++ osh-1.7/main.c 2005-11-09 23:34:41.000000000 +0900 @@ -442,31 +442,33 @@ fprintf(stderr,"Illegal or too long environment variable\n"); break; } - if ((env2=getenv(env))==NULL) { - char temp[255]; - char *temp2; - - strcpy(temp,env); - if ((temp2=(char *)strrchr(temp,'/'))!=NULL) { - if (temp2!=temp) - *temp2='\0'; - else - *(temp2+1)='\0'; - if ((env2=getenv(temp))!=NULL) { - strcat(env2,"/"); - strcat(env2,temp2+1); - } - } - } - if (env2==NULL) { - fprintf(stderr,"Nonexistent environment variable\n"); - break; - } - if ((argv[argc]=(char *)malloc(strlen(env2)+1))==NULL) { - fprintf(stderr,"Out of arg memory\n"); - break; - } - strcpy(argv[argc],env2); + { + char temp[255]; + /* temp2+1 is "" which is a valid string */ + char *temp2 = "\0"; + + if ((env2=getenv(env))==NULL) { + strcpy(temp,env); + if ((temp2=(char *)strrchr(temp,'/'))!=NULL) { + if (temp2!=temp) + *temp2='\0'; + else + *(temp2+1)='\0'; + env2=getenv(temp); + } + } + if (env2==NULL) { + fprintf(stderr,"Nonexistent environment variable\n"); + break; + } + if ((argv[argc]=(char *)malloc(strlen(env2)+strlen(temp2+1)+1))==NULL) { + fprintf(stderr,"Out of arg memory\n"); + break; + } + strcpy(argv[argc],env2); + strcpy(argv[argc]+strlen(env2), temp2+1); + *(argv[argc]+strlen(env2)+strlen(temp2+1)) = '\0'; + } /* of temp[] and *temp2 declaration */ argc++; continue; case TPIPE: