]> git.saurik.com Git - apt.git/commitdiff
Merge remote-tracking branch 'mvo/bugfix/coverity' into debian/sid
authorMichael Vogt <mvo@debian.org>
Thu, 22 Aug 2013 20:24:27 +0000 (22:24 +0200)
committerMichael Vogt <mvo@debian.org>
Thu, 22 Aug 2013 20:24:27 +0000 (22:24 +0200)
Conflicts:
apt-pkg/tagfile.h

1  2 
apt-pkg/acquire-item.cc
apt-pkg/contrib/cmndline.cc
apt-pkg/contrib/strutl.cc
apt-pkg/tagfile.cc
apt-pkg/tagfile.h

diff --combined apt-pkg/acquire-item.cc
index 95dadcd6d2d7f7fc7905f9f62c1efb989d1ffedb,f70cabeff9764c7e3f66f75a4fd3dbbf943de1ed..97b2d1e29a79bcbd63c573883970050a3f12c51a
@@@ -984,6 -984,8 +984,8 @@@ void pkgAcqIndex::Done(string Message,u
     DestFile += ".decomp";
     Desc.URI = decompProg + ":" + FileName;
     QueueURI(Desc);
+    // FIXME: this points to a c++ string that goes out of scope
     Mode = decompProg.c_str();
  }
                                                                        /*}}}*/
@@@ -1067,7 -1069,8 +1069,7 @@@ pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquir
        
     string Final = _config->FindDir("Dir::State::lists");
     Final += URItoFileName(RealURI);
 -   struct stat Buf;
 -   if (stat(Final.c_str(),&Buf) == 0)
 +   if (RealFileExists(Final) == true)
     {
        // File was already in place.  It needs to be re-downloaded/verified
        // because Release might have changed, we do give it a differnt
     }
  
     QueueURI(Desc);
 +}
 +                                                                      /*}}}*/
 +pkgAcqMetaSig::~pkgAcqMetaSig()                                               /*{{{*/
 +{
 +   // if the file was never queued undo file-changes done in the constructor
 +   if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false &&
 +       LastGoodSig.empty() == false)
 +   {
 +      string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
 +      if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true)
 +       Rename(LastGoodSig, Final);
 +   }
 +
  }
                                                                        /*}}}*/
  // pkgAcqMetaSig::Custom600Headers - Insert custom request headers    /*{{{*/
@@@ -1607,25 -1597,14 +1609,25 @@@ pkgAcqMetaClearSig::pkgAcqMetaClearSig(
  
     // keep the old InRelease around in case of transistent network errors
     string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
 -   struct stat Buf;
 -   if (stat(Final.c_str(),&Buf) == 0)
 +   if (RealFileExists(Final) == true)
     {
        string const LastGoodSig = DestFile + ".reverify";
        Rename(Final,LastGoodSig);
     }
  }
                                                                        /*}}}*/
 +pkgAcqMetaClearSig::~pkgAcqMetaClearSig()                             /*{{{*/
 +{
 +   // if the file was never queued undo file-changes done in the constructor
 +   if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false)
 +   {
 +      string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
 +      string const LastGoodSig = DestFile + ".reverify";
 +      if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true)
 +       Rename(LastGoodSig, Final);
 +   }
 +}
 +                                                                      /*}}}*/
  // pkgAcqMetaClearSig::Custom600Headers - Insert custom request headers       /*{{{*/
  // ---------------------------------------------------------------------
  // FIXME: this can go away once the InRelease file is used widely
index 8cef8036872d38021760497580403ada8931c148,d77ef454056e78e3e6be31ff46781edf3fb20465..2086d91ca88b10b68f8697e3b2aa4580ee999753
@@@ -38,42 -38,6 +38,42 @@@ CommandLine::~CommandLine(
     delete [] FileList;
  }
                                                                        /*}}}*/
 +// CommandLine::GetCommand - return the first non-option word         /*{{{*/
 +char const * CommandLine::GetCommand(Dispatch const * const Map,
 +      unsigned int const argc, char const * const * const argv)
 +{
 +   // if there is a -- on the line there must be the word we search for around it
 +   // as -- marks the end of the options, just not sure if the command can be
 +   // considered an option or not, so accept both
 +   for (size_t i = 1; i < argc; ++i)
 +   {
 +      if (strcmp(argv[i], "--") != 0)
 +       continue;
 +      ++i;
 +      if (i < argc)
 +       for (size_t j = 0; Map[j].Match != NULL; ++j)
 +          if (strcmp(argv[i], Map[j].Match) == 0)
 +             return Map[j].Match;
 +      i -= 2;
 +      if (i != 0)
 +       for (size_t j = 0; Map[j].Match != NULL; ++j)
 +          if (strcmp(argv[i], Map[j].Match) == 0)
 +             return Map[j].Match;
 +      return NULL;
 +   }
 +   // no --, so search for the first word matching a command
 +   // FIXME: How like is it that an option parameter will be also a valid Match ?
 +   for (size_t i = 1; i < argc; ++i)
 +   {
 +      if (*(argv[i]) == '-')
 +       continue;
 +      for (size_t j = 0; Map[j].Match != NULL; ++j)
 +       if (strcmp(argv[i], Map[j].Match) == 0)
 +          return Map[j].Match;
 +   }
 +   return NULL;
 +}
 +                                                                      /*}}}*/
  // CommandLine::Parse - Main action member                            /*{{{*/
  // ---------------------------------------------------------------------
  /* */
@@@ -397,6 -361,7 +397,7 @@@ bool CommandLine::DispatchArg(Dispatch 
  void CommandLine::SaveInConfig(unsigned int const &argc, char const * const * const argv)
  {
     char cmdline[100 + argc * 50];
+    memset(cmdline, 0, sizeof(cmdline));
     unsigned int length = 0;
     bool lastWasOption = false;
     bool closeQuote = false;
     _config->Set("CommandLine::AsString", cmdline);
  }
                                                                        /*}}}*/
 +CommandLine::Args CommandLine::MakeArgs(char ShortOpt, char const *LongOpt, char const *ConfName, unsigned long Flags)/*{{{*/
 +{
 +   /* In theory, this should be a constructor for CommandLine::Args instead,
 +      but this breaks compatibility as gcc thinks this is a c++11 initializer_list */
 +   CommandLine::Args arg;
 +   arg.ShortOpt = ShortOpt;
 +   arg.LongOpt = LongOpt;
 +   arg.ConfName = ConfName;
 +   arg.Flags = Flags;
 +   return arg;
 +}
 +                                                                      /*}}}*/
index d06637155b48e7ea8977f1e7cbc5006ed01351af,b70a62a47ee960bd3b85846e212199f7caff5882..0955b69f79a67f538e1af0f59359f543cc3f5bb5
@@@ -943,6 -943,8 +943,8 @@@ bool StrToTime(const string &Val,time_
     Tm.tm_isdst = 0;
     if (Month[0] != 0)
        Tm.tm_mon = MonthConv(Month);
+    else
+       Tm.tm_mon = 0; // we don't have a month, so pick something
     Tm.tm_year -= 1900;
     
     // Convert to local time and then to GMT
@@@ -1291,18 -1293,6 +1293,18 @@@ bool CheckDomainList(const string &Host
     return false;
  }
                                                                        /*}}}*/
 +// strv_length - Return the length of a NULL-terminated string array  /*{{{*/
 +// ---------------------------------------------------------------------
 +/* */
 +size_t strv_length(const char **str_array)
 +{
 +   size_t i;
 +   for (i=0; str_array[i] != NULL; i++)
 +      /* nothing */
 +      ;
 +   return i;
 +}
 +
  // DeEscapeString - unescape (\0XX and \xXX) from a string            /*{{{*/
  // ---------------------------------------------------------------------
  /* */
diff --combined apt-pkg/tagfile.cc
index 10bc08d9501e385304adb93899ca8a113f3dc3e8,83c1a9a55c820ce0182c58ebeeb2fda221f2b2ee..868adf3d2b8c719ee96c0c9b951685d809ab7251
@@@ -50,27 -50,21 +50,27 @@@ public
  /* */
  pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long long Size)
  {
 +   /* The size is increased by 4 because if we start with the Size of the
 +      filename we need to try to read 1 char more to see an EOF faster, 1
 +      char the end-pointer can be on and maybe 2 newlines need to be added
 +      to the end of the file -> 4 extra chars */
 +   Size += 4;
     d = new pkgTagFilePrivate(pFd, Size);
  
     if (d->Fd.IsOpen() == false)
 -   {
        d->Start = d->End = d->Buffer = 0;
 +   else
 +      d->Buffer = (char*)malloc(sizeof(char) * Size);
 +
 +   if (d->Buffer == NULL)
        d->Done = true;
 -      d->iOffset = 0;
 -      return;
 -   }
 -   
 -   d->Buffer = new char[Size];
 +   else
 +      d->Done = false;
 +
     d->Start = d->End = d->Buffer;
 -   d->Done = false;
     d->iOffset = 0;
 -   Fill();
 +   if (d->Done == false)
 +      Fill();
  }
                                                                        /*}}}*/
  // TagFile::~pkgTagFile - Destructor                                  /*{{{*/
  /* */
  pkgTagFile::~pkgTagFile()
  {
 -   delete [] d->Buffer;
 +   free(d->Buffer);
     delete d;
  }
                                                                        /*}}}*/
 -// TagFile::Offset - Return the current offset in the buffer          /*{{{*/
 +// TagFile::Offset - Return the current offset in the buffer          /*{{{*/
  unsigned long pkgTagFile::Offset()
  {
     return d->iOffset;
   */
  bool pkgTagFile::Resize()
  {
 -   char *tmp;
 -   unsigned long long EndSize = d->End - d->Start;
 -
     // fail is the buffer grows too big
     if(d->Size > 1024*1024+1)
        return false;
  
 +   return Resize(d->Size * 2);
 +}
 +bool pkgTagFile::Resize(unsigned long long const newSize)
 +{
 +   unsigned long long const EndSize = d->End - d->Start;
 +
     // get new buffer and use it
 -   tmp = new char[2*d->Size];
 -   memcpy(tmp, d->Buffer, d->Size);
 -   d->Size = d->Size*2;
 -   delete [] d->Buffer;
 -   d->Buffer = tmp;
 +   char* newBuffer = (char*)realloc(d->Buffer, sizeof(char) * newSize);
 +   if (newBuffer == NULL)
 +      return false;
 +   d->Buffer = newBuffer;
 +   d->Size = newSize;
  
     // update the start/end pointers to the new buffer
     d->Start = d->Buffer;
@@@ -161,10 -152,9 +161,10 @@@ bool pkgTagFile::Fill(
     if (d->Done == false)
     {
        // See if only a bit of the file is left
 -      if (d->Fd.Read(d->End, d->Size - (d->End - d->Buffer),&Actual) == false)
 +      unsigned long long const dataSize = d->Size - ((d->End - d->Buffer) + 1);
 +      if (d->Fd.Read(d->End, dataSize, &Actual) == false)
         return false;
 -      if (Actual != d->Size - (d->End - d->Buffer))
 +      if (Actual != dataSize || d->Fd.Eof() == true)
         d->Done = true;
        d->End += Actual;
     }
        for (const char *E = d->End - 1; E - d->End < 6 && (*E == '\n' || *E == '\r'); E--)
         if (*E == '\n')
            LineCount++;
 -      for (; LineCount < 2; LineCount++)
 -       *d->End++ = '\n';
 +      if (LineCount < 2)
 +      {
 +       if ((unsigned)(d->End - d->Buffer) >= d->Size)
 +          Resize(d->Size + 3);
 +       for (; LineCount < 2; LineCount++)
 +          *d->End++ = '\n';
 +      }
        
        return true;
     }
@@@ -233,6 -218,16 +233,16 @@@ bool pkgTagFile::Jump(pkgTagSection &Ta
     return true;
  }
                                                                        /*}}}*/
+ // pkgTagSection::pkgTagSection - Constructor                         /*{{{*/
+ // ---------------------------------------------------------------------
+ /* */
+ pkgTagSection::pkgTagSection()
+    : Section(0), TagCount(0), Stop(0), d(NULL)
+ {
+    memset(&Indexes, 0, sizeof(Indexes));
+    memset(&AlphaIndexes, 0, sizeof(AlphaIndexes));
+ }
+                                                                       /*}}}*/
  // TagSection::Scan - Scan for the end of the header information      /*{{{*/
  // ---------------------------------------------------------------------
  /* This looks for the first double new line in the data stream.
diff --combined apt-pkg/tagfile.h
index 66c56799dd42c0408683e2cd0f074f8e9bba1679,7b496ffd89a0453f19a09e410cedbbc3a4af48ec..518d3dbcd60bf8d8caa512371aac4c1ca56f12b4
@@@ -84,7 -84,7 +84,7 @@@ class pkgTagSectio
        Stop = this->Stop;
     };
     
-    pkgTagSection() : Section(0), TagCount(0), d(NULL), Stop(0) {};
+    pkgTagSection();
     virtual ~pkgTagSection() {};
  };
  
@@@ -95,7 -95,6 +95,7 @@@ class pkgTagFil
  
     bool Fill();
     bool Resize();
 +   bool Resize(unsigned long long const newSize);
  
     public: