All of lore.kernel.org
 help / color / mirror / Atom feed
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.

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.