X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/b2e465d6d32d2dc884f58b94acb7e35f671a87fe..f8ac1720a94468d1384e88a57729e6d9801b56fd:/apt-pkg/deb/debsrcrecords.cc diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index d452095cd..cac36c2e6 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: debsrcrecords.cc,v 1.4 2001/02/20 07:03:17 jgg Exp $ +// $Id: debsrcrecords.cc,v 1.6 2004/03/17 05:58:54 mdz Exp $ /* ###################################################################### Debian Source Package Records - Parser implementation for Debian style @@ -31,13 +31,34 @@ const char **debSrcRecordParser::Binaries() { // This should use Start/Stop too, it is supposed to be efficient after all. string Bins = Sect.FindS("Binary"); - if (Bins.empty() == true || Bins.length() >= sizeof(Buffer)) + if (Bins.empty() == true || Bins.length() >= 102400) return 0; - strcpy(Buffer,Bins.c_str()); - if (TokSplitString(',',Buffer,StaticBinList, + // Workaround for #236688. Only allocate a new buffer if the field + // is large, to avoid a performance penalty + char *BigBuf = NULL; + char *Buf; + if (Bins.length() > sizeof(Buffer)) + { + BigBuf = new char[Bins.length()]; + Buf = BigBuf; + } + else + { + Buf = Buffer; + } + + strcpy(Buf,Bins.c_str()); + if (TokSplitString(',',Buf,StaticBinList, sizeof(StaticBinList)/sizeof(StaticBinList[0])) == false) + { + if (BigBuf != NULL) + delete BigBuf; return 0; + } + + if (BigBuf != NULL) + delete BigBuf; return (const char **)StaticBinList; } /*}}}*/ @@ -47,7 +68,7 @@ const char **debSrcRecordParser::Binaries() package/version records representing the build dependency. The returned array need not be freed and will be reused by the next call to this function */ -bool debSrcRecordParser::BuildDepends(vector &BuildDeps) +bool debSrcRecordParser::BuildDepends(vector &BuildDeps, bool ArchOnly) { unsigned int I; const char *Start, *Stop; @@ -61,6 +82,9 @@ bool debSrcRecordParser::BuildDepends(vector for (I = 0; I < 4; I++) { + if (ArchOnly && (I == 1 || I == 3)) + continue; + if (Sect.Find(fields[I], Start, Stop) == false) continue;