summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2007-07-24 09:40:55 +0200
committerJim Meyering <jim@meyering.net>2007-07-24 09:40:55 +0200
commit9d8e077ca1f4402b608d1464794e390bc7fc5b81 (patch)
treeb0bfea4d086fd464fd1e0c2841230c4e554e7ca5
parent71aa3ea88084d17bcb4fc1031ad7b66f8647115e (diff)
downloadcoreutils-9d8e077ca1f4402b608d1464794e390bc7fc5b81.tar.xz
sort: avoid unaligned access.
* src/sort.c (fillbuf): When enlarging the line buffer, ensure that the new size is a multiple of "sizeof (struct line)". This avoids alignment problems when indexing from the end of the buffer. Problem reported by Andreas Schwab in <http://lists.gnu.org/archive/html/bug-coreutils/2007-07/msg00158.html>.
-rw-r--r--ChangeLog9
-rw-r--r--src/sort.c11
2 files changed, 17 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 971581369..bc403ea6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-07-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ sort: avoid unaligned access.
+ * src/sort.c (fillbuf): When enlarging the line buffer, ensure that
+ the new size is a multiple of "sizeof (struct line)". This avoids
+ alignment problems when indexing from the end of the buffer.
+ Problem reported by Andreas Schwab in
+ <http://lists.gnu.org/archive/html/bug-coreutils/2007-07/msg00158.html>.
+
2007-07-23 Jim Meyering <jim@meyering.net>
Update all copyright notices to use the newer form (e.g., remove
diff --git a/src/sort.c b/src/sort.c
index fe5ce4c52..af23e844f 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -1488,9 +1488,14 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file)
return true;
}
- /* The current input line is too long to fit in the buffer.
- Double the buffer size and try again. */
- buf->buf = X2REALLOC (buf->buf, &buf->alloc);
+ {
+ /* The current input line is too long to fit in the buffer.
+ Double the buffer size and try again, keeping it properly
+ aligned. */
+ size_t line_alloc = buf->alloc / sizeof (struct line);
+ buf->buf = x2nrealloc (buf->buf, &line_alloc, sizeof (struct line));
+ buf->alloc = line_alloc * sizeof (struct line);
+ }
}
}