[PATCH 3/3] handle return values of read, write and fgets

Tito farmatito at tiscali.it
Tue Jul 31 20:07:26 UTC 2012


On Tuesday 31 July 2012 15:15:51 manuel.f.zerpies at ww.stud.uni-erlangen.de wrote:
> From: Manuel Zerpies <manuel.f.zerpies at ww.stud.uni-erlangen.de>
> 
> Check the return values of read(), write() and fgets().
> 
> Signed-off-by: Manuel Zerpies <manuel.f.zerpies at 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) {

Hi,
this is used only at compile time and has no impact on
busybox binary size, so it could be ok.

> -			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++)

idem 

> -		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;
> +	}
>  
>  	return 0;
>  }
> 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);

	Looks ok, maybe it is pleonastic if command's memory is always initialised to 0
        as in this case strlen returns 0 itself.

> +	if (c == NULL)
> +		return 0;
>  	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;

What will contain our buf at this point??
Isn't there some fallback code after this point 
that by returning gets skipped??
Looks not good to me.
>  	}
>  	/* Paranoia. /dev/urandom may be missing.
>  	 * rand() is guaranteed to generate at least [0, 2^15) range,
> 


Ciao,
Tito


More information about the busybox mailing list