summary refs log tree commit diff
path: root/pkgs/applications/graphics/hugin/levmar-64-bit-alignment.patch
blob: b0c39e378ec94b32c96b39f1acfc839eb651ee4b (plain) (blame)
1
2
3
4
5
6
7
8
9
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
This patch fixes alignment issues on 64-bit machines.  It was taken
from http://www.mail-archive.com/hugin-ptx@googlegroups.com/msg02976.html .
See also http://thread.gmane.org/gmane.linux.distributions.nixos/2352 .

--- hugin/src/foreign/levmar/misc_core.c	2009-04-28 13:30:33.000000000 +0200 # SVN 3799
+++ hugin/src/foreign/levmar/misc_core.c	2009-05-04 07:49:00.000000000 +0200 # Merged patch.pt and fix_alias.diff
@@ -332,7 +332,7 @@
   a_sz=m*m;
   u_sz=m*m; s_sz=m; vt_sz=m*m;
 
-  tot_sz=iworksz*sizeof(int) + (a_sz + u_sz + s_sz + vt_sz + worksz)*sizeof(LM_REAL);
+  tot_sz=(a_sz + u_sz + s_sz + vt_sz + worksz)*sizeof(LM_REAL) + iworksz*sizeof(int); /* should be arranged in that order for proper doubles alignment */
 
     buf_sz=tot_sz;
     buf=(LM_REAL *)malloc(buf_sz);
@@ -414,25 +414,27 @@
 int buf_sz=0;
 
 register int i, j, k, l;
-int *idx, maxi=-1, idx_sz, a_sz, x_sz, work_sz, tot_sz;
+int *idxbuf, *idx, maxi=-1, idx_sz, a_sz, x_sz, work_sz, tot_sz;
 LM_REAL *a, *x, *work, max, sum, tmp;
 
   /* calculate required memory size */
   idx_sz=m;
+  idxbuf=(void *)malloc(idx_sz*sizeof(int));
+
   a_sz=m*m;
   x_sz=m;
   work_sz=m;
-  tot_sz=idx_sz*sizeof(int) + (a_sz+x_sz+work_sz)*sizeof(LM_REAL);
+  tot_sz=(a_sz + x_sz + work_sz)*sizeof(LM_REAL) + idx_sz*sizeof(int); /* should be arranged in that order for proper doubles alignment */
 
   buf_sz=tot_sz;
   buf=(void *)malloc(tot_sz);
-  if(!buf){
+  if(!buf || !idxbuf){
     fprintf(stderr, RCAT("memory allocation in ", LEVMAR_LUINVERSE) "() failed!\n");
     exit(1);
   }
 
-  idx=(int *)buf;
-  a=(LM_REAL *)(idx + idx_sz);
+  idx=(int *)idxbuf;
+  a=(LM_REAL *)buf;
   x=a + a_sz;
   work=x + x_sz;
 
@@ -448,6 +450,7 @@
 		  if(max==0.0){
         fprintf(stderr, RCAT("Singular matrix A in ", LEVMAR_LUINVERSE) "()!\n");
         free(buf);
+	free(idxbuf);
 
         return 0;
       }
@@ -522,6 +525,7 @@
   }
 
   free(buf);
+  free(idxbuf);
 
   return 1;
 }