diff options
author | Brian Behlendorf <[email protected]> | 2016-10-21 08:23:27 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2016-10-21 08:23:27 -0700 |
commit | e4ffa98dcaf2208c742609f0ab2bdb343071446a (patch) | |
tree | 8b60321630f98db86dac20ad4e66a24372fcd409 | |
parent | 9523b15ac1881946a7a6b7a145c8e2bb622dc56c (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.c | 5 |
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 |