--- init.c-orig 2014-02-10 20:41:50.922024360 +0100 +++ init.c 2014-02-10 20:40:09.786021955 +0100 @@ -372,34 +372,74 @@ case C_REC: break; case D_RUNLEVEL: - fscanf(f, "%c\n", &runlevel); - break; + if(fscanf(f, "%c\n", &runlevel) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_THISLEVEL: - fscanf(f, "%c\n", &thislevel); - break; + if(fscanf(f, "%c\n", &thislevel) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_PREVLEVEL: - fscanf(f, "%c\n", &prevlevel); - break; + if(fscanf(f, "%c\n", &prevlevel) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_GOTSIGN: - fscanf(f, "%u\n", &got_signals); - break; + if(fscanf(f, "%u\n", &got_signals) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_WROTE_WTMP_REBOOT: - fscanf(f, "%d\n", &wrote_wtmp_reboot); - break; + if(fscanf(f, "%d\n", &wrote_wtmp_reboot) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_WROTE_UTMP_REBOOT: - fscanf(f, "%d\n", &wrote_utmp_reboot); - break; + if(fscanf(f, "%d\n", &wrote_utmp_reboot) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_SLTIME: - fscanf(f, "%d\n", &sltime); - break; + if(fscanf(f, "%d\n", &sltime) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_DIDBOOT: - fscanf(f, "%d\n", &did_boot); - break; + if(fscanf(f, "%d\n", &did_boot) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_WROTE_WTMP_RLEVEL: - fscanf(f, "%d\n", &wrote_wtmp_rlevel); - break; + if(fscanf(f, "%d\n", &wrote_wtmp_rlevel) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } + break; case D_WROTE_UTMP_RLEVEL: - fscanf(f, "%d\n", &wrote_utmp_rlevel); + if(fscanf(f, "%d\n", &wrote_utmp_rlevel) < 0){ + fprintf(stderr, "Read state pipe: %s\n", strerror(errno)); + oops_error = -1; + return NULL; + } break; default: if (cmd > 0 || cmd == C_EOF) { @@ -418,10 +458,17 @@ 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)); + oops_error = -1; + return NULL; + } break; case C_LEV: get_string(p->rlevel, sizeof(p->rlevel), f);