Check the return value of fscanf() when reading a PID file.
[oweals/tinc.git] / lib / pidfile.c
index 61a802f69713c78e78dedfb4bf81680eac884402..dd6788a6539fea41ed1ce2790ab3446d795f5055 100644 (file)
@@ -41,7 +41,8 @@ pid_t read_pid (char *pidfile)
 
   if (!(f=fopen(pidfile,"r")))
     return 0;
-  fscanf(f,"%ld", &pid);
+  if(fscanf(f,"%ld", &pid) != 1)
+    pid = 0;
   fclose(f);
   return pid;
 }
@@ -84,8 +85,12 @@ pid_t write_pid (char *pidfile)
   int fd;
   pid_t pid;
 
-  if ( ((fd = open(pidfile, O_RDWR|O_CREAT, 0644)) == -1)
-       || ((f = fdopen(fd, "r+")) == NULL) ) {
+  if ((fd = open(pidfile, O_RDWR|O_CREAT, 0644)) == -1) {
+      return 0;
+  }
+
+  if ((f = fdopen(fd, "r+")) == NULL) {
+      close(fd);
       return 0;
   }
   
@@ -98,18 +103,18 @@ pid_t write_pid (char *pidfile)
 
   pid = getpid();
   if (!fprintf(f,"%ld\n", (long)pid)) {
-      close(fd);
+      fclose(f);
       return 0;
   }
   fflush(f);
 
 #ifdef HAVE_FLOCK
   if (flock(fd, LOCK_UN) == -1) {
-      close(fd);
+      fclose(f);
       return 0;
   }
 #endif
-  close(fd);
+  fclose(f);
 
   return pid;
 }