Pull to refresh

Comments 13

Да да, ожидал что тут просто лес будет. Но как было указано выше ребята видимо уже используют некоторый статический анализ.
не, видимо. остальные жуки гораздо веселее.
я хорошо помню, каких только крешей я не ловил на версии 0.8.
да и на 1.2 еще был тот еще.
ок, остальных, просто вылавливаемых современными методами статического анализа )
скорее всего проблемы были не в самом asterisk, а во-всяких библиотеках для sip, sccp, h.323 и прочего. Когда я занимался asterisk именно библиотеки (драйвера chan_* ) были источником проблем
UFO just landed and posted this here
UFO just landed and posted this here
Вот такое используют в libsodium:

#ifdef HAVE_WEAK_SYMBOLS
__attribute__((weak)) void
__sodium_dummy_symbol_to_prevent_lto(void * const pnt, const size_t len) { }
#endif

void
sodium_memzero(void * const pnt, const size_t len)
{
#ifdef HAVE_SECUREZEROMEMORY
    SecureZeroMemory(pnt, len);
#elif defined(HAVE_MEMSET_S)
    if (memset_s(pnt, (rsize_t) len, 0, (rsize_t) len) != 0) {
        abort();
    }
#elif defined(HAVE_EXPLICIT_BZERO)
    explicit_bzero(pnt, len);
#elif HAVE_WEAK_SYMBOLS
    memset(pnt, 0, len);
    __sodium_dummy_symbol_to_prevent_lto(pnt, len);
#else
    volatile unsigned char *pnt_ = (volatile unsigned char *) pnt;
    size_t                     i = (size_t) 0U;

    while (i < len) {
        pnt_[i++] = 0U;
    }
#endif
}

Чтобы не заморачиваться, кроссплатформенный способ(часть того что выше):
void memzero(void * const pnt, const size_t len) {
    volatile unsigned char *pnt_ = (volatile unsigned char *) pnt;
    size_t i = (size_t) 0U;

    while (i < len) {
        pnt_[i++] = 0U;
    }
}


Еще один я где-то тут уже предлагал(но не факт что будет работать везде):
void * (*volatile vol_memset)(void *, int, size_t) = memset;
void safe_memclear(void *mem, size_t len) { vol_memset(mem, 0, len); }
UFO just landed and posted this here
UFO just landed and posted this here
Sign up to leave a comment.