9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: erik quanstrom <quanstro@quanstro.net>
To: 9fans@9fans.net
Subject: Re: [9fans] replica bug
Date: Thu,  3 Mar 2011 08:03:40 -0500	[thread overview]
Message-ID: <0101a0ac6a4d1f1aad1781235c1f1a95@ladd.quanstro.net> (raw)
In-Reply-To: <20110303122454.2E85865D3E@server.hemiola.co.uk>

excellent find.  i'd forgotten about this pointy thing.

the problem of course is that the avl library uses the return value directly
as an index into a 3 element array.  this all comes to tears if the compare
function can return something other than {-1, 0, 1}.

On Thu Mar  3 07:26:22 EST 2011, rod@hemiola.co.uk wrote:
> that value directly.  The avl code requires that it's comparison
> function returns -1, 0 or 1.  Strcmp is guaranteed only to return an
> integer whose sign reflects the comparison result.
[...]
>
> PS. Subsequently I wondered if this problem occured elsewhere in the
> system.

i ran into this problem with nupas.  i also fixed the problem in replica
last april.  i tried to submit it, also deleting the private copy of the
avl library.  that wasn't accepted.  though i never saw it, the worry was
that there were some subtle yet important differences.

> memcmp, but also from the difference between the two score types.  As
> it happens "memcmp" is "safe" for both 386 and arm, and I am guessing
> that the latter comparison rarely happens. I also note anyway that the
> avl tree is only created and used if the undocumented -m option is
> specified on the command line.  It seems that the chance of provoking
> the problem here is small...

that function is clearly wrong, and worth fixing.  there's no reason to
leave a land mine around to trip on one day.  if the code is truely never
going to be used, then it should be removed.  otherwise, let's send in
the bomb disposal unit.  here's what i have for both in reverse order.

static int
scoretreecmp(Avl *va, Avl *vb)
{
	ScoreTree *a, *b;
	int i;

	a = (ScoreTree*)va;
	b = (ScoreTree*)vb;

	i = memcmp(a->score, b->score, VtScoreSize);
	if(i == 0)
		i = a->type - b->type;
	if(i > 0)
		i = 1;
	if(i < 0)
		i = -1;
	return i;
}

static int
entrycmp(Avl *a, Avl *b)
{
	int n;
	Entry *ea, *eb;

	ea = (Entry*)a;
	eb = (Entry*)b;

	n = strcmp(ea->name, eb->name);
	if(n > 0)
		n = 1;
	else if(n < 0)
		n = -1;
	return n;
}

- erik



  reply	other threads:[~2011-03-03 13:03 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-03 12:22 rod
2011-03-03 13:03 ` erik quanstrom [this message]
2011-03-03 13:54   ` Russ Cox

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0101a0ac6a4d1f1aad1781235c1f1a95@ladd.quanstro.net \
    --to=quanstro@quanstro.net \
    --cc=9fans@9fans.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).