Author: freetz                       Date: Wed Feb 22 16:38:57 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- ppc segfault remedy

---- Files affected:
SOURCES:
   ghostscript-gpl-fix-gc.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/ghostscript-gpl-fix-gc.patch
diff -u /dev/null SOURCES/ghostscript-gpl-fix-gc.patch:1.1
--- /dev/null   Wed Feb 22 17:38:57 2006
+++ SOURCES/ghostscript-gpl-fix-gc.patch        Wed Feb 22 17:38:52 2006
@@ -0,0 +1,145 @@
+Index: gs/src/gxalloc.h
+===================================================================
+RCS file: /cvs/ghostscript/gs/src/gxalloc.h,v
+retrieving revision 1.11
+diff -b -u -r1.11 gxalloc.h
+--- gs/src/gxalloc.h   4 Aug 2004 19:36:12 -0000       1.11
++++ gs/src/gxalloc.h   14 Sep 2004 21:44:37 -0000
+@@ -143,7 +143,7 @@
+     byte *cbot;                       /* bottom of free area */
+                               /* (top of aligned objects) */
+     obj_header_t *rcur;               /* current refs object, 0 if none */
+-    byte *rtop;                       /* top of rcur */
++    byte *rtop;                       /* top of rcur, not aligned to 
obj_align_mod */
+     byte *ctop;                       /* top of free area */
+                               /* (bottom of strings) */
+     byte *climit;             /* top of strings */
+Index: gs/src/gxobj.h
+===================================================================
+RCS file: /cvs/ghostscript/gs/src/gxobj.h,v
+retrieving revision 1.6
+diff -b -u -r1.6 gxobj.h
+--- gs/src/gxobj.h     21 Feb 2002 22:24:53 -0000      1.6
++++ gs/src/gxobj.h     14 Sep 2004 21:44:37 -0000
+@@ -110,20 +110,22 @@
+ /* The only possible values for obj_align_mod are 4, 8, or 16.... */
+ #if obj_align_mod == 4
+ #  define log2_obj_align_mod 2
+-#else
+-#if obj_align_mod == 8
++#elif obj_align_mod == 8
+ #  define log2_obj_align_mod 3
+-#else
+-#if obj_align_mod == 16
++#elif obj_align_mod == 16
+ #  define log2_obj_align_mod 4
+-#endif
+-#endif
++#elif obj_align_mod == 32  /* for testing, not seen yet in the wild */
++#  define log2_obj_align_mod 5
++#else
++#  error Unexpected value of obj_align_mod
+ #endif
+ #define obj_align_mask (obj_align_mod-1)
+ #define obj_align_round(siz)\
+   (uint)(((siz) + obj_align_mask) & -obj_align_mod)
+ #define obj_size_round(siz)\
+   obj_align_round((siz) + sizeof(obj_header_t))
++#define ptr_align_round(p)\
++  ((byte *)obj_align_round((size_t)(p)))
+ 
+ /* Define the real object header type, taking alignment into account. */
+ struct obj_header_s {         /* must be a struct because of forward 
reference */
+Index: gs/src/ialloc.c
+===================================================================
+RCS file: /cvs/ghostscript/gs/src/ialloc.c,v
+retrieving revision 1.7
+diff -b -u -r1.7 ialloc.c
+--- gs/src/ialloc.c    4 Aug 2004 19:36:12 -0000       1.7
++++ gs/src/ialloc.c    14 Sep 2004 21:44:37 -0000
+@@ -157,8 +157,8 @@
+ 
+     /* If we're allocating a run of refs already, */
+     /* and we aren't about to overflow the maximum run length, use it. */
+-    if (mem->cc.rtop == mem->cc.cbot &&
+-      num_refs < (mem->cc.ctop - mem->cc.cbot) / sizeof(ref) &&
++    if (ptr_align_round(mem->cc.rtop) == mem->cc.cbot &&
++      num_refs < (mem->cc.ctop - mem->cc.rtop) / sizeof(ref) &&
+       mem->cc.rtop - (byte *) mem->cc.rcur + num_refs * sizeof(ref) <
+       max_size_st_refs
+       ) {
+@@ -169,8 +169,8 @@
+                 ialloc_trace_space(mem), client_name_string(cname),
+                 num_refs, (ulong) obj);
+       mem->cc.rcur[-1].o_size += num_refs * sizeof(ref);
+-      end = (ref *) (mem->cc.rtop = mem->cc.cbot +=
+-                     num_refs * sizeof(ref));
++      end = (ref *) (mem->cc.rtop += num_refs * sizeof(ref));
++      mem->cc.cbot = ptr_align_round(mem->cc.rtop);
+       make_mark(end - 1);
+     } else {
+       /*
+@@ -225,12 +225,12 @@
+       return_error(e_Fatal);
+     diff = old_num_refs - new_num_refs;
+     /* Check for LIFO.  See gs_free_ref_array for more details. */
+-    if (mem->cc.rtop == mem->cc.cbot &&
++    if (ptr_align_round(mem->cc.rtop) == mem->cc.cbot &&
+       (byte *) (obj + (old_num_refs + 1)) == mem->cc.rtop
+       ) {
+       /* Shorten the refs object. */
+-      ref *end = (ref *) (mem->cc.cbot = mem->cc.rtop -=
+-                          diff * sizeof(ref));
++      ref *end = (ref *) (mem->cc.rtop -= diff * sizeof(ref));
++      mem->cc.cbot = ptr_align_round(mem->cc.rtop);
+ 
+       if_debug4('A', "[a%d:<$ ]%s(%u) 0x%lx\n",
+                 ialloc_trace_space(mem), client_name_string(cname), diff,
+@@ -264,7 +264,7 @@
+      */
+     if (!r_has_type(parr, t_array))
+       DO_NOTHING;             /* don't look for special cases */
+-    else if (mem->cc.rtop == mem->cc.cbot &&
++    else if (ptr_align_round(mem->cc.rtop) == mem->cc.cbot &&
+            (byte *) (obj + (num_refs + 1)) == mem->cc.rtop
+       ) {
+       if ((obj_header_t *) obj == mem->cc.rcur) {
+@@ -278,7 +278,8 @@
+                     ialloc_trace_space(mem), client_name_string(cname),
+                     num_refs, (ulong) obj);
+           mem->cc.rcur[-1].o_size -= num_refs * sizeof(ref);
+-          mem->cc.rtop = mem->cc.cbot = (byte *) (obj + 1);
++          mem->cc.rtop = (byte *) (obj + 1);
++          mem->cc.cbot = ptr_align_round(mem->cc.rtop);
+           make_mark(obj);
+       }
+       return;
+Index: gs/src/igcref.c
+===================================================================
+RCS file: /cvs/ghostscript/gs/src/igcref.c,v
+retrieving revision 1.6
+diff -b -u -r1.6 igcref.c
+--- gs/src/igcref.c    4 Aug 2004 19:36:12 -0000       1.6
++++ gs/src/igcref.c    14 Sep 2004 21:44:37 -0000
+@@ -720,15 +720,18 @@
+           new_size += sizeof(ref_packed);
+     /* We want to make the newly freed space into a free block, */
+     /* but we can only do this if we have enough room. */
+-    if (size - new_size < sizeof(obj_header_t)) {     /* Not enough room.  
Pad to original size. */
++    if (size < obj_align_round(new_size) + sizeof(obj_header_t)) { /* Not 
enough room.  Pad to original size. */
+       while (new_size < size)
+           *dest++ = pt_tag(pt_integer),
+               new_size += sizeof(ref_packed);
+     } else {
+-      obj_header_t *pfree = (obj_header_t *) ((ref *) dest + 1);
++        byte *pfree_u = (byte *)dest + sizeof(ref);
++        byte *pfree_a = ptr_align_round(pfree_u);
++        obj_header_t *pfree = (obj_header_t *)pfree_a;
++        int align = pfree_a - pfree_u;
+ 
+       pfree->o_alone = 0;
+-      pfree->o_size = size - new_size - sizeof(obj_header_t);
++      pfree->o_size = size - new_size - sizeof(obj_header_t) - align;
+       pfree->o_type = &st_bytes;
+     }
+     /* Re-create the final ref. */
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to