- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
void *_band_get_aligned(Band *p, size_t alignment, size_t size)
{
Block *which;
ListNode *x;
if (!__mallocsizes_inited) {
__malloc_sizes_init();
}
assert(size <= p->nbpe);
if (alignment != _MALLOC_ALIGN) {
size_t esize = p->nbpe + SB_OVERHEAD();
size_t dividend = (alignment / esize);
assert(alignment >= _MALLOC_ALIGN);
if (dividend > p->nalloc
|| (alignment != _MALLOC_ALIGN
&& dividend * esize != alignment)) { /* not an even multiple */
errno = EINVAL;
return NULL;
}
}
if ((which = p->alist) != NULL) {
if (alignment != _MALLOC_ALIGN) {
x = (ListNode *)_block_memalign(p, which, alignment);
}
else {
x = (ListNode *)_block_mem_malloc_align(p, which);
}
if (x != NULL) {
#ifdef STATISTICS
p->alloc_counter++;
#endif
x->ln_offset = (char *)which - (char *)x;
assert(x->ln_offset < 0);
assert(which->navail > 0);
/*
* If no more blocks, put this on the depleted-list
*/
if (--which->navail == 0) {
Block *b;
assert(which->head == NULL);
assert(which->prev == NULL);
/*
* Simple delete -- which is first.
*/
p->alist = b = which->next;
if (b)
b->prev = NULL;
/*
* insert into d(epleted)list
*/
which->next = b = p->dlist;
p->dlist = which;
if (b)
b->prev = which;
}
_malloc_stats.m_small_allocmem += p->nbpe;
_malloc_stats.m_small_freemem -= p->nbpe;
return x+1;
}
}
if ((which = band_addblk(p)) == NULL) {
return 0; /* failed */
}
assert(which->navail);
return _band_get_aligned(p, alignment, size);
}
[color=blue]http://sourceforge.net/p/monartis/openqnx/ci/master/tree/trunk/lib/c/alloc/band.c#l346[color] - рекурсия в аллокаторе QNX. Некоторые компиляторы эту рекурсию оптимизируют, некоторые - нет. И когда не оптимизируют, она способна при определенных условия выжрать стек, что приводит к сегфолту, например как тут [color=blue]http://www.openqnx.com/phpbbforum/viewtopic.php?f=7&t=12896&view=print[color]
imihajlov 02.12.2015 16:48 # +2
bormand 02.12.2015 17:30 # +2
Bobik 02.12.2015 17:51 # 0
Исходя из названий функций мне приходит в голову только то, что два потока могут работать с одним Band (что уже странно, учитывая отсутствие блокировок), и между строками 69 и 73 кто-то успел забрать только что добавленную память.
Xom94ok 04.12.2015 23:19 # 0
> > In order to compile QNX, you have to install Momentics (6.4.0 is ok) locally
Эх, схалявить не выйдет... :-/
bormand 05.12.2015 14:43 # 0
j123123 05.12.2015 19:51 # +2
Xom94ok 05.12.2015 22:28 # 0
Xom94ok 05.12.2015 22:54 # 0
bormand 05.12.2015 23:13 # 0
Xom94ok 05.12.2015 23:59 # 0