Просмотр исходного кода

* methods/rred.cc:
- check return of writev() as gcc recommends
* methods/mirror.cc:
- check return of chdir() as gcc recommends
* apt-pkg/deb/dpkgpm.cc:
- check return of write() a gcc recommends
* apt-inst/deb/debfile.cc:
- check return of chdir() as gcc recommends
* apt-inst/deb/dpkgdb.cc:
- check return of chdir() as gcc recommends

David Kalnischkies лет назад: 14
Родитель
Сommit
319790f4f8
6 измененных файлов с 64 добавлено и 19 удалено
  1. 1 1
      apt-inst/deb/debfile.cc
  2. 1 2
      apt-inst/deb/dpkgdb.cc
  3. 28 8
      apt-pkg/deb/dpkgpm.cc
  4. 11 1
      debian/changelog
  5. 3 2
      methods/mirror.cc
  6. 20 5
      methods/rred.cc

+ 1 - 1
apt-inst/deb/debfile.cc

@@ -121,7 +121,7 @@ bool debDebFile::ExtractControl(pkgDataBase &DB)
    
    // Switch out of the tmp directory.
    if (chdir(Cwd.c_str()) != 0)
-      chdir("/");
+      return _error->Errno("chdir",_("Unable to change to %s"),Cwd.c_str());
    
    return true;
 }

+ 1 - 2
apt-inst/deb/dpkgdb.cc

@@ -286,8 +286,7 @@ bool debDpkgDB::ReadFList(OpProgress &Progress)
 
    delete [] Buffer;
    if (chdir(Cwd.c_str()) != 0)
-      chdir("/");
-   
+      return _error->Errno("chdir",_("Unable to change to %s"),Cwd.c_str());
    return !_error->PendingError();
 }
 									/*}}}*/

+ 28 - 8
apt-pkg/deb/dpkgpm.cc

@@ -163,6 +163,25 @@ pkgCache::VerIterator FindNowVersion(const pkgCache::PkgIterator &Pkg)
    return Ver;
 }
 									/*}}}*/
+ssize_t retry_write(int fd, const void *buf, size_t count)
+{
+   int Res;
+   ssize_t i = 0;
+   errno = 0;
+   do
+   {
+      Res = write(fd, buf, count);
+      if (Res < 0 && errno == EINTR)
+	 continue;
+      if (Res < 0)
+	 break;
+      buf = (char *)buf + Res;
+      count -= Res;
+      i += Res;
+   }
+   while (Res > 0 && count > 0);
+   return i;
+}
 
 // DPkgPM::pkgDPkgPM - Constructor					/*{{{*/
 // ---------------------------------------------------------------------
@@ -425,7 +444,7 @@ void pkgDPkgPM::DoStdin(int master)
    unsigned char input_buf[256] = {0,}; 
    ssize_t len = read(0, input_buf, sizeof(input_buf));
    if (len)
-      write(master, input_buf, len);
+      retry_write(master, input_buf, len);
    else
       d->stdin_is_dev_null = true;
 }
@@ -451,7 +470,7 @@ void pkgDPkgPM::DoTerminalPty(int master)
    }  
    if(len <= 0) 
       return;
-   write(1, term_buf, len);
+   retry_write(1, term_buf, len);
    if(d->term_out)
       fwrite(term_buf, len, sizeof(char), d->term_out);
 }
@@ -526,7 +545,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line)
 	     << ":" << s
 	     << endl;
       if(OutStatusFd > 0)
-	 write(OutStatusFd, status.str().c_str(), status.str().size());
+	 retry_write(OutStatusFd, status.str().c_str(), status.str().size());
       if (Debug == true)
 	 std::clog << "send: '" << status.str() << "'" << endl;
 
@@ -550,7 +569,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line)
 	     << ":" << list[3]
 	     << endl;
       if(OutStatusFd > 0)
-	 write(OutStatusFd, status.str().c_str(), status.str().size());
+	 retry_write(OutStatusFd, status.str().c_str(), status.str().size());
       if (Debug == true)
 	 std::clog << "send: '" << status.str() << "'" << endl;
       pkgFailures++;
@@ -564,7 +583,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line)
 	     << ":" << list[3]
 	     << endl;
       if(OutStatusFd > 0)
-	 write(OutStatusFd, status.str().c_str(), status.str().size());
+	 retry_write(OutStatusFd, status.str().c_str(), status.str().size());
       if (Debug == true)
 	 std::clog << "send: '" << status.str() << "'" << endl;
       return;
@@ -592,7 +611,7 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line)
 	     << ":" << s
 	     << endl;
       if(OutStatusFd > 0)
-	 write(OutStatusFd, status.str().c_str(), status.str().size());
+	 retry_write(OutStatusFd, status.str().c_str(), status.str().size());
       if (Debug == true)
 	 std::clog << "send: '" << status.str() << "'" << endl;
    }
@@ -1055,7 +1074,8 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       }
 
       int fd[2];
-      pipe(fd);
+      if (pipe(fd) != 0)
+	 return _error->Errno("pipe","Failed to create IPC pipe to dpkg");
 
 #define ADDARG(X) Args.push_back(X); Size += strlen(X)
 #define ADDARGC(X) Args.push_back(X); Size += sizeof(X) - 1
@@ -1236,7 +1256,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 		<< (PackagesDone/float(PackagesTotal)*100.0) 
 		<< ":" << _("Running dpkg")
 		<< endl;
-	 write(OutStatusFd, status.str().c_str(), status.str().size());
+	 retry_write(OutStatusFd, status.str().c_str(), status.str().size());
       }
       Child = ExecFork();
             

+ 11 - 1
debian/changelog

@@ -21,11 +21,21 @@ apt (0.8.16~exp14) UNRELEASED; urgency=low
     - check return of chdir() as gcc recommends
   * apt-pkg/contrib/netrc.cc:
     - check return of asprintf() as gcc recommends
+  * methods/rred.cc:
+    - check return of writev() as gcc recommends
+  * methods/mirror.cc:
+    - check return of chdir() as gcc recommends
+  * apt-pkg/deb/dpkgpm.cc:
+    - check return of write() a gcc recommends
+  * apt-inst/deb/debfile.cc:
+    - check return of chdir() as gcc recommends
+  * apt-inst/deb/dpkgdb.cc:
+    - check return of chdir() as gcc recommends
   * methods/makefile:
     - do not link rred against libz anymore as FileFd handles all
       this transparently now
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Tue, 20 Mar 2012 18:29:33 +0100
+ -- David Kalnischkies <kalnischkies@gmail.com>  Tue, 20 Mar 2012 19:22:49 +0100
 
 apt (0.8.16~exp13) experimental; urgency=low
 

+ 3 - 2
methods/mirror.cc

@@ -124,9 +124,10 @@ bool MirrorMethod::Clean(string Dir)
       if (I == list.end())
 	 unlink(Dir->d_name);
    };
-   
-   chdir(StartDir.c_str());
+
    closedir(D);
+   if (chdir(StartDir.c_str()) != 0)
+      return _error->Errno("chdir",_("Unable to change to %s"),StartDir.c_str());
    return true;   
 }
 

+ 20 - 5
methods/rred.cc

@@ -227,6 +227,21 @@ struct EdCommand {
   char type;
 };
 #define IOV_COUNT 1024 /* Don't really want IOV_MAX since it can be arbitrarily large */
+ssize_t retry_writev(int fd, const struct iovec *iov, int iovcnt) {
+	ssize_t Res;
+	errno = 0;
+	ssize_t i = 0;
+	do {
+		Res = writev(fd, iov + i, iovcnt);
+		if (Res < 0 && errno == EINTR)
+			continue;
+		if (Res < 0)
+			return _error->Errno("writev",_("Write error"));
+		iovcnt -= Res;
+		i += Res;
+	} while (Res > 0 && iovcnt > 0);
+	return i;
+}
 #endif
 										/*}}}*/
 RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From,		/*{{{*/
@@ -377,7 +392,7 @@ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From,		/*{{{*/
 			hash->Add((const unsigned char*) begin, input - begin);
 
 			if(++iov_size == IOV_COUNT) {
-				writev(out_file.Fd(), iov, IOV_COUNT);
+				retry_writev(out_file.Fd(), iov, IOV_COUNT);
 				iov_size = 0;
 			}
 		}
@@ -402,7 +417,7 @@ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From,		/*{{{*/
 				iov[iov_size].iov_len);
 
 				if(++iov_size == IOV_COUNT) {
-					writev(out_file.Fd(), iov, IOV_COUNT);
+					retry_writev(out_file.Fd(), iov, IOV_COUNT);
 					iov_size = 0;
 				}
 			}
@@ -417,15 +432,15 @@ RredMethod::State RredMethod::patchMMap(FileFd &Patch, FileFd &From,		/*{{{*/
 	}
 
 	if(iov_size) {
-		writev(out_file.Fd(), iov, iov_size);
+		retry_writev(out_file.Fd(), iov, iov_size);
 		iov_size = 0;
 	}
 
 	for(i = 0; i < iov_size; i += IOV_COUNT) {
 		if(iov_size - i < IOV_COUNT)
-			writev(out_file.Fd(), iov + i, iov_size - i);
+			retry_writev(out_file.Fd(), iov + i, iov_size - i);
 		else
-			writev(out_file.Fd(), iov + i, IOV_COUNT);
+			retry_writev(out_file.Fd(), iov + i, IOV_COUNT);
 	}
 
 	delete [] iov;