Я хочу безопасно прочитать строку из std::istream
. Поток может быть любым, например, соединением на веб-сервере или с каким-либо файлом обработки, представленным неизвестными источниками. Есть много ответов, начинающих выполнять моральный эквивалент этого кода:
void read(std::istream& in) {
std::string line;
if (std::getline(in, line)) {
// process the line
}
}
Учитывая возможно сомнительный источник in
, использование вышеуказанного кода приведет к уязвимости: вредоносный агент может установить атаку отказа в обслуживании с помощью этого кода, используя огромную линию. Таким образом, я хотел бы ограничить длину строки некоторым довольно высоким значением, скажем, 4 миллиона char
s. Хотя может встречаться несколько больших строк, нецелесообразно выделять буфер для каждого файла и использовать std::istream::getline()
.
Как можно ограничить максимальный размер линии, в идеале, без искажения кода слишком плохо и без выделения больших блоков памяти спереди?