Hi,

this way we do not use the PWD_BUFFER_SIZE dependency, either we ignore it (and 
remove it as config option) or we consider it mandatory if defined

Regards, Peter
-------- Original-Nachricht --------
> Datum: Tue, 20 Dec 2011 06:40:28 -0600
> Von: William Pitcock <[email protected]>
> An: Joakim Tjernlund <[email protected]>
> CC: [email protected]
> Betreff: Re: getpass fgets check

> Hi,
> 
> On Tue, Dec 20, 2011 at 2:43 AM, Joakim Tjernlund
> <[email protected]> wrote:
> >> From: Daniel Wainwright <[email protected]>
> >> To: [email protected]
> >> Date: 2011/12/20 08:44
> >> Subject: getpass fgets check
> >> Sent by: [email protected]
> >>
> >> Hi,
> >>
> >> I believe there is a simple error in getpass.c, line 80:
> >>
> >>
> >>
> >>   static char buf[PWD_BUFFER_SIZE];
> >>
> >>   ...
> >>
> >>   /* Read the password.  */
> >>   fgets (buf, PWD_BUFFER_SIZE-1, in);
> >>   if (buf != NULL)
> >>
> >>   ...
> >>
> >>
> >>
> >> So the result of fgets is not being checked here, results in reading
> the
> >> buffer uninitialised below.
> >
> > yes, and I think(if max passwd len is important) that it should read
> >  fgets (buf, PWD_BUFFER_SIZE, in)
> > as fgets man page says:
> >       fgets() reads in at most one less than size characters from
> stream  and
> >       stores  them  into  the buffer pointed to by s.
> 
> I think that using 'sizeof buf' is cleaner and more futureproof than
> depending on PWD_BUFFER_SIZE.  Something like this should cleanly fix
> the potential usage of buf whilst in uninitialized state:
> 
> diff --git a/libc/unistd/getpass.c b/libc/unistd/getpass.c
> index 8d80182..b8cb640 100644
> --- a/libc/unistd/getpass.c
> +++ b/libc/unistd/getpass.c
> @@ -76,9 +76,11 @@ char * getpass (const char *prompt)
>    fputs(prompt, out);
>    fflush(out);
> 
> -  /* Read the password.  */
> -  fgets (buf, PWD_BUFFER_SIZE-1, in);
> -  if (buf != NULL)
> +  /* Read the password, ensuring buf is initialized first as fgets() may
> not
> +     touch the buffer itself. */
> +  *buf = '\0';
> +  fgets (buf, sizeof buf, in);
> +  if (*buf != '\0')
>      {
>        nread = strlen(buf);
>        if (nread < 0)
> 
> Please test and see if that fixes your problem.
> 
> William
> _______________________________________________
> uClibc mailing list
> [email protected]
> http://lists.busybox.net/mailman/listinfo/uclibc

-- 
NEU: FreePhone - 0ct/min Handyspartarif mit Geld-zurück-Garantie!               
Jetzt informieren: http://www.gmx.net/de/go/freephone
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to