From fc21c6f9e91af13c7379671a5bbe14ee4832fd9d Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Fri, 6 Aug 2010 18:58:39 +0000 Subject: [PATCH] Merged revisions 281085 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r281085 | tilghman | 2010-08-06 13:57:10 -0500 (Fri, 06 Aug 2010) | 8 lines Fix alignment of stringfields on the SPARC architecture (closes issue #17789) Reported by: Ian Mason Patches: 20100806__issue17789__2.diff.txt uploaded by tilghman (license 14) Tested by: Ian_Mason ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@281086 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/utils.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/main/utils.c b/main/utils.c index 5961a73394..6f2c884d0f 100644 --- a/main/utils.c +++ b/main/utils.c @@ -1615,7 +1615,8 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr size_t space = (*pool_head)->size - (*pool_head)->used; size_t to_alloc = needed + sizeof(ast_string_field_allocation); - if (__builtin_expect(to_alloc > space, 0)) { + /* This +1 accounts for alignment on SPARC */ + if (__builtin_expect(to_alloc + 1 > space, 0)) { size_t new_size = (*pool_head)->size; while (new_size < to_alloc) { @@ -1632,6 +1633,13 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr } result = (*pool_head)->base + (*pool_head)->used; +#ifdef __sparc__ + /* SPARC requires that the allocation field be aligned. */ + if ((long) result % sizeof(ast_string_field_allocation)) { + result++; + (*pool_head)->used++; + } +#endif (*pool_head)->used += to_alloc; (*pool_head)->active += needed; result += sizeof(ast_string_field_allocation); @@ -1706,6 +1714,12 @@ void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, } } else { target = (*pool_head)->base + (*pool_head)->used + sizeof(ast_string_field_allocation); +#ifdef __sparc__ + if ((long) target % sizeof(ast_string_field_allocation)) { + target++; + space--; + } +#endif available = space - sizeof(ast_string_field_allocation); }