0

getpeername() は、valgrind でコードを実行した場合にのみ失敗します。正常に実行すると、getpeername が失敗することはありません。

引数「in」にはソケット関連の情報が含まれ、「out」にはガベージ (初期化されていない) は含まれません。

SOCK_GetPeerName(ITS_SocketInfo in, ITS_SocketInfo out) { char buf[BUF_SZ] = {0};

memset(out, 0, sizeof(ITS_SocketInfo));

out->socket = in->socket;
out->type = in->type;

if ( (out->addr = calloc(1, sizeof(struct sockaddr))) == NULL)
{  
    return (ITS_ENOMEM);
}

out->asize = sizeof(struct sockaddr);

if (getpeername(in->socket, out->addr, (socklen_t*)&out->asize) != 0)
{  
    ITS_TRACE_ERROR(("Error: %s errno: %d\n", strerror_r(errno, buf, BUF_SZ), errno));  <--- failing with errno : 13 (permission denied)
    free(out->addr);
    return (ITS_EBADSOCKET);
}

out->af = in->af;

return (ITS_SUCCESS);

この問題は centOS 6 シリーズでのみ発生しており、centOS 7.1 で valgrind を使用して同じソース コードを実行すると、getpeername は失敗しません。

この問題を理解するのを手伝ってくれる人はいますか?

4

0 に答える 0