0

名前付きパイプを使用して Linux でログイン システムを作成しようとしています。

正しいパスワードが推測されるか、試行に 3 回失敗するまで実行される do-while ループがあります。問題は、ユーザーに新しいパスワードを「尋ねる」たびに、最後のパスワードと現在のパスワードがバッファに連結されることです。

do
    {

        if(tentativas_login > 0)
        {
            sleep(5);
        } 
        if (tentativas_login > 2)
        {
            close(c_fifo_fd);
            close(s_fifo_fd);
            unlink(c_fifo_fname);
            sleep(5);
            return;
        }
        printf("[ADMIN]: Introduza password de acesso: ");
        scanf("%s", buffer);

        /* ---- b) GET PASSWORD ---- */
        strcat(login_flag, buffer);
        strcat(login_flag, ".");
        printf("Sent: %s\n", login_flag); //-> here is the problem
        strncpy(perg.palavra,login_flag,TAM_MAX-1); //copia a palavra lida do "buffer" para a "perg.palavra"

        /* ---- c) SEND PASSWORD ---- */
        write(s_fifo_fd, & perg, sizeof(perg));

        sleep(1);

        read_res = read(c_fifo_fd, & resp, sizeof(resp));
            if (read_res == sizeof(resp))
            {
                compare_result = strncmp(resp.palavra, "Pass Certa", 100);
                printf("[ADMIN]: Devolveu -> %s \n", resp.palavra);
                if(compare_result != 0)
                {
                    printf("[ADMIN]: Password errada! Tente novamente.\n");
                    tentativas_login++;
                }
            }
            else
            {
                printf("Sem resposta ou resposta incompreensivel[%d]\n",read_res);
            }

    }while(compare_result != 0);

入力:

foo
bar
pikachu

出力:

login.foo.
login.foo.bar
login.foo.bar.pikachu.
4

1 に答える 1

2

古いバッファをクリアせずに strcat() を使用しています。言い換えれば、新しいバッファと古いバッファが追加されているのは、それがあなたがそうするように指示したからです。次のように、各ループの開始時にバッファをゼロにします。

memset(login_flag, 0, length_of_buffer);
于 2013-06-08T00:59:58.173 に答える