This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
Re: [ECOS] Problem in cyg_io_compare?
- From: davidw at dedasys dot com (David N. Welton)
- To: "Gary D. Thomas" <gary dot thomas at mind dot be>
- Cc: <ecos-patches at sources dot redhat dot com>
- Date: 28 Jul 2003 15:39:51 +0200
- Subject: Re: [ECOS] Problem in cyg_io_compare?
- References: <871xwapzos.fsf@dedasys.com> <1059398484.10050.5.camel@hermes>
"Gary D. Thomas" <gary.thomas@mind.be> writes:
> On Mon, 2003-07-28 at 07:07, David N. Welton wrote:
> > Does this patch look out of place?
> Actually, it would be preferable to discuss such things on
> ecos-patches or ecos-devel.
Oh, sorry. Switching to that, but please CC replies to me, because
I'm not subscribed. Patched code in question included at the end of
the email for anyone not on -discuss.
> > Without it, setting *ptr to n1 is just going to leave *ptr hanging
> > off the end of the 'real' n1, according to my reading of the code.
> > This fix seems to make things work for me (i.e. the name parameter
> > to my device's lookup function actually contains something valid).
> It's not clear why you think there is an error here. The code looks
> right to me and the only time that *ptr could point off the end of
> the string would be if n1 pointed to a string which matched 100% n2.
Maybe I am using eCos incorrectly then, because that's what happens:
I have:
BLOCK_DEVTAB_ENTRY(cyg_io_floppydev,
"/dev/fd",
NULL, /* Not dependant on other devices. */
&cyg_io_floppy_ops,
floppy_init,
floppy_open,
(void *)NULL); /* No private information. */
and then:
if (cyg_io_lookup("/dev/fd", &fh) != ENOERR) {
Maybe that's not the best way to do things?
If the two strings are equal, cyg_io_compare returns true, but the
'name' pointer in my lookup function is garbage because *ptr is set
off the end of n1 in the compare function. This patch fixes that by
storing the original location of 'n1' to later put in '*ptr'.
I think that in any case, returning a bogus address should be avoided
in one way or another.
Thanks for your time,
--
David N. Welton
Consulting: http://www.dedasys.com/
Personal: http://www.dedasys.com/davidw/
Free Software: http://www.dedasys.com/freesoftware/
Apache Tcl: http://tcl.apache.org/
static bool
cyg_io_compare(const char *n1, const char *n2, const char **ptr)
{
char *tmp;
tmp = n1;
while (*tmp && *n2) {
if (*(tmp++) != *(n2++)) {
return false;
}
}
if (*tmp) {
// See if the devtab name is is a substring
if (*(n2 - 1) == '/') {
*ptr = n1;
return true;
}
}
if (*tmp || *n2) {
return false;
}
*ptr = n1;
return true;
}