在C中调用crypt函数时的分段错误

时间:2014-12-18 18:52:19

标签: c

我传递了参数Arturo $ 1 $ salt $并且我收到了分段错误(核心转储)错误。

#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main (int argc, char* argv[])
{
    if ( argc != 3) {
        printf ("Usage: ./crypt key salt\n");
        return 1;
    }

    printf ("%s\n", crypt (argv[1], argv[2]));

    return 0;
}

2 个答案:

答案 0 :(得分:3)

答案结果很简单 - bash变量扩展。 shell中保留$字符,以标记变量的开头

所以当你运行

./program Arturo $1$salt$

变量扩展后的argv[2]将是

"$"

在glibc规范之后不是有效的盐(期望$id$salt$)。使用该种子调用crypt将返回NULL并将errno设置为EINVAL,因为种子无效,并且对printf的调用扼杀了NULL和段错误,这是你看到的行为。

如果您按如下方式执行程序,则禁用shell中的变量扩展:

./program Arturo '$1$salt$'

输出将是

$1$salt$y5SOwLketmwNfSvW0yAoz/

正如所料。

答案 1 :(得分:0)

假设:

typedef char *string;

来自crypt POSIX documentation

  

salt参数应该是一个长度至少为两个字节的字符串,不包括从集合中选择的空字符:

     

a b c d e f g h i j k l m n o p q r s t u v w x y z   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.   0 1 2 3 4 5 6 7 8 9。 /

但您通过了$1$salt$

因此,您必须检查crypt的返回值,并且仅在! = NULL时打印。

现在,如果您想使用glibc中的crypt函数,则必须在程序中包含crypt.h标题。请参阅glibc documentation中的示例。