[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [PATCH 3/3] handle return values of read, write and fgets
From:       walter harms <wharms () bfs ! de>
Date:       2012-09-27 14:33:00
Message-ID: 5064639C.4000908 () bfs ! de
[Download RAW message or body]



Am 27.09.2012 16:04, schrieb Denys Vlasenko:
> On Tue, Jul 31, 2012 at 3:15 PM,
> <manuel.f.zerpies@ww.stud.uni-erlangen.de> wrote:
> > From: Manuel Zerpies <manuel.f.zerpies@ww.stud.uni-erlangen.de>
> > 
> > Check the return values of read(), write() and fgets().
> > 
> > Signed-off-by: Manuel Zerpies <manuel.f.zerpies@ww.stud.uni-erlangen.de>
> > ---
> > applets/applet_tables.c |    5 ++++-
> > applets/usage.c         |    7 +++++--
> > libbb/lineedit.c        |    4 +++-
> > libbb/xfuncs_printf.c   |    4 +++-
> > 4 files changed, 15 insertions(+), 5 deletions(-)
> > 
> > diff --git a/applets/applet_tables.c b/applets/applet_tables.c
> > index 152d5f4..ffd4a82 100644
> > --- a/applets/applet_tables.c
> > +++ b/applets/applet_tables.c
> > @@ -141,8 +141,11 @@ int main(int argc, char **argv)
> > line_old[0] = 0;
> > fp = fopen(argv[2], "r");
> > if (fp) {
> > -                       fgets(line_old, sizeof(line_old), fp);
> > +                       char *c = fgets(line_old, sizeof(line_old), fp);
> > fclose(fp);
> > +                       if (c == NULL) {
> > +                               return 1;
> > +                       }
> > }
> > sprintf(line_new, "#define NUM_APPLETS %u\n", NUM_APPLETS);
> > if (strcmp(line_old, line_new) != 0) {
> > diff --git a/applets/usage.c b/applets/usage.c
> > index 94520ff..faa6b27 100644
> > --- a/applets/usage.c
> > +++ b/applets/usage.c
> > @@ -48,8 +48,11 @@ int main(void)
> > qsort(usage_array,
> > num_messages, sizeof(usage_array[0]),
> > compare_func);
> > -       for (i = 0; i < num_messages; i++)
> > -               write(STDOUT_FILENO, usage_array[i].usage, \
> > strlen(usage_array[i].usage) + 1); +       for (i = 0; i < num_messages; i++) {
> > +               ssize_t r = write(STDOUT_FILENO, usage_array[i].usage, \
> > strlen(usage_array[i].usage) + 1); +               if (r < 0)
> > +                       return 1;
> > +       }
> 
> You can also add short write handling.
> And btw, we have tons of printf's all over the place w/o result check,
> want to fix them all? :)
> 

i am a big fan of dprintf() because it si now posix we could use it here ?

re,
 wh



> 
> > diff --git a/libbb/lineedit.c b/libbb/lineedit.c
> > index b89748a..356c7f1 100644
> > --- a/libbb/lineedit.c
> > +++ b/libbb/lineedit.c
> > @@ -2729,7 +2729,9 @@ int FAST_FUNC read_line_input(const char* prompt, char* \
> > command, int maxsize) {
> > fputs(prompt, stdout);
> > fflush_all();
> > -       fgets(command, maxsize, stdin);
> > +       char *c = fgets(command, maxsize, stdin);
> > +       if (c == NULL)
> > +               return 0;
> 
> Should return -1 (see libbb.h comment).
> 
> > return strlen(command);
> > }
> > 
> > diff --git a/libbb/xfuncs_printf.c b/libbb/xfuncs_printf.c
> > index 29c963f..9c76fbb 100644
> > --- a/libbb/xfuncs_printf.c
> > +++ b/libbb/xfuncs_printf.c
> > @@ -590,8 +590,10 @@ void FAST_FUNC generate_uuid(uint8_t *buf)
> > 
> > i = open("/dev/urandom", O_RDONLY);
> > if (i >= 0) {
> > -               read(i, buf, 16);
> > +               ssize_t r = read(i, buf, 16);
> > close(i);
> > +               if (r < 0)
> > +                       return;
> 
> Well, paranoia code below takes care of the possibility
> of read error.
> 
> > }
> > /* Paranoia. /dev/urandom may be missing.
> > * rand() is guaranteed to generate at least [0, 2^15) range,
> 
> 
> 
> commit b2320370be14811459718b9fe418efed75ea3615
> Author: Denys Vlasenko <vda.linux@googlemail.com>
> Date:   Thu Sep 27 16:03:49 2012 +0200
> 
> lineedit: in !EDITING config, return -1 on fgets error
> 
> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
> 
> diff --git a/libbb/lineedit.c b/libbb/lineedit.c
> index 92bea85..dbe6164 100644
> --- a/libbb/lineedit.c
> +++ b/libbb/lineedit.c
> @@ -2729,7 +2729,8 @@ int FAST_FUNC read_line_input(const char*
> prompt, char* command, int maxsize)
> {
> fputs(prompt, stdout);
> fflush_all();
> -       fgets(command, maxsize, stdin);
> +       if (!fgets(command, maxsize, stdin))
> +               return -1;
> return strlen(command);
> }
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
> 
> 
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic