From: John Spencer <maillist-kmod@barfooze.de>
To: Lucas De Marchi <lucas.de.marchi@gmail.com>
Cc: John Spencer <maillist-kmod@barfooze.de>,
linux-modules <linux-modules@vger.kernel.org>
Subject: Re: [PATCH 1/3] remove non-portable usage of strndupa
Date: Tue, 27 Aug 2013 11:04:57 +0200 [thread overview]
Message-ID: <521C6BB9.6000900@barfooze.de> (raw)
In-Reply-To: <CAKi4VAK-kVjumah76bOD9iWN+4fU+ekAGaRG67SjMJoTbu0ZFg@mail.gmail.com>
On 08/27/2013 05:35 AM, Lucas De Marchi wrote:
> On Mon, Aug 26, 2013 at 9:16 PM, John Spencer<maillist-kmod@barfooze.de> wrote:
>> On 08/27/2013 01:46 AM, Lucas De Marchi wrote:
>>>
>>> On Mon, Aug 26, 2013 at 3:20 PM, John Spencer<maillist-kmod@barfooze.de>
>>> wrote:
>>>>
>>>> usage of strndupa is neither C99 nor POSIX,
>>>> so musl libc does not implement it.
>>>> it's a glibc invention, and a dangerous one since
>>>> usage of alloca() is considered bad practice.
>>>
>>>
>>> If the input is already sanitized and checked for length, this is
>>> isn't really dangerous. Particularly on recursive functions this also
>>> avoids growing the stack much more than needed.
>>
>>
>> yes, but it is a dangerous function which can and will be misused when it is
>> provided.
>
> If I wanted a language that doesn't allow me to shoot myself on the
> foot, I'd rather be writing pascal, basic or some other new
> <name-your-preferred-script-language>
>
yes, but there's a reason alloca is not in the C standard and gets() got
deprecated.
>>
>>
>>>
>>>>
>>>> fixes build with musl libc.
>>>
>>>
>>> for me it seems more like an excuse to not implement it in musl.
>>> Particularly because there are other places in which we call alloca(),
>>> that you didn't complain. What does musl do there? If musl has
>>> alloca(), doing strndupa in missing.h would be doable.
>>
>>
>> i just fixed strndupa usage in eudev's mkdir_p function a week ago, and that
>> was the first usage of that function i've seen so far in ~500 packages i've
>> ported. the function used by kmod seems to be derived from that one, since
>> the context, name and everything else are nearly identical.
>
> apart from the name, I don't think it's derived
>
>>
>> musl usually doesn't add exotic functions only used by a single package,
>
> if you keep removing it from the packages, you may decrease the number
> of users.... but counting now you just said you have 2. And I can name
> some others, too.
no, i have one, since eudev merged my patch without turning a hair.
they didn't fight around just to keep their single strndupa call in some
legacy systemd derived code.
the others you can name are most likely udev and systemd, which i don't
intend to ever compile, same as pulseaudio and other poettering crapware.
>
>> even moreso when the function in question can compromise security.
>>
>> since kmod is not a red-hat-GNU-linux specific package like systemd (which
>> is even proud of nonportable code), but a linux-specific one, portability at
>> least among available linux libcs should be a concern.
>
> yes, I care. I do care other packages to be high quality too instead
> of just throwing into kmod an insane amount of ifdefs and friends to
> support everything. In the past this worked very well and allowed us
> to move forward faster and link to bionic, dielibc, klibc and musl. I
> appreciate patches adding support to other libc, but they have to be
> reasonable.
>
high quality, high portability, no ifdefs - this is exactly what the
proposed patch here does.
what exactly do you find non-reasonable regarding this patch ?
kmod used to build just fine in the past, you're the one who broke it
last month by throwing the mkdir_p code into the source tree.
and the function has seen quite some refactoring already, using strdupa,
then strndupa. who guarantees me that if i add strndupa (assuming rich
would accept and merge my patch) to musl, you won't change your code
back to use strdupa in the next release ?
>
>>
>>
>>>
>>>>
>>>> Signed-off-by: John Spencer<maillist-kmod@barfooze.de>
>>>>
>>>> ---
>>>> libkmod/libkmod-util.c | 8 ++++++--
>>>> 1 files changed, 6 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c
>>>> index d686250..9615d0f 100644
>>>> --- a/libkmod/libkmod-util.c
>>>> +++ b/libkmod/libkmod-util.c
>>>> @@ -28,6 +28,7 @@
>>>> #include<unistd.h>
>>>> #include<errno.h>
>>>> #include<string.h>
>>>> +#include<limits.h>
>>>> #include<ctype.h>
>>>>
>>>> #include "libkmod.h"
>>>> @@ -323,8 +324,11 @@ static inline int is_dir(const char *path)
>>>> int mkdir_p(const char *path, int len, mode_t mode)
>>>> {
>>>> char *start, *end;
>>>> -
>>>> - start = strndupa(path, len);
>>>> + char buf[PATH_MAX+1];
>>>> + snprintf(buf, sizeof buf, "%s", path);
>>>
>>>
>>> snprintf to dup a string? You already know the len. memcpy would be way
>>> simpler
>>
>>
>> this is to cover the potential case where len> strlen(path).
>> there's no documentation indicating this case cannot happen.
>
> there are only 2 callers of this function. Copying the entire string
> here is actually the wrong thing to do.
>
> Back to the subject, musl does provide alloca(), which is the
> "dangerous" function according to you. If you or musl devs don't want
> to provide strndupa(), the patch to be accepted in kmod is the one
> that checks if strndupa() is available and add it to missing.h
> otherwise. Why missing.h? To remember me to check it some time in
> future to see if I can already remove some stuff.
actually i didn't even ask yet if we can ask strndupa, because it was
first encountered a week back in said eudev code, and my patch got
immediately merged.
when i see non-portable code, i fix the nonportable code, not libc, and
send a patch to upstream in the hope that it gets merged. if they don't
merge it, ok - yet another fork caused by maintainer stubborness.
how do you like "kemod" as a name for the fork ?
yes, alloca() was added as it is widely used - you can't even build gcc
without it. the same can't be said about strndupa which is only used in
one mkdir code snippet copy-pasted from udev into a handful of projects.
besides, afaik strndupa can't even be implemented as a function, since
it would return a pointer to automatic storage that's already out of
scope (at least not without using asm).
that said, i am not sending you a macro replacement for a missing
strndupa and doing a full stop now. if you care about the musl userbase,
merge this patch, otherwise ignore it and live with a fork.
>
>
> Lucas De Marchi
>
P.S. i don't even use kmod myself (contrary to what poettering's twin
sievers believes), i ported this quickly for usage in dragora linux
which is just switching from glibc to musl and the maintainer asked for
help.
there will soon be a musl-based gentoo as well btw, and next version of
alpine will be musl based as well.
next prev parent reply other threads:[~2013-08-27 9:04 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-26 18:20 [PATCH 1/3] remove non-portable usage of strndupa John Spencer
2013-08-26 18:20 ` [PATCH 2/3] check if __GLIBC__ is defined before using _FILE_OFFSET_BITS John Spencer
2013-08-26 23:18 ` Lucas De Marchi
2013-08-26 23:52 ` John Spencer
2013-08-26 18:20 ` [PATCH 3/3] testsuite: fix usage of reserved names John Spencer
2013-08-26 23:07 ` Lucas De Marchi
2013-08-26 23:38 ` [PATCH 3/3 v2] " John Spencer
2013-08-26 23:49 ` [PATCH 3/3] " John Spencer
2013-08-29 4:23 ` Lucas De Marchi
2013-08-26 20:42 ` [PATCH 1/3] remove non-portable usage of strndupa Kay Sievers
2013-08-26 23:46 ` Lucas De Marchi
2013-08-27 0:16 ` John Spencer
2013-08-27 0:58 ` Kay Sievers
2013-08-27 3:35 ` Lucas De Marchi
2013-08-27 9:04 ` John Spencer [this message]
2013-08-29 3:49 ` Lucas De Marchi
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=521C6BB9.6000900@barfooze.de \
--to=maillist-kmod@barfooze.de \
--cc=linux-modules@vger.kernel.org \
--cc=lucas.de.marchi@gmail.com \
/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).