aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2022-01-13 04:06:16 +0000
committerIngo Schwarze <schwarze@openbsd.org>2022-01-13 04:06:16 +0000
commit3dc8ad3feff99720e0c62785d9b22a2fe637b0fc (patch)
tree33c49c3c70fc287e80269724139aadf308dc5914
parenta038e809aea161a77e12fae7992376d0f29351e1 (diff)
downloadmandoc-3dc8ad3feff99720e0c62785d9b22a2fe637b0fc.tar.gz
mandoc-3dc8ad3feff99720e0c62785d9b22a2fe637b0fc.tar.zst
mandoc-3dc8ad3feff99720e0c62785d9b22a2fe637b0fc.zip
Only sort the result array if it contains more than one element,
making the mansearch() function easier to read for human auditors. No functional change on OpenBSD. As observed by Mark Millard <marklmi at yahoo dot com>, neither the latest version of POSIX 2008 nor C11 defines what qsort(3) should do for base == NULL && nmemb == 0. My impression is it is indeed undefined behaviour because the standards say that base shall point to an array, NULL does not point to an array, and while there is special wording saying that compar() shall not be called if nmemb == 0, i fail to see any similar wording stating that base shall not be accessed if nmemb == 0. Consequently, this patch is also likely to improve standard conformance and portability. Minor issue found by Stefan Esser <se at FreeBSD> with UBSAN. He sent a patch to bugs@, but my patch differs in a minor way.
-rw-r--r--mansearch.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/mansearch.c b/mansearch.c
index 59a35771..1fa652b9 100644
--- a/mansearch.c
+++ b/mansearch.c
@@ -1,4 +1,4 @@
-/* $Id: mansearch.c,v 1.82 2019/07/01 22:56:24 schwarze Exp $ */
+/* $Id: mansearch.c,v 1.83 2022/01/13 04:06:16 schwarze Exp $ */
/*
* Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -220,7 +220,7 @@ mansearch(const struct mansearch *search,
if (cur && search->firstmatch)
break;
}
- if (res != NULL)
+ if (res != NULL && cur > 1)
qsort(*res, cur, sizeof(struct manpage), manpage_compare);
if (chdir_status && getcwd_status && chdir(buf) == -1)
warn("%s", buf);