|
|
@@ -18,6 +18,8 @@
|
|
|
#include <apt-pkg/error.h>
|
|
|
#include <apt-pkg/strutl.h>
|
|
|
#include <apt-pkg/configuration.h>
|
|
|
+
|
|
|
+using std::max;
|
|
|
/*}}}*/
|
|
|
|
|
|
// SrcRecordParser::Binaries - Return the binaries field /*{{{*/
|
|
|
@@ -34,31 +36,19 @@ const char **debSrcRecordParser::Binaries()
|
|
|
if (Bins.empty() == true || Bins.length() >= 102400)
|
|
|
return 0;
|
|
|
|
|
|
- // 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
|
|
|
+ if (Bins.length() > BufSize)
|
|
|
{
|
|
|
- Buf = Buffer;
|
|
|
+ delete [] Buffer;
|
|
|
+ // allocate new size based on buffer (but never smaller than 4000)
|
|
|
+ BufSize = max((unsigned long)4000, max(Bins.length()+1,2*BufSize));
|
|
|
+ Buffer = new char[BufSize];
|
|
|
}
|
|
|
|
|
|
- strcpy(Buf,Bins.c_str());
|
|
|
- if (TokSplitString(',',Buf,StaticBinList,
|
|
|
+ strcpy(Buffer,Bins.c_str());
|
|
|
+ if (TokSplitString(',',Buffer,StaticBinList,
|
|
|
sizeof(StaticBinList)/sizeof(StaticBinList[0])) == false)
|
|
|
- {
|
|
|
- if (BigBuf != NULL)
|
|
|
- delete BigBuf;
|
|
|
return 0;
|
|
|
- }
|
|
|
|
|
|
- if (BigBuf != NULL)
|
|
|
- delete BigBuf;
|
|
|
return (const char **)StaticBinList;
|
|
|
}
|
|
|
/*}}}*/
|