1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- From 8f600f2df293d539e9e9137f6f82faa1633b97c1 Mon Sep 17 00:00:00 2001
- From: Paul Eggert <eggert@cs.ucla.edu>
- Date: Sat, 17 Dec 2022 20:56:29 -0800
- Subject: [PATCH] sed: fix symlink bufsize readlink check
- Problem reported by Hauke Mehrtens.
- * sed/utils.c (follow_symlink): Fix typo when checking size of
- second and later symlink, when that symlink is so large that it
- does not fit into the buffer. Although the bug is not a buffer
- overflow, it does cause sed to mishandle the symlink.
- * testsuite/follow-symlinks.sh: Test for the bug.
- ---
- sed/utils.c | 2 +-
- testsuite/follow-symlinks.sh | 13 +++++++++++++
- 3 files changed, 18 insertions(+), 1 deletion(-)
- --- a/sed/utils.c
- +++ b/sed/utils.c
- @@ -345,7 +345,7 @@ follow_symlink (const char *fname)
- while ((linklen = (buf_used < buf_size
- ? readlink (fn, buf + buf_used, buf_size - buf_used)
- : 0))
- - == buf_size)
- + == buf_size - buf_used)
- {
- buf = xpalloc (buf, &buf_size, 1, SSIZE_IDX_MAX, 1);
- if (num_links)
- --- a/testsuite/follow-symlinks.sh
- +++ b/testsuite/follow-symlinks.sh
- @@ -73,4 +73,17 @@ compare_ exp-la-abs out-la-abs || fail=1
- ln -s la-loop la-loop || framework_failure_
- sed --follow-symlinks -i s/a/b/ la-loop && fail=1
-
- +# symlink of length 128
- +long=d/
- +for i in 2 3 4 5 6 7; do
- + long=$long$long
- +done
- +dir=${long%/d/}
- +file=$dir/xx
- +mkdir -p $dir &&
- +echo x >$file &&
- +ln -s $file yy &&
- +ln -s yy xx || framework_failure_
- +sed -i --follow-symlinks s/x/y/ xx || fail=1
- +
- Exit $fail
|