summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2016-10-21 08:23:27 -0700
committerGitHub <[email protected]>2016-10-21 08:23:27 -0700
commite4ffa98dcaf2208c742609f0ab2bdb343071446a (patch)
tree8b60321630f98db86dac20ad4e66a24372fcd409
parent9523b15ac1881946a7a6b7a145c8e2bb622dc56c (diff)
Fix userquota_compare() function
The AVL tree compare function requires that either -1, 0, or 1 be returned. However the strcmp() function only guarantees that a negative, zero, or positive value is returned. Therefore, the return value of strcmp() needs to be sanitized with AVL_ISIGN. This was initially overlooked because the x86_64 implementation of strcmp() happens to only returns the allowed values. This was observed on an aarch64 platform which behaves correctly but differently as described above. Reviewed-by: Jinshan Xiong <[email protected]> Reviewed-by: Richard Laager <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #5311 Closes #5313
-rw-r--r--module/zfs/dmu_objset.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/module/zfs/dmu_objset.c b/module/zfs/dmu_objset.c
index cce3e732c..ac60008a3 100644
--- a/module/zfs/dmu_objset.c
+++ b/module/zfs/dmu_objset.c
@@ -1355,12 +1355,15 @@ userquota_compare(const void *l, const void *r)
{
const userquota_node_t *luqn = l;
const userquota_node_t *ruqn = r;
+ int rv;
/*
* NB: can only access uqn_id because userquota_update_cache() doesn't
* pass in an entire userquota_node_t.
*/
- return (strcmp(luqn->uqn_id, ruqn->uqn_id));
+ rv = strcmp(luqn->uqn_id, ruqn->uqn_id);
+
+ return (AVL_ISIGN(rv));
}
static void