From: Ingo Molnar <mingo@kernel.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Chris Metcalf <cmetcalf@ezchip.com>,
open list <linux-kernel@vger.kernel.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>, Borislav Petkov <bp@alien8.de>
Subject: Re: [PATCH] string: Improve the generic strlcpy() implementation
Date: Thu, 8 Oct 2015 10:48:37 +0200 [thread overview]
Message-ID: <20151008084837.GA4729@gmail.com> (raw)
In-Reply-To: <CA+55aFx6mSs_7qcove4cnbptRsYWa5De8pM2mD8S-=RGuWQN1A@mail.gmail.com>
* Linus Torvalds <torvalds@linux-foundation.org> wrote:
> So I really refuse to worry about the snprintf() family of functions wrt this
> race. I don't think it was hugely important for strlcpy() either - more of a
> "quality of implementation" issue rather than anything fundamental - but for
> snprintf and friends it's an almost unavoidable issue because of how snprintf
> works.
>
> Saying that 'strlcpy()' and 'snprintf("%s")' are equivalent is true only in the
> loosest sense. Yes, they return the same return value. Yes, the result string
> should be the same. But the two are completely different despite that.
>
> snprintf() has to handle all the *other* cases than just "%s", including
> right-justification, string precision handling, etc etc. It is effectively
> impossible to do without doing "strlen()" on the source of the string
> beforehand. As a result, snprintf() is fundamentally always going to be racy wrt
> the string changing during the call.
>
> So the simple end result is that we shouldn't worry about it, and if you are
> doing snprintf() on a changing string, you should just be aware of it. We *do*
> actually do that, for things like "current->comm" that really can change while
> being printed out. We just don't care deeply, and have in fact been removing
> locks in this area, because the end result is still guaranteed to be
> NUL-terminated etc.
>
> Can we get odd truncated printouts in the (very very very unlikely) case that
> the string is being changed? Yes. We just don't care.
I do agree mostly, but I think we should still try to achieve the following two
properties, if possible sanely+cheaply+cleanly:
- the printed string should not contain spurious \0 bytes even if the %s source
'races'. [I think this is true currently.]
- the return code should correctly represent what snprintf did to the target
string. [This might not be the case currently. But I'm not sure!]
Because that's a real concern I think: snprintf() return is used frequently to
iterate over buffers, and it should correctly and reliably represent what it did,
regardless of what the source buffer does - because snprintf obviously knows what
it did to the output buffer, it has full, race-free control over it.
Whether left-alignment and other formatting details were calculated correctly,
etc. is a secondary concern and cannot be guaranteed, but we should at least
guarantee that we generated a single string, that we did nothing else, and that we
correctly returned its length.
Agreed?
Thanks,
Ingo
next prev parent reply other threads:[~2015-10-08 8:48 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-10 19:43 [GIT PULL] strscpy string copy function Chris Metcalf
2015-10-04 15:55 ` Linus Torvalds
2015-10-05 11:27 ` [PATCH] string: Improve the generic strlcpy() implementation Ingo Molnar
2015-10-05 11:53 ` Ingo Molnar
2015-10-05 13:15 ` Ingo Molnar
2015-10-05 14:04 ` Ingo Molnar
[not found] ` <CA+55aFx2McOeEiB7fJ-BV=vBsH=i2cC-qW8_EBEnScfQhugD_w@mail.gmail.com>
2015-10-05 14:07 ` Ingo Molnar
2015-10-05 14:33 ` Ingo Molnar
2015-10-05 15:32 ` Linus Torvalds
2015-10-05 16:03 ` Ingo Molnar
2015-10-05 12:28 ` Linus Torvalds
2015-10-05 13:10 ` Ingo Molnar
2015-10-05 22:28 ` Rasmus Villemoes
2015-10-06 7:54 ` Ingo Molnar
2015-10-06 8:03 ` Ingo Molnar
2015-10-06 22:00 ` Rasmus Villemoes
2015-10-07 7:18 ` Ingo Molnar
2015-10-07 9:04 ` Rasmus Villemoes
2015-10-07 9:22 ` Linus Torvalds
2015-10-08 8:48 ` Ingo Molnar [this message]
2015-10-09 8:10 ` Rasmus Villemoes
2015-10-09 9:10 ` [RFC 0/3] eliminate potential race in string() (was: [PATCH] string: Improve the generic strlcpy() implementation) Rasmus Villemoes
2015-10-09 9:14 ` [RFC 1/3] lib/vsprintf.c: pull out padding code from dentry_name() Rasmus Villemoes
2015-10-09 9:14 ` [RFC 2/3] lib/vsprintf.c: move string() below widen_string() Rasmus Villemoes
2015-10-09 9:14 ` [RFC 3/3] lib/vsprintf.c: eliminate potential race in string() Rasmus Villemoes
2015-10-10 7:47 ` [RFC 0/3] eliminate potential race in string() (was: [PATCH] string: Improve the generic strlcpy() implementation) Ingo Molnar
2015-10-19 12:42 ` [PATCH] string: Improve the generic strlcpy() implementation Rasmus Villemoes
2015-10-19 16:24 ` Chris Metcalf
-- strict thread matches above, loose matches on Subject: below --
2015-10-05 15:38 Alexey Dobriyan
2015-10-05 16:11 ` Ingo Molnar
2015-10-05 16:13 ` Ingo Molnar
[not found] ` <CA+55aFyTVJfCt00gYJpiQW5kqPaRGJ93JmfRRni-73zCf5ivqg@mail.gmail.com>
2015-10-05 16:22 ` Ingo Molnar
2015-10-05 16:28 ` Ingo Molnar
2015-10-05 20:40 ` Linus Torvalds
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=20151008084837.GA4729@gmail.com \
--to=mingo@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=bp@alien8.de \
--cc=cmetcalf@ezchip.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/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.