Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
d7826823
Commit
d7826823
authored
Feb 23, 2017
by
Salvatore Sanfilippo
Browse files
Fix BITPOS unaligned memory access.
parent
06263485
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/bitops.c
View file @
d7826823
...
@@ -104,6 +104,7 @@ long redisBitpos(void *s, unsigned long count, int bit) {
...
@@ -104,6 +104,7 @@ long redisBitpos(void *s, unsigned long count, int bit) {
unsigned
long
skipval
,
word
=
0
,
one
;
unsigned
long
skipval
,
word
=
0
,
one
;
long
pos
=
0
;
/* Position of bit, to return to the caller. */
long
pos
=
0
;
/* Position of bit, to return to the caller. */
unsigned
long
j
;
unsigned
long
j
;
int
found
;
/* Process whole words first, seeking for first word that is not
/* Process whole words first, seeking for first word that is not
* all ones or all zeros respectively if we are lookig for zeros
* all ones or all zeros respectively if we are lookig for zeros
...
@@ -117,21 +118,27 @@ long redisBitpos(void *s, unsigned long count, int bit) {
...
@@ -117,21 +118,27 @@ long redisBitpos(void *s, unsigned long count, int bit) {
/* Skip initial bits not aligned to sizeof(unsigned long) byte by byte. */
/* Skip initial bits not aligned to sizeof(unsigned long) byte by byte. */
skipval
=
bit
?
0
:
UCHAR_MAX
;
skipval
=
bit
?
0
:
UCHAR_MAX
;
c
=
(
unsigned
char
*
)
s
;
c
=
(
unsigned
char
*
)
s
;
found
=
0
;
while
((
unsigned
long
)
c
&
(
sizeof
(
*
l
)
-
1
)
&&
count
)
{
while
((
unsigned
long
)
c
&
(
sizeof
(
*
l
)
-
1
)
&&
count
)
{
if
(
*
c
!=
skipval
)
break
;
if
(
*
c
!=
skipval
)
{
found
=
1
;
break
;
}
c
++
;
c
++
;
count
--
;
count
--
;
pos
+=
8
;
pos
+=
8
;
}
}
/* Skip bits with full word step. */
/* Skip bits with full word step. */
skipval
=
bit
?
0
:
ULONG_MAX
;
l
=
(
unsigned
long
*
)
c
;
l
=
(
unsigned
long
*
)
c
;
while
(
count
>=
sizeof
(
*
l
))
{
if
(
!
found
)
{
if
(
*
l
!=
skipval
)
break
;
skipval
=
bit
?
0
:
ULONG_MAX
;
l
++
;
while
(
count
>=
sizeof
(
*
l
))
{
count
-=
sizeof
(
*
l
);
if
(
*
l
!=
skipval
)
break
;
pos
+=
sizeof
(
*
l
)
*
8
;
l
++
;
count
-=
sizeof
(
*
l
);
pos
+=
sizeof
(
*
l
)
*
8
;
}
}
}
/* Load bytes into "word" considering the first byte as the most significant
/* Load bytes into "word" considering the first byte as the most significant
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment