reallo c в скрипте cgi - PullRequest
       28

reallo c в скрипте cgi

0 голосов
/ 18 июня 2020

Рассмотрим следующий исходный код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
        char *input;

        char *sql;
        sql = (char *) malloc(strlen("SELECT url, title FROM crawl.crawled " + 1));
        sql = "SELECT url, title FROM crawl.crawled ";
        sql = (char *) realloc(sql, 1000);
}

В моей настройке ubuntu 20.04 / nginx / cgi это вызывает ошибку 502 Bad Gateway. Оскорбительная строка кажется realloc, поскольку, когда я прокомментировал это, проблема исчезла.

Почему? В чем проблема со скриптами realloc и cgi?

1 Ответ

0 голосов
/ 18 июня 2020

Все в этом коде неверно.

  • strlen("SELECT url, title FROM crawl.crawled " + 1) выполняет арифметику указателя c на строковом литерале, что бессмысленно. Должно было быть strlen(...) + 1.
  • sql = ... еще раз отменяет предыдущее присвоение этой переменной (и создает утечку). Вы, вероятно, хотели использовать strcpy.
  • Вызов reallo c не имеет никакого смысла, это просто раздувание. Однако он сработает sh и сгорит из-за ошибки в предыдущей строке.

Вы можете заменить все это на что-то вроде:

const char SELECT_URL[] = "SELECT url, title FROM crawl.crawled ";
char *sql = malloc (sizeof SELECT_URL);
memcpy(sql, SELECT_URL, sizeof SELECT_URL);

Где sizeof неявно принимает в расчет нулевой терминатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...