summaryrefslogtreecommitdiff
path: root/apt-pkg/contrib
diff options
context:
space:
mode:
authorDavid Miller <davem@davemloft.net>2011-07-26 09:00:10 +0200
committerDavid Kalnischkies <kalnischkies@gmail.com>2011-07-26 09:00:10 +0200
commit1edc38abff0bffd56ad7a128f6243050d4064827 (patch)
tree98524fb434250f5196d9febae4e3650c3d0eb318 /apt-pkg/contrib
parentcd84a799ecbb958af42e554629250a404889c651 (diff)
* apt-pkg/contrib/sha1.cc:
- fix illegally casts of on-stack buffer to a type requiring more alignment than it has resulting in segfaults on sparc (Closes: #634696) The problem is how sha1.cc codes the SHA1 transform, it illegally casts the on-stack workspace buffer to a type requiring more alignment than 'workspace' is actually declared to have. This only shows up recently because gcc-4.6 now does a really aggressive optimization where it gets rid of the workspace buffer entirely and just accesses 'buffer' directly, and assumes it has the necessary alignment for 32-bit loads (which it doesn't).
Diffstat (limited to 'apt-pkg/contrib')
-rw-r--r--apt-pkg/contrib/sha1.cc5
1 files changed, 2 insertions, 3 deletions
diff --git a/apt-pkg/contrib/sha1.cc b/apt-pkg/contrib/sha1.cc
index eae52d52f..abc2aaf9f 100644
--- a/apt-pkg/contrib/sha1.cc
+++ b/apt-pkg/contrib/sha1.cc
@@ -74,10 +74,9 @@ static void SHA1Transform(uint32_t state[5],uint8_t const buffer[64])
uint32_t l[16];
}
CHAR64LONG16;
- CHAR64LONG16 *block;
+ CHAR64LONG16 workspace, *block;
- uint8_t workspace[64];
- block = (CHAR64LONG16 *)workspace;
+ block = &workspace;
memcpy(block,buffer,sizeof(workspace));
/* Copy context->state[] to working vars */