--- init.c-orig 2014-02-11 12:00:37.460388340 -0800 +++ init.c 2014-02-11 12:12:25.677388224 -0800 @@ -352,6 +352,25 @@ } /* + * Read value from *f fd, + */ +int get_cmd_record(FILE *f, const char *format, ...) +{ + int c; + va_list vlist; + + va_start(vlist, format); + c = vfscanf(f, format, vlist); + va_end(vlist); + if(c < 0){ + fprintf(stderr, "init.c: unable to read data from pipe"); + return 0; + } + + return 1; +} + +/* * Read a CHILD * from the state pipe. */ static CHILD *get_record(FILE *f) @@ -372,34 +391,44 @@ case C_REC: break; case D_RUNLEVEL: - fscanf(f, "%c\n", &runlevel); + if(!get_cmd_record(f, "%c\n", &runlevel)) + return NULL; break; case D_THISLEVEL: - fscanf(f, "%c\n", &thislevel); + if(!get_cmd_record(f, "%c\n", &thislevel)) + return NULL; break; case D_PREVLEVEL: - fscanf(f, "%c\n", &prevlevel); + if(!get_cmd_record(f, "%c\n", &prevlevel)) + return NULL; break; case D_GOTSIGN: - fscanf(f, "%u\n", &got_signals); + if(!get_cmd_record(f, "%u\n", &got_signals)) + return NULL; break; case D_WROTE_WTMP_REBOOT: - fscanf(f, "%d\n", &wrote_wtmp_reboot); + if(!get_cmd_record(f, "%d\n", &wrote_wtmp_reboot)) + return NULL; break; case D_WROTE_UTMP_REBOOT: - fscanf(f, "%d\n", &wrote_utmp_reboot); + if(!get_cmd_record(f, "%d\n", &wrote_utmp_reboot)) + return NULL; break; case D_SLTIME: - fscanf(f, "%d\n", &sltime); + if(!get_cmd_record(f, "%d\n", &sltime)) + return NULL; break; case D_DIDBOOT: - fscanf(f, "%d\n", &did_boot); + if(!get_cmd_record(f, "%d\n", &did_boot)) + return NULL; break; case D_WROTE_WTMP_RLEVEL: - fscanf(f, "%d\n", &wrote_wtmp_rlevel); + if(!get_cmd_record(f, "%d\n", &wrote_wtmp_rlevel)) + return NULL; break; case D_WROTE_UTMP_RLEVEL: - fscanf(f, "%d\n", &wrote_utmp_rlevel); + if(!get_cmd_record(f, "%d\n", &wrote_utmp_rlevel)) + return NULL; break; default: if (cmd > 0 || cmd == C_EOF) { @@ -418,10 +447,16 @@ get_void(f); break; case C_PID: - fscanf(f, "%d\n", &(p->pid)); + if(fscanf(f, "%d\n", &(p->pid)) < 0){ + fprintf(stderr, "Failed to read PID: %s\n", strerror(errno)); + return NULL; + } break; case C_EXS: - fscanf(f, "%u\n", &(p->exstat)); + if(fscanf(f, "%u\n", &(p->exstat)) < 0){ + fprintf(stderr, "Failed to read EXS: %s\n", strerror(errno)); + return NULL; + } break; case C_LEV: get_string(p->rlevel, sizeof(p->rlevel), f);