I created new function get_cmd_record() - looks like a fscanf() wrapper for
first switch in *get_record().
When something go wrong - eg. open fd, read from fd, etc, get_cmd_record()
returns zero as a failure.

I skipped second switch block, for detailed information (write to output
name of cmd):

#v+
@@ -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);
#v-

I skipped setting oops_error, because it's never tested.

I can add a testing oops_error in while() statement:

#v+
/* Additional patch */
@@ -449,8 +484,10 @@
                        free(p);
                        oops_error = -1;
                        return NULL;
-       } while( cmd != C_EOR);
+       } while( cmd != C_EOR && oops_error != -1);

+       if(oops_error == -1)
+               return NULL;
        return p;
#v-

then it makes sense to use.

But, there we need to ask - we need to test it?

Patch for rev 159 in attachment.
--- 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);

Reply via email to