From 6f3c9b1776bc9e9a344a4727dacf1eb42194fecb Mon Sep 17 00:00:00 2001
From: Martin Stjernholm <mast@lysator.liu.se>
Date: Thu, 31 Mar 2011 11:21:46 +0200
Subject: [PATCH] Fixed possible segfault when sorting builtin functions.

This was a regression from 3140378d.
---
 src/array.c      | 11 +++++++++++
 src/testsuite.in |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/array.c b/src/array.c
index 2affea7e85..0bfc1e6ff8 100644
--- a/src/array.c
+++ b/src/array.c
@@ -1020,6 +1020,17 @@ static int obj_or_func_cmp (const struct svalue *a, const struct svalue *b)
     return -1;
 
   if (a->type == T_FUNCTION) {
+    /* Sort pike functions before builtins. */
+    if (a->subtype == FUNCTION_BUILTIN) {
+      if (b->subtype == FUNCTION_BUILTIN)
+	return a->u.efun < b->u.efun ? -1 : (a->u.efun == b->u.efun ? 0 : 1);
+      else
+	return 1;
+    }
+    else
+      if (b->subtype == FUNCTION_BUILTIN)
+	return -1;
+
     if (a->u.object->prog != b->u.object->prog)
       return a->u.object->prog < b->u.object->prog ? -1 : 1;
     if (a->subtype != b->subtype)
diff --git a/src/testsuite.in b/src/testsuite.in
index 5d20b90229..a3aebe8e00 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -11673,6 +11673,14 @@ test_any([[
   return -1;
 ]],-1)
 test_equal(sort (({(<2>), (<1>)})), ({(<1>), (<2>)}))
+test_any_equal([[
+  function pike_fun = lambda() {};
+  function c_fun = sleep;
+  return ({equal (sort (({pike_fun, pike_fun})), ({pike_fun, pike_fun})),
+	   equal (sort (({c_fun, c_fun})), ({c_fun, c_fun})),
+	   equal (sort (({pike_fun, c_fun})), ({pike_fun, c_fun})),
+	   equal (sort (({c_fun, pike_fun})), ({pike_fun, c_fun}))});
+]], [[({1, 1, 1, 1})]])
 
 dnl missing tests for objects, arrays, multisets and mappings
 
-- 
GitLab