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
5af30201
Commit
5af30201
authored
Apr 18, 2011
by
Pieter Noordhuis
Browse files
Use custom string2ll and strchr
parent
b7d3bf51
Changes
1
Show whitespace changes
Inline
Side-by-side
src/networking.c
View file @
5af30201
...
@@ -700,46 +700,48 @@ static void setProtocolError(redisClient *c, int pos) {
...
@@ -700,46 +700,48 @@ static void setProtocolError(redisClient *c, int pos) {
int
processMultibulkBuffer
(
redisClient
*
c
)
{
int
processMultibulkBuffer
(
redisClient
*
c
)
{
char
*
newline
=
NULL
;
char
*
newline
=
NULL
;
char
*
eptr
;
int
pos
=
0
,
ok
;
int
pos
=
0
,
tolerr
;
long
long
ll
;
long
bulklen
;
if
(
c
->
multibulklen
==
0
)
{
if
(
c
->
multibulklen
==
0
)
{
/* The client should have been reset */
/* The client should have been reset */
redisAssert
(
c
->
argc
==
0
);
redisAssert
(
c
->
argc
==
0
);
/* Multi bulk length cannot be read without a \r\n */
/* Multi bulk length cannot be read without a \r\n */
newline
=
str
st
r
(
c
->
querybuf
,
"
\r
\n
"
);
newline
=
str
ch
r
(
c
->
querybuf
,
'
\r
'
);
if
(
newline
==
NULL
)
if
(
newline
==
NULL
)
return
REDIS_ERR
;
return
REDIS_ERR
;
/* We know for sure there is a whole line since newline != NULL,
/* We know for sure there is a whole line since newline != NULL,
* so go ahead and find out the multi bulk length. */
* so go ahead and find out the multi bulk length. */
redisAssert
(
c
->
querybuf
[
0
]
==
'*'
);
redisAssert
(
c
->
querybuf
[
0
]
==
'*'
);
c
->
multibulklen
=
strtol
(
c
->
querybuf
+
1
,
&
eptr
,
10
);
ok
=
string2ll
(
c
->
querybuf
+
1
,
newline
-
(
c
->
querybuf
+
1
),
&
ll
);
pos
=
(
newline
-
c
->
querybuf
)
+
2
;
if
(
!
ok
||
ll
>
1024
*
1024
)
{
if
(
c
->
multibulklen
<=
0
)
{
c
->
querybuf
=
sdsrange
(
c
->
querybuf
,
pos
,
-
1
);
return
REDIS_OK
;
}
else
if
(
c
->
multibulklen
>
1024
*
1024
)
{
addReplyError
(
c
,
"Protocol error: invalid multibulk length"
);
addReplyError
(
c
,
"Protocol error: invalid multibulk length"
);
setProtocolError
(
c
,
pos
);
setProtocolError
(
c
,
pos
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
else
{
pos
=
(
newline
-
c
->
querybuf
)
+
2
;
if
(
ll
<=
0
)
{
c
->
querybuf
=
sdsrange
(
c
->
querybuf
,
pos
,
-
1
);
return
REDIS_OK
;
}
}
}
c
->
multibulklen
=
ll
;
/* Setup argv array on client structure */
/* Setup argv array on client structure */
if
(
c
->
argv
)
zfree
(
c
->
argv
);
if
(
c
->
argv
)
zfree
(
c
->
argv
);
c
->
argv
=
zmalloc
(
sizeof
(
robj
*
)
*
c
->
multibulklen
);
c
->
argv
=
zmalloc
(
sizeof
(
robj
*
)
*
c
->
multibulklen
);
/* Search new newline */
/* Search new newline */
newline
=
str
st
r
(
c
->
querybuf
+
pos
,
"
\r
\n
"
);
newline
=
str
ch
r
(
c
->
querybuf
+
pos
,
'
\r
'
);
}
}
redisAssert
(
c
->
multibulklen
>
0
);
redisAssert
(
c
->
multibulklen
>
0
);
while
(
c
->
multibulklen
)
{
while
(
c
->
multibulklen
)
{
/* Read bulk length if unknown */
/* Read bulk length if unknown */
if
(
c
->
bulklen
==
-
1
)
{
if
(
c
->
bulklen
==
-
1
)
{
newline
=
str
st
r
(
c
->
querybuf
+
pos
,
"
\r
\n
"
);
newline
=
str
ch
r
(
c
->
querybuf
+
pos
,
'
\r
'
);
if
(
newline
!=
NULL
)
{
if
(
newline
!=
NULL
)
{
if
(
c
->
querybuf
[
pos
]
!=
'$'
)
{
if
(
c
->
querybuf
[
pos
]
!=
'$'
)
{
addReplyErrorFormat
(
c
,
addReplyErrorFormat
(
c
,
...
@@ -749,17 +751,14 @@ int processMultibulkBuffer(redisClient *c) {
...
@@ -749,17 +751,14 @@ int processMultibulkBuffer(redisClient *c) {
return
REDIS_ERR
;
return
REDIS_ERR
;
}
}
bulklen
=
strtol
(
c
->
querybuf
+
pos
+
1
,
&
eptr
,
10
);
ok
=
string2ll
(
c
->
querybuf
+
pos
+
1
,
newline
-
(
c
->
querybuf
+
pos
+
1
),
&
ll
);
tolerr
=
(
eptr
[
0
]
!=
'\r'
);
if
(
!
ok
||
ll
<
0
||
ll
>
512
*
1024
*
1024
)
{
if
(
tolerr
||
bulklen
==
LONG_MIN
||
bulklen
==
LONG_MAX
||
bulklen
<
0
||
bulklen
>
512
*
1024
*
1024
)
{
addReplyError
(
c
,
"Protocol error: invalid bulk length"
);
addReplyError
(
c
,
"Protocol error: invalid bulk length"
);
setProtocolError
(
c
,
pos
);
setProtocolError
(
c
,
pos
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
}
pos
+=
eptr
-
(
c
->
querybuf
+
pos
)
+
2
;
pos
+=
newline
-
(
c
->
querybuf
+
pos
)
+
2
;
c
->
bulklen
=
bulklen
;
c
->
bulklen
=
ll
;
}
else
{
}
else
{
/* No newline in current buffer, so wait for more data */
/* No newline in current buffer, so wait for more data */
break
;
break
;
...
...
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