Ошибка сегментации при использовании popen () - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть функция для шифрования какой-либо строки.Это невероятно, но ... это ошибка: (

Я могу использовать функцию один раз, но во второй раз, сбой.

Спасибо!:)

Я работаюс bash Ubuntu (W10), без предупреждения (и ошибки), когда я компилирую свой проект.

char * encryptPassword(char * string){
    printf("DEBUT\n");
    FILE *fp=NULL;
    char path[1035];
    char password[32];
    //char * password = NULL; //for the encrypt password
    printf("MALLOC\n");
    //password = (char *)malloc(33*sizeof(char));
    char * result = NULL;
    char chaine[128] = "echo "; 
    char end_chaine[128] = " | openssl md5 | cut -d ' ' -f2"; 
    //Create the command
    printf("STRCAT\n");
    strcat(chaine,string); 
    strcat(chaine,end_chaine); 
    //Execute
    printf("POPEN %s\n",chaine);
    fp = popen(chaine, "r");
    //Reclaim the encrypted password
    printf("GETS\n");
    fgets(path, sizeof(path)-1, fp);
    pclose(fp);
    //To remove the character '\n'
    printf("SPRINTF\n");
    sprintf(password,"%32s",path);
    result = strtok(password,"\n");
    printf("%s\n",result);
    //OK IT'S FINISH !
    return (result);
}

1 Ответ

1 голос
/ 02 апреля 2019

Ошибка сегментации при использовании popen ()

Ваша проблема, вероятно, здесь:

 strcat(chaine,string); 

если входной параметр строка больше, другие поля слишком велики для chaine , и в этом случае вы выписываете его с неопределенным поведением (в вашем случае это кажется крушением) )

Вычислите необходимую длину, затем выделите строку перед тем, как ее заполнить.

Обратите внимание, что вы можете сделать это ленивым образом с двумя вызовами snprintf , первым для вычисления необходимого размера и вторым для заполнения команды. Это ленивый способ, потому что здесь вы просто объединяете строки, вы не пишете числа и т. Д., Нуждающиеся в непостоянном размере.


Однако это также может быть здесь после popen :

sprintf(password,"%32s",path);

потому что пароль имеет размер 32 и sprintf будет записывать 33 символа, чтобы также поместить окончательный нулевой символ


И если вы чудесным образом вернетесь из функции, вы, вероятно, не выживете от использования результата, поскольку он равен NULL или указатель на стек, который больше не действителен : пароль локальная переменная, поэтому strtok возвращает значение NULL или адрес пароль становится результатом функции

...