summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2020-12-03 11:12:45 +0100
committerDavid Kalnischkies <david@kalnischkies.de>2021-02-03 17:36:45 +0100
commit6630c3e5b6af77205b043208ef15720cf270075c (patch)
tree6cd30ec5451cfd08c03e989a8c32a900fd177416 /apt-pkg
parented192f410da36aedf5e54bb3f967e6613ab4bb51 (diff)
Remove Word size limit from ParseQuote and CWord
It isn't super likely that we will encounter such big words in the real world, but we can return arbitrary length, so lets just do that as that also means we don't have to work with a second buffer.
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/contrib/strutl.cc43
1 files changed, 17 insertions, 26 deletions
diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc
index 45e475b3e..7beb5f621 100644
--- a/apt-pkg/contrib/strutl.cc
+++ b/apt-pkg/contrib/strutl.cc
@@ -310,11 +310,11 @@ bool ParseQuoteWord(const char *&String,string &Res)
}
// Now de-quote characters
- char Buffer[1024];
+ Res.clear();
+ Res.reserve(C - String);
char Tmp[3];
const char *Start = String;
- char *I;
- for (I = Buffer; I < Buffer + sizeof(Buffer) && Start != C; I++)
+ while (Start != C)
{
if (*Start == '%' && Start + 2 < C &&
isxdigit(Start[1]) && isxdigit(Start[2]))
@@ -322,19 +322,15 @@ bool ParseQuoteWord(const char *&String,string &Res)
Tmp[0] = Start[1];
Tmp[1] = Start[2];
Tmp[2] = 0;
- *I = (char)strtol(Tmp,0,16);
+ Res.push_back(static_cast<char>(strtol(Tmp, 0, 16)));
Start += 3;
continue;
}
if (*Start != '"')
- *I = *Start;
- else
- I--;
- Start++;
+ Res.push_back(*Start);
+ ++Start;
}
- *I = 0;
- Res = Buffer;
-
+
// Skip ending white space
for (; isspace(*C) != 0; C++)
;
@@ -354,33 +350,28 @@ bool ParseCWord(const char *&String,string &Res)
;
if (*C == 0)
return false;
-
- char Buffer[1024];
- char *Buf = Buffer;
- if (strlen(String) >= sizeof(Buffer))
- return false;
-
- for (; *C != 0; C++)
+
+ Res.clear();
+ Res.reserve(strlen(String));
+ for (; *C != 0; ++C)
{
if (*C == '"')
{
for (C++; *C != 0 && *C != '"'; C++)
- *Buf++ = *C;
-
+ Res.push_back(*C);
+
if (*C == 0)
return false;
-
+
continue;
- }
-
+ }
+
if (C != String && isspace(*C) != 0 && isspace(C[-1]) != 0)
continue;
if (isspace(*C) == 0)
return false;
- *Buf++ = ' ';
+ Res.push_back(' ');
}
- *Buf = 0;
- Res = Buffer;
String = C;
return true;
}