3

ユーザーがバグレポートを提出しました。私のアプリケーションは "__fortify_fail()" でセグメンテーション違反を起こしました。

これは、Debian の「強化」フラグを使用してアプリケーションをビルドすることに関連していることを理解しています-D_FORTIFY_SOURCE=2 -fstack-protector

残念ながら、ユーザーのバックトレースはまだ多くを教えてくれません.

__fortify_fail何が起こっているのかをよりよく理解するために、実際に何が起こっているのか知りたいです。

4

1 に答える 1

5

この関数は通常、単なるエラー レポーターです。glibc のサンプル コードは次のとおりです。

extern char **__libc_argv attribute_hidden;

void
__attribute__ ((noreturn))
__fortify_fail (msg)
     const char *msg;
{
  /* The loop is added only to keep gcc happy.  */
  while (1)
    __libc_message (2, "*** %s ***: %s terminated\n",
                    msg, __libc_argv[0] ?: "<unknown>");
}
libc_hidden_def (__fortify_fail)

それは、ソースが強化されていることが好ましい場所で、あちこちで呼び出される場合があります。「Fortification」自体は、ほんの数回の実行時チェックです。openat関数の使用例io/openat.cは次のとおりです。

int
__openat_2 (fd, file, oflag)
     int fd;
     const char *file;
     int oflag;
{
  if (oflag & O_CREAT)
    __fortify_fail ("invalid openat call: O_CREAT without mode");

  return __openat (fd, file, oflag);
}

強化O_CREATなし、モードなしで許容されます (それでも、このケースは非常に疑わしいですが、合法です)。

__fortify_failprintf+abort について考えてみてください。

あなたの質問についてテレパシーをオンにすると、ユーザー コードで libc を使用する際に問題が発生する可能性があります。/lib/x86_64-linux-gnu/libc.so.6(+0xebdf0)[0x7f75d3576df0]は、いくつかの実行時チェックが失敗する libc 内pd[0x49b5c0]の場所であるため、libc が誤って呼び出された場所です。

于 2013-02-06T10:11:30.483 に答える