Merged revisions 281085 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Fri, 6 Aug 2010 18:58:39 +0000 (18:58 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Fri, 6 Aug 2010 18:58:39 +0000 (18:58 +0000)
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

index 5961a73..6f2c884 100644 (file)
@@ -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);
        }