diff -up octave-3.8.2/libinterp/dldfcn/amd.cc.suitesparse octave-3.8.2/libinterp/dldfcn/amd.cc
--- octave-3.8.2/libinterp/dldfcn/amd.cc.suitesparse	2014-08-06 11:57:55.000000000 -0600
+++ octave-3.8.2/libinterp/dldfcn/amd.cc	2014-09-12 15:53:32.819832086 -0600
@@ -164,11 +164,11 @@ The author of the code itself is Timothy
 
               // FIXME: how can we manage the memory allocation of amd
               //        in a cleaner manner?
-              amd_malloc = malloc;
-              amd_free = free;
-              amd_calloc = calloc;
-              amd_realloc = realloc;
-              amd_printf = printf;
+              suitesparse_assign_function(malloc_func, amd_malloc, malloc);
+              suitesparse_assign_function(free_func, amd_free, free);
+              suitesparse_assign_function(calloc_func, amd_calloc, calloc);
+              suitesparse_assign_function(realloc_func, amd_realloc, realloc);
+              suitesparse_assign_function(printf_func, amd_printf, printf);
 
               octave_idx_type result = AMD_NAME (_order) (n_col, cidx, ridx, P,
                                                           Control, Info);
diff -up octave-3.8.2/libinterp/dldfcn/symbfact.cc.suitesparse octave-3.8.2/libinterp/dldfcn/symbfact.cc
--- octave-3.8.2/libinterp/dldfcn/symbfact.cc.suitesparse	2014-08-06 11:54:15.000000000 -0600
+++ octave-3.8.2/libinterp/dldfcn/symbfact.cc	2014-09-12 15:53:32.821832075 -0600
@@ -114,17 +114,17 @@ factorization as determined by @var{typ}
   if (spu == 0.)
     {
       cm->print = -1;
-      cm->print_function = 0;
+      suitesparse_assign_function(printf_func, cm->print_function, 0);
     }
   else
     {
       cm->print = static_cast<int> (spu) + 2;
-      cm->print_function =&SparseCholPrint;
+      suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
     }
 
   cm->error_handler = &SparseCholError;
-  cm->complex_divide = CHOLMOD_NAME(divcomplex);
-  cm->hypotenuse = CHOLMOD_NAME(hypot);
+  suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+  suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
   double dummy;
   cholmod_sparse Astore;
diff -up octave-3.8.2/liboctave/array/CSparse.cc.suitesparse octave-3.8.2/liboctave/array/CSparse.cc
--- octave-3.8.2/liboctave/array/CSparse.cc.suitesparse	2014-08-06 11:57:55.000000000 -0600
+++ octave-3.8.2/liboctave/array/CSparse.cc	2014-09-12 15:53:33.791827033 -0600
@@ -5664,17 +5664,17 @@ SparseComplexMatrix::fsolve (MatrixType
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
@@ -5907,17 +5907,17 @@ SparseComplexMatrix::fsolve (MatrixType
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
@@ -6198,17 +6198,17 @@ SparseComplexMatrix::fsolve (MatrixType
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
@@ -6420,17 +6420,17 @@ SparseComplexMatrix::fsolve (MatrixType
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
diff -up octave-3.8.2/liboctave/array/dSparse.cc.suitesparse octave-3.8.2/liboctave/array/dSparse.cc
--- octave-3.8.2/liboctave/array/dSparse.cc.suitesparse	2014-08-06 11:57:55.000000000 -0600
+++ octave-3.8.2/liboctave/array/dSparse.cc	2014-09-12 15:53:33.756827215 -0600
@@ -5866,17 +5866,17 @@ SparseMatrix::fsolve (MatrixType &mattyp
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
@@ -6083,17 +6083,17 @@ SparseMatrix::fsolve (MatrixType &mattyp
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
@@ -6345,17 +6345,17 @@ SparseMatrix::fsolve (MatrixType &mattyp
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
@@ -6579,17 +6579,17 @@ SparseMatrix::fsolve (MatrixType &mattyp
           if (spu == 0.)
             {
               cm->print = -1;
-              cm->print_function = 0;
+              suitesparse_assign_function(printf_func, cm->print_function, 0);
             }
           else
             {
               cm->print = static_cast<int> (spu) + 2;
-              cm->print_function =&SparseCholPrint;
+              suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
             }
 
           cm->error_handler = &SparseCholError;
-          cm->complex_divide = CHOLMOD_NAME(divcomplex);
-          cm->hypotenuse = CHOLMOD_NAME(hypot);
+          suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+          suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
           cm->final_ll = true;
 
diff -up octave-3.8.2/liboctave/numeric/sparse-base-chol.cc.suitesparse octave-3.8.2/liboctave/numeric/sparse-base-chol.cc
--- octave-3.8.2/liboctave/numeric/sparse-base-chol.cc.suitesparse	2014-08-06 11:54:14.000000000 -0600
+++ octave-3.8.2/liboctave/numeric/sparse-base-chol.cc	2014-09-12 15:53:33.521828437 -0600
@@ -105,17 +105,17 @@ sparse_base_chol<chol_type, chol_elt, p_
   if (spu == 0.)
     {
       cm->print = -1;
-      cm->print_function = 0;
+      suitesparse_assign_function(printf_func, cm->print_function, 0);
     }
   else
     {
       cm->print = static_cast<int> (spu) + 2;
-      cm->print_function =&SparseCholPrint;
+      suitesparse_assign_function(printf_func, cm->print_function, &SparseCholPrint);
     }
 
   cm->error_handler = &SparseCholError;
-  cm->complex_divide = CHOLMOD_NAME(divcomplex);
-  cm->hypotenuse = CHOLMOD_NAME(hypot);
+  suitesparse_assign_function(divcomplex_func, cm->complex_divide, CHOLMOD_NAME(divcomplex));
+  suitesparse_assign_function(hypot_func, cm->hypotenuse, CHOLMOD_NAME(hypot));
 
   cm->final_asis = false;
   cm->final_super = false;
diff -up octave-3.8.2/liboctave/util/oct-sparse.h.suitesparse octave-3.8.2/liboctave/util/oct-sparse.h
--- octave-3.8.2/liboctave/util/oct-sparse.h.suitesparse	2014-08-06 11:54:15.000000000 -0600
+++ octave-3.8.2/liboctave/util/oct-sparse.h	2014-09-15 12:14:12.663644773 -0600
@@ -23,6 +23,8 @@ along with Octave; see the file COPYING.
 #if !defined (octave_oct_sparse_h)
 #define octave_oct_sparse_h 1
 
+#include <math.h>
+
 #if defined (HAVE_SUITESPARSE_AMD_H)
 #include <suitesparse/amd.h>
 #elif defined (HAVE_UFSPARSE_AMD_H)
@@ -94,4 +96,12 @@ along with Octave; see the file COPYING.
 #endif
 #endif
 
+// Cope with new suitesparse versions
+//
+#if defined( SUITESPARSE_VERSION ) && SUITESPARSE_VERSION >= SUITESPARSE_VER_CODE(4,3)
+#define suitesparse_assign_function(f_name,f_var,f_assign) (SuiteSparse_config.f_name = f_assign)
+#else
+#define suitesparse_assign_function(f_name,f_var,f_assign) (f_var = f_assign)
+#endif
+
 #endif
