Merge branch 'strscpy' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 4 Oct 2015 15:31:13 +0000 (16:31 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 4 Oct 2015 15:31:13 +0000 (16:31 +0100)
Pull strscpy string copy function implementation from Chris Metcalf.

Chris sent this during the merge window, but I waffled back and forth on
the pull request, which is why it's going in only now.

The new "strscpy()" function is definitely easier to use and more secure
than either strncpy() or strlcpy(), both of which are horrible nasty
interfaces that have serious and irredeemable problems.

strncpy() has a useless return value, and doesn't NUL-terminate an
overlong result.  To make matters worse, it pads a short result with
zeroes, which is a performance disaster if you have big buffers.

strlcpy(), by contrast, is a mis-designed "fix" for strlcpy(), lacking
the insane NUL padding, but having a differently broken return value
which returns the original length of the source string.  Which means
that it will read characters past the count from the source buffer, and
you have to trust the source to be properly terminated.  It also makes
error handling fragile, since the test for overflow is unnecessarily
subtle.

strscpy() avoids both these problems, guaranteeing the NUL termination
(but not excessive padding) if the destination size wasn't zero, and
making the overflow condition very obvious by returning -E2BIG.  It also
doesn't read past the size of the source, and can thus be used for
untrusted source data too.

So why did I waffle about this for so long?

Every time we introduce a new-and-improved interface, people start doing
these interminable series of trivial conversion patches.

And every time that happens, somebody does some silly mistake, and the
conversion patch to the improved interface actually makes things worse.
Because the patch is mindnumbing and trivial, nobody has the attention
span to look at it carefully, and it's usually done over large swatches
of source code which means that not every conversion gets tested.

So I'm pulling the strscpy() support because it *is* a better interface.
But I will refuse to pull mindless conversion patches.  Use this in
places where it makes sense, but don't do trivial patches to fix things
that aren't actually known to be broken.

* 'strscpy' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile:
  tile: use global strscpy() rather than private copy
  string: provide strscpy()
  Make asm/word-at-a-time.h available on all architectures

21 files changed:
1  2 
arch/arc/include/asm/Kbuild
arch/avr32/include/asm/Kbuild
arch/blackfin/include/asm/Kbuild
arch/c6x/include/asm/Kbuild
arch/cris/include/asm/Kbuild
arch/frv/include/asm/Kbuild
arch/hexagon/include/asm/Kbuild
arch/ia64/include/asm/Kbuild
arch/m32r/include/asm/Kbuild
arch/metag/include/asm/Kbuild
arch/microblaze/include/asm/Kbuild
arch/mips/include/asm/Kbuild
arch/mn10300/include/asm/Kbuild
arch/nios2/include/asm/Kbuild
arch/powerpc/include/asm/Kbuild
arch/s390/include/asm/Kbuild
arch/score/include/asm/Kbuild
arch/tile/include/asm/Kbuild
arch/um/include/asm/Kbuild
arch/unicore32/include/asm/Kbuild
arch/xtensa/include/asm/Kbuild

index 7611b10a2d238c7b4bb73696b59e2fe8b14ceb2c,c8f07ce1c757be14ac45bd7483bc2ec6a570f504..0b10ef2a43726e0188b61de96bd5a5bf1ba50067
@@@ -22,7 -22,6 +22,7 @@@ generic-y += kvm_para.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mman.h
  generic-y += msgbuf.h
  generic-y += param.h
@@@ -48,4 -47,5 +48,5 @@@ generic-y += types.
  generic-y += ucontext.h
  generic-y += user.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index f61f2dd67464746c728474a7b5503dd7dfbdcb67,519810d0d5e1b779290191bc35e70be7133e723e..241b9b9729d821510fb2addde4b276e73e6185a7
@@@ -12,7 -12,6 +12,7 @@@ generic-y += irq_work.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += param.h
  generic-y += percpu.h
  generic-y += preempt.h
@@@ -20,4 -19,5 +20,5 @@@ generic-y += sections.
  generic-y += topology.h
  generic-y += trace_clock.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 61cd1e786a142c440caa231a665349ed3d8f8e01,c80181e4454fc68ab35640287cd1cfa73d7f8298..91d49c0a31185041055e627689ec09b2ab708bd1
@@@ -21,7 -21,6 +21,7 @@@ generic-y += kvm_para.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mman.h
  generic-y += msgbuf.h
  generic-y += mutex.h
@@@ -46,4 -45,5 +46,5 @@@ generic-y += types.
  generic-y += ucontext.h
  generic-y += unaligned.h
  generic-y += user.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index f17c4dc6050c7d23ade635f749aa75eed8f0ac1d,2f697020a8fd8d00044076ef30547685e76dcdfd..945544ec603ee12408928c0abd4db19cfbc784d9
@@@ -26,7 -26,6 +26,7 @@@ generic-y += kdebug.
  generic-y += kmap_types.h
  generic-y += local.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mman.h
  generic-y += mmu.h
  generic-y += mmu_context.h
@@@ -59,4 -58,5 +59,5 @@@ generic-y += types.
  generic-y += ucontext.h
  generic-y += user.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index b7f68192d15b52cb4e6c34c78eac88a02fa971d5,09916c8073ac1b0627050441de49965dddd3c599..1778805f63809d378a5cafb6c920b517ea753c7b
@@@ -1,20 -1,14 +1,20 @@@
  generic-y += atomic.h
 +generic-y += auxvec.h
  generic-y += barrier.h
 +generic-y += bitsperlong.h
  generic-y += clkdev.h
  generic-y += cmpxchg.h
  generic-y += cputime.h
  generic-y += device.h
  generic-y += div64.h
 +generic-y += errno.h
  generic-y += exec.h
  generic-y += emergency-restart.h
 +generic-y += fcntl.h
  generic-y += futex.h
  generic-y += hardirq.h
 +generic-y += ioctl.h
 +generic-y += ipcbuf.h
  generic-y += irq_regs.h
  generic-y += irq_work.h
  generic-y += kdebug.h
@@@ -24,23 -18,12 +24,24 @@@ generic-y += linkage.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
 +generic-y += mman.h
  generic-y += module.h
 +generic-y += msgbuf.h
  generic-y += percpu.h
 +generic-y += poll.h
  generic-y += preempt.h
 +generic-y += resource.h
  generic-y += sections.h
 +generic-y += sembuf.h
 +generic-y += shmbuf.h
 +generic-y += siginfo.h
 +generic-y += socket.h
 +generic-y += sockios.h
 +generic-y += statfs.h
  generic-y += topology.h
  generic-y += trace_clock.h
 +generic-y += types.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 8e47b832cc7684af7a10d2a0680651cf5bf8cc0d,2c987dc05af4935fb25ac0d849e3d356d9c8f1e2..1fa084cf1a4398934889658b8b21f66154bf0ab6
@@@ -4,6 -4,6 +4,7 @@@ generic-y += cputime.
  generic-y += exec.h
  generic-y += irq_work.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += preempt.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
index daee37bd09991a3edf732451587e59a8db001d54,0988816dded04d0d586fd7f706f18fa5ec8acfae..db8ddabc6bd2819ba579c4c407a569e2232daa51
@@@ -28,7 -28,6 +28,7 @@@ generic-y += kmap_types.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mman.h
  generic-y += msgbuf.h
  generic-y += pci.h
@@@ -58,4 -57,5 +58,5 @@@ generic-y += types.
  generic-y += ucontext.h
  generic-y += unaligned.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 9de3ba12f6b97c0f8722e2f929c70fbae429fd34,dc05773e1f1128802d3a5e58ece01f0ce7f57c83..502a91d8dbbd80df039d9a111de04c1caadf0e3c
@@@ -4,7 -4,7 +4,8 @@@ generic-y += exec.
  generic-y += irq_work.h
  generic-y += kvm_para.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += preempt.h
  generic-y += trace_clock.h
  generic-y += vtime.h
+ generic-y += word-at-a-time.h
index e0eb704ca1fa93755d678e82c2336c8e188a34f0,219e54b3368515f1f60f62765834a44ed19ab7ae..fd104bd221ced1dff2c9485bdcb1be520171df7f
@@@ -4,8 -4,8 +4,9 @@@ generic-y += cputime.
  generic-y += exec.h
  generic-y += irq_work.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += module.h
  generic-y += preempt.h
  generic-y += sections.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
index df31353fd2001dc0e357feafcf975aa6e5537622,611c0df2be39c5453cf8a44ac3bf3be81f9a1dcd..29acb89daaaa55f2b1640c3d751233ed034b43b7
@@@ -25,7 -25,6 +25,7 @@@ generic-y += kvm_para.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += msgbuf.h
  generic-y += mutex.h
  generic-y += param.h
@@@ -54,4 -53,5 +54,5 @@@ generic-y += ucontext.
  generic-y += unaligned.h
  generic-y += user.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 2f222f355c4bbc69842ccd62f3419b0cbd1732a4,cefeabae24ccfdd62be07f940cff1c8c911275d4..b0ae88c9fed922a4ba95be0498f421d3927eb40e
@@@ -6,7 -6,7 +6,8 @@@ generic-y += device.
  generic-y += exec.h
  generic-y += irq_work.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += preempt.h
  generic-y += syscalls.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
index 40ec4ca3f946a9238afa6e0edd25c0440f86a36b,dee810fa973e2df250414e172f7fd87ebce46651..c7fe4d01e79c61bbaee58aa25b9b50bf5b9a380e
@@@ -7,7 -7,6 +7,7 @@@ generic-y += emergency-restart.
  generic-y += irq_work.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mutex.h
  generic-y += parport.h
  generic-y += percpu.h
@@@ -16,5 -15,7 +16,6 @@@ generic-y += sections.
  generic-y += segment.h
  generic-y += serial.h
  generic-y += trace_clock.h
 -generic-y += ucontext.h
  generic-y += user.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 6edb9ee6128ebc4d45de622afdf118f0bf5d12ee,27cbc0267b9c183ee66ab1cf6e68305afa4a7581..1c8dd0f5cd5d1567126f42b67112b5b0f91962a8
@@@ -5,7 -5,7 +5,8 @@@ generic-y += cputime.
  generic-y += exec.h
  generic-y += irq_work.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += preempt.h
  generic-y += sections.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
index 914864eb5a25daf87688f1565b33700b289be0bf,e22478929719115397efca5600af7e95e458b6a6..d63330e88379dcc591e29e645b5363f063122f9d
@@@ -30,7 -30,6 +30,7 @@@ generic-y += kmap_types.
  generic-y += kvm_para.h
  generic-y += local.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mman.h
  generic-y += module.h
  generic-y += msgbuf.h
@@@ -61,4 -60,5 +61,5 @@@ generic-y += types.
  generic-y += unaligned.h
  generic-y += user.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index ab9f4e0ed4cfcfd48a8d232fe20d0482739a22c5,d9c0b44191b0ffd3831c4e32ab9394b70a1420ff..ac1662956e0c4d4dfe8a0a7fff432e9f2a592f2c
@@@ -6,4 -6,6 +6,5 @@@ generic-y += local64.
  generic-y += mcs_spinlock.h
  generic-y += preempt.h
  generic-y += rwsem.h
 -generic-y += trace_clock.h
  generic-y += vtime.h
+ generic-y += word-at-a-time.h
index 5ad26dd94d77e83fedeba5c7f71c8eba0ff2ab29,9e8089b44f4622b4f971f71da51e1e089f4ea5be..9043d2e1e2ae0b3c01a7b6588bed848f44dd92ff
@@@ -3,6 -3,6 +3,7 @@@
  generic-y += clkdev.h
  generic-y += irq_work.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += preempt.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
index 92ffe397b893c553c8504f10525a5e3d9d1e9e34,ff19975beb33b32581dfdc27b4c648b6807640fb..a05218ff3fe465b6e4812d7655360dc1b495a519
@@@ -7,9 -7,9 +7,10 @@@ generic-y += clkdev.
  generic-y += cputime.h
  generic-y += irq_work.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += preempt.h
  generic-y += sections.h
  generic-y += trace_clock.h
  generic-y += xor.h
  generic-y += serial.h
+ generic-y += word-at-a-time.h
index ba35c41c71fff33b2b2fe95f566ad8b3dc192c32,ea59330b4d904823fae529ccf434ba167197981d..0b6cacaad9333a4165bfd9447a180feadedb4db4
@@@ -19,7 -19,6 +19,7 @@@ generic-y += irq_regs.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += msgbuf.h
  generic-y += mutex.h
  generic-y += param.h
@@@ -28,7 -27,6 +28,7 @@@ generic-y += poll.
  generic-y += posix_types.h
  generic-y += preempt.h
  generic-y += resource.h
 +generic-y += seccomp.h
  generic-y += sembuf.h
  generic-y += serial.h
  generic-y += shmbuf.h
@@@ -40,4 -38,5 +40,5 @@@ generic-y += termbits.
  generic-y += termios.h
  generic-y += trace_clock.h
  generic-y += types.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 149ec55f9c46abd97cbb9b69c7a55afa23e23393,33c1d3e0caad2ac18d06674f8dac1b7562724508..904f3ebf4220153f816a1deca118381190f44ec4
@@@ -16,7 -16,6 +16,7 @@@ generic-y += irq_regs.
  generic-y += irq_work.h
  generic-y += kdebug.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mutex.h
  generic-y += param.h
  generic-y += pci.h
@@@ -25,4 -24,5 +25,5 @@@ generic-y += preempt.
  generic-y += switch_to.h
  generic-y += topology.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 1fc7a286dc6f342319ec06a81b53a087b9708ef9,932070cd754a9063ce1dff4a3158811e86b7901e..256c45b3ae343c983e667b01404d8fb3e3667b4a
@@@ -26,7 -26,6 +26,7 @@@ generic-y += kdebug.
  generic-y += kmap_types.h
  generic-y += local.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += mman.h
  generic-y += module.h
  generic-y += msgbuf.h
@@@ -62,4 -61,5 +62,5 @@@ generic-y += ucontext.
  generic-y += unaligned.h
  generic-y += user.h
  generic-y += vga.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h
index 63c223dff5f1eebed92297d2cd641535a3aeceb9,85acffd262174a009bd4e3e3d129925bb4a9b79a..b56855a1382a374f8c52632b9aa243a1112a1a06
@@@ -2,6 -2,7 +2,6 @@@ generic-y += bitsperlong.
  generic-y += bug.h
  generic-y += clkdev.h
  generic-y += cputime.h
 -generic-y += device.h
  generic-y += div64.h
  generic-y += emergency-restart.h
  generic-y += errno.h
@@@ -18,7 -19,6 +18,7 @@@ generic-y += linkage.
  generic-y += local.h
  generic-y += local64.h
  generic-y += mcs_spinlock.h
 +generic-y += mm-arch-hooks.h
  generic-y += percpu.h
  generic-y += preempt.h
  generic-y += resource.h
@@@ -28,4 -28,5 +28,5 @@@ generic-y += statfs.
  generic-y += termios.h
  generic-y += topology.h
  generic-y += trace_clock.h
+ generic-y += word-at-a-time.h
  generic-y += xor.h