Skip to content

Commit

Permalink
Fix userquota_compare() function
Browse files Browse the repository at this point in the history
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
  • Loading branch information
behlendorf authored Oct 21, 2016
1 parent 9523b15 commit e4ffa98
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion module/zfs/dmu_objset.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e4ffa98

Please sign in to comment.