[PATCH] cygcheck: Fix parsing of file names containing colons
Ken Brown
kbrown@cornell.edu
Wed Oct 25 14:56:00 GMT 2017
On 10/25/2017 10:19 AM, Corinna Vinschen wrote:
> On Oct 25 09:38, Ken Brown wrote:
>> On 10/25/2017 8:19 AM, Corinna Vinschen wrote:
>>> On Oct 25 14:11, Corinna Vinschen wrote:
>>>> Hi Ken,
>>>>
>>>> On Oct 25 07:23, Ken Brown wrote:
>>>>> Up to now the function winsup/utils/dump_setup.cc:base skips past
>>>>> colons when parsing file names. As a result, a line like
>>>>>
>>>>> foo foo-1:2.3-4.tar.bz2 1
>>>>>
>>>>> in /etc/setup/installed.db would cause 'cygcheck -cd foo' to report 4
>>>>> as the installed version of foo insted of 1:2.3-4. This is not an
>>>>> issue now, but it will become an issue when version numbers are
>>>>> allowed to contain epochs.
>>>>> ---
>>>>> winsup/utils/dump_setup.cc | 2 +-
>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/winsup/utils/dump_setup.cc b/winsup/utils/dump_setup.cc
>>>>> index 320d69fab..3922b18f8 100644
>>>>> --- a/winsup/utils/dump_setup.cc
>>>>> +++ b/winsup/utils/dump_setup.cc
>>>>> @@ -56,7 +56,7 @@ base (const char *s)
>>>>> const char *rv = s;
>>>>> while (*s)
>>>>> {
>>>>> - if ((*s == '/' || *s == ':' || *s == '\\') && s[1])
>>>>> + if ((*s == '/' || *s == '\\') && s[1])
>>>>
>>>> I think this is a simplified way to test for the colon in paths like
>>>> C:/foo/bar. Nothing else makes sense in this context.
>>>>
>>>> I'm not sure how much we care, but maybe we shoulkd fix the test to
>>>> ignore the colon only if it's the second character in the incoming
>>>> string?
>>>
>>> Not "ignore", but "use as a delimiter" only as 2nd char in the input.
>>
>> I'm not sure the distinction matters in this case, since the function is
>> just trying to get the base name. Anyway, how's the attached?
>
> Fine, thanks.
>
> But now that you mention it... why does parse_filename() call base() at
> all? The filenames in installed.db are just basenames anyway. Does
> that cover an older DB format we don't support anymore, perhaps?
It looks like parse_filename is more-or-less copied from the function
with the same name in the setup sources (in filemanip.cc). In that case
there might be a good reason to call base; I'll have to look more closely.
> I just wonder now if we should simply remove base() and the call to it.
>
> Either way, you're right, the colon check is just useless, so your first
> patch was entirely sufficient.
>
> What do you think? Stick to your patch or remove base()?
I vote for removing base. The attached patch does this.
Ken
-------------- next part --------------
From f679462937faf263de682c47f8d8e73b0c7e4136 Mon Sep 17 00:00:00 2001
From: Ken Brown <kbrown@cornell.edu>
Date: Tue, 24 Oct 2017 18:21:53 -0400
Subject: [PATCH] winsup/utils/dump_setup.cc: Remove the function 'base'
This was called only on filenames in /etc/setup/installed.db, which
are all basenames anyway. Moreover, base wasn't correctly handling
filenames containing colons.
---
winsup/utils/dump_setup.cc | 17 +----------------
1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/winsup/utils/dump_setup.cc b/winsup/utils/dump_setup.cc
index 320d69fab..4415954f9 100644
--- a/winsup/utils/dump_setup.cc
+++ b/winsup/utils/dump_setup.cc
@@ -48,21 +48,6 @@ find_tar_ext (const char *path)
return 0;
}
-static char *
-base (const char *s)
-{
- if (!s)
- return 0;
- const char *rv = s;
- while (*s)
- {
- if ((*s == '/' || *s == ':' || *s == '\\') && s[1])
- rv = s + 1;
- s++;
- }
- return (char *) rv;
-}
-
/* Parse a filename into package, version, and extension components. */
int
parse_filename (const char *in_fn, fileparse& f)
@@ -79,7 +64,7 @@ parse_filename (const char *in_fn, fileparse& f)
strcpy (f.tail, fn + n);
fn[n] = '\0';
f.pkg[0] = f.what[0] = '\0';
- p = base (fn);
+ p = fn;
for (ver = p; *ver; ver++)
if (*ver != '-')
continue;
--
2.14.2
More information about the Cygwin-patches
mailing list