]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/dpkgpm.cc
merged the lp:~mvo/apt/mvo branch
[apt.git] / apt-pkg / deb / dpkgpm.cc
index 5747f11643cbc6ec335e1cedfedac843ca2602bb..eb9abe909fef1d4b2505a4579842f096443cec27 100644 (file)
@@ -890,7 +890,10 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 
       // Generate the argument list
       const char *Args[MaxArgs + 50];
 
       // Generate the argument list
       const char *Args[MaxArgs + 50];
-      
+      // keep track of allocated strings for multiarch package names
+      char *Packages[MaxArgs + 50];
+      unsigned int pkgcount = 0;
+
       // Now check if we are within the MaxArgs limit
       //
       // this code below is problematic, because it may happen that
       // Now check if we are within the MaxArgs limit
       //
       // this code below is problematic, because it may happen that
@@ -998,13 +1001,20 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       }      
       else
       {
       }      
       else
       {
+        string const nativeArch = _config->Find("APT::Architecture");
         for (;I != J && Size < MaxArgBytes; I++)
         {
            if((*I).Pkg.end() == true)
               continue;
            if (I->Op == Item::Configure && disappearedPkgs.find(I->Pkg.Name()) != disappearedPkgs.end())
               continue;
         for (;I != J && Size < MaxArgBytes; I++)
         {
            if((*I).Pkg.end() == true)
               continue;
            if (I->Op == Item::Configure && disappearedPkgs.find(I->Pkg.Name()) != disappearedPkgs.end())
               continue;
-           Args[n++] = I->Pkg.Name();
+           if (I->Pkg.Arch() == nativeArch || !strcmp(I->Pkg.Arch(), "all"))
+              Args[n++] = I->Pkg.Name();
+           else
+           {
+              Packages[pkgcount] = strdup(I->Pkg.FullName(false).c_str());
+              Args[n++] = Packages[pkgcount++];
+           }
            Size += strlen(Args[n-1]);
         }       
       }      
            Size += strlen(Args[n-1]);
         }       
       }      
@@ -1154,6 +1164,11 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       sigemptyset(&sigmask);
       sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask);
 
       sigemptyset(&sigmask);
       sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask);
 
+      /* clean up the temporary allocation for multiarch package names in
+         the parent, so we don't leak memory when we return. */
+      for (unsigned int i = 0; i < pkgcount; i++)
+        free(Packages[i]);
+
       // the result of the waitpid call
       int res;
       int select_ret;
       // the result of the waitpid call
       int res;
       int select_ret;