rng-tools: modify 'read error' message Make the 'read error' message more descriptive. Copied from https://bugzilla.redhat.com/attachment.cgi?id=1295857 and modified in one place to apply successfully. Error message during bootstrap modified to show device name. Upstream-Status: pending Signed-off-by: Joe Slater --- a/rngd.c +++ b/rngd.c @@ -247,8 +247,11 @@ static void do_loop(int random_step) continue; /* failed, no work */ retval = iter->xread(buf, sizeof buf, iter); - if (retval) + if (retval) { + message(LOG_DAEMON|LOG_ERR, + "Error reading from entropy source\n"); continue; /* failed, no work */ + } work_done = true; --- a/rngd_entsource.c +++ b/rngd_entsource.c @@ -63,10 +63,8 @@ int xread(void *buf, size_t size, struct size -= r; } - if (size) { - message(LOG_DAEMON|LOG_ERR, "read error\n"); + if (size) return -1; - } return 0; } @@ -152,7 +150,7 @@ error_out: } /* Initialize entropy source */ -static int discard_initial_data(struct rng *ent_src) +static int discard_initial_data(struct rng *ent_src, int *buf) { /* Trash 32 bits of what is probably stale (non-random) * initial state from the RNG. For Intel's, 8 bits would @@ -164,10 +162,12 @@ static int discard_initial_data(struct r xread(tempbuf, sizeof(tempbuf), ent_src); /* Return 32 bits of bootstrap data */ - xread(tempbuf, sizeof(tempbuf), ent_src); + if (xread(tempbuf, sizeof(tempbuf), ent_src) != 0) + return -1; - return tempbuf[0] | (tempbuf[1] << 8) | + *buf = tempbuf[0] | (tempbuf[1] << 8) | (tempbuf[2] << 16) | (tempbuf[3] << 24); + return 0; } /* @@ -175,6 +175,8 @@ static int discard_initial_data(struct r */ int init_entropy_source(struct rng *ent_src) { + int bootstrap; + ent_src->rng_fd = open(ent_src->rng_name, O_RDONLY); if (ent_src->rng_fd == -1) { return 1; @@ -182,7 +184,11 @@ int init_entropy_source(struct rng *ent_ src_list_add(ent_src); /* Bootstrap FIPS tests */ ent_src->fipsctx = malloc(sizeof(fips_ctx_t)); - fips_init(ent_src->fipsctx, discard_initial_data(ent_src)); + if (discard_initial_data(ent_src, &bootstrap) != 0) { + message(LOG_ERR|LOG_INFO, "Read failure in %s during bootstrap\n",ent_src->rng_name); + return 1; + } + fips_init(ent_src->fipsctx, bootstrap); return 0; } --- a/rngtest.c +++ b/rngtest.c @@ -335,6 +335,7 @@ static int discard_initial_data(void) return tempbuf[0] | (tempbuf[1] << 8) | (tempbuf[2] << 16) | (tempbuf[3] << 24); + } static void do_rng_fips_test_loop( void )