LINUX.ORG.RU

История изменений

Исправление RiseOfDeath, (текущая версия) :

В функции get_information :

parse_answer_from_server ( &buf[0] );

Зачем? buf сам по себе указатель на начало массива. Можно просто передать buf в качестве аргумента.

В функции parse_answer_from_server:

Если хоть один из указателей на «аргументы» равен нулю (т.е. вы не нашли такой «аргумент» при парсинге) вы очищаете память у всех «аргументов», а потом безусловно пихаете в sprintf строки по невалидном указателям. Если вам повезет и прога тут не упадет с сегфолтом, то она тут же упадет с double free, т.к. вы потом (опять же бузесловно) очищаете память под «аргументы», даже если уже очистили ее до.

Кроме того, в функции get_information вы проверяете что ваш answer не NULL, однако таковым он окажется только если память не будет выделена в parse_answer_from_server, но тогда вы тут же сегфолтнетесь на memset.

Исправление RiseOfDeath, :

В функции get_information :

parse_answer_from_server ( &buf[0] );

Зачем? buf сам по себе указатель на начало массива. Можно просто передать buf в качестве аргумента.

В функции parse_answer_from_server:

Если хоть один из указателей на «аргументы» равен нулю (т.е. вы не нашли такой «аргумент» при парсинге) вы очищаете память у всех «аргументов», а потом безусловно пихаете в sprintf строки по невалидном указателям. Если вам повезет и прога тут не упадет с сегфолтом, то она тут же упадет с double free, т.к. вы потом (опять же бузесловно) очищаете память под «аргументы», даже если уже очистили ее до.

Исправление RiseOfDeath, :

В функции get_information :

parse_answer_from_server ( &buf[0] );

Зачем? buf сам по себе указатель на начало массива. Можно просто передать buf в качестве аргумента.

В функции parse_answer_from_server:

Если хоть один из указателей на «аргументы» равен нулю вы очищаете память у всех «аргументов», а потом безусловно пихаете в sprintf строки по невалидном указателям. Если вам повезет и прога тут не упадет с сегфолтом, то она тут же упадет с double free, т.к. вы потом (опять же бузесловно) очищаете память под «аргументы», даже если уже очистили ее до.

Исходная версия RiseOfDeath, :

parse_answer_from_server ( &buf[0] );

Зачем? buf сам по себе указатель на начало массива. Можно просто передать buf в качестве аргумента.

В функции parse_answer_from_server, если хоть один из указателей на «аргументы» равен нулю вы очищаете память у всех «аргументов», а потом безусловно пихаете в sprintf строки по невалидном указателям. Если вам повезет и прога тут не упадет с сегфолтом, то она тут же упадет с double free, т.к. вы потом (опять же бузесловно) очищаете память под «аргументы», даже если уже очистили ее до.