Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
8f8eeffe
Commit
8f8eeffe
authored
Dec 15, 2010
by
Pieter Noordhuis
Browse files
Disable negative offsets for SETRANGE
parent
e983cf34
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/t_string.c
View file @
8f8eeffe
...
@@ -195,11 +195,13 @@ void setrangeCommand(redisClient *c) {
...
@@ -195,11 +195,13 @@ void setrangeCommand(redisClient *c) {
if
(
getLongFromObjectOrReply
(
c
,
c
->
argv
[
2
],
&
offset
,
NULL
)
!=
REDIS_OK
)
if
(
getLongFromObjectOrReply
(
c
,
c
->
argv
[
2
],
&
offset
,
NULL
)
!=
REDIS_OK
)
return
;
return
;
if
(
offset
<
0
)
{
addReplyError
(
c
,
"offset is out of range"
);
return
;
}
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
if
(
o
==
NULL
)
{
/* Negative offset is always 0 for non-existing keys */
if
(
offset
<
0
)
offset
=
0
;
/* Return 0 when setting nothing on a non-existing string */
/* Return 0 when setting nothing on a non-existing string */
if
(
sdslen
(
value
)
==
0
)
{
if
(
sdslen
(
value
)
==
0
)
{
addReply
(
c
,
shared
.
czero
);
addReply
(
c
,
shared
.
czero
);
...
@@ -233,15 +235,6 @@ void setrangeCommand(redisClient *c) {
...
@@ -233,15 +235,6 @@ void setrangeCommand(redisClient *c) {
return
;
return
;
}
}
/* Convert negative indexes. Note that for SETRANGE, the meaning of a
* negative index is a little different than for other commands.
* Here, an offset of -1 points to the trailing NULL byte of the
* string instead of the last character. */
if
(
offset
<
0
)
{
offset
=
olen
+
1
+
offset
;
if
(
offset
<
0
)
offset
=
0
;
}
/* Return when the resulting string exceeds allowed size */
/* Return when the resulting string exceeds allowed size */
if
(
checkStringLength
(
c
,
offset
+
sdslen
(
value
))
!=
REDIS_OK
)
if
(
checkStringLength
(
c
,
offset
+
sdslen
(
value
))
!=
REDIS_OK
)
return
;
return
;
...
...
tests/unit/basic.tcl
View file @
8f8eeffe
...
@@ -489,14 +489,6 @@ start_server {tags {"basic"}} {
...
@@ -489,14 +489,6 @@ start_server {tags {"basic"}} {
r del mykey
r del mykey
assert_equal 4
[
r setrange mykey 1 foo
]
assert_equal 4
[
r setrange mykey 1 foo
]
assert_equal
"
\000
foo"
[
r get mykey
]
assert_equal
"
\000
foo"
[
r get mykey
]
r del mykey
assert_equal 3
[
r setrange mykey -1 foo
]
assert_equal
"foo"
[
r get mykey
]
r del mykey
assert_equal 3
[
r setrange mykey -100 foo
]
assert_equal
"foo"
[
r get mykey
]
}
}
test
"SETRANGE against string-encoded key"
{
test
"SETRANGE against string-encoded key"
{
...
@@ -512,18 +504,6 @@ start_server {tags {"basic"}} {
...
@@ -512,18 +504,6 @@ start_server {tags {"basic"}} {
assert_equal 3
[
r setrange mykey 1 b
]
assert_equal 3
[
r setrange mykey 1 b
]
assert_equal
"fbo"
[
r get mykey
]
assert_equal
"fbo"
[
r get mykey
]
r set mykey
"foo"
assert_equal 6
[
r setrange mykey -1 bar
]
assert_equal
"foobar"
[
r get mykey
]
r set mykey
"foo"
assert_equal 5
[
r setrange mykey -2 bar
]
assert_equal
"fobar"
[
r get mykey
]
r set mykey
"foo"
assert_equal 3
[
r setrange mykey -20 bar
]
assert_equal
"bar"
[
r get mykey
]
r set mykey
"foo"
r set mykey
"foo"
assert_equal 7
[
r setrange mykey 4 bar
]
assert_equal 7
[
r setrange mykey 4 bar
]
assert_equal
"foo
\000
bar"
[
r get mykey
]
assert_equal
"foo
\000
bar"
[
r get mykey
]
...
@@ -549,18 +529,6 @@ start_server {tags {"basic"}} {
...
@@ -549,18 +529,6 @@ start_server {tags {"basic"}} {
assert_encoding raw mykey
assert_encoding raw mykey
assert_equal 1334
[
r get mykey
]
assert_equal 1334
[
r get mykey
]
r set mykey 1234
assert_encoding int mykey
assert_equal 5
[
r setrange mykey -1 5
]
assert_encoding raw mykey
assert_equal 12345
[
r get mykey
]
r set mykey 1234
assert_encoding int mykey
assert_equal 4
[
r setrange mykey -2 5
]
assert_encoding raw mykey
assert_equal 1235
[
r get mykey
]
r set mykey 1234
r set mykey 1234
assert_encoding int mykey
assert_encoding int mykey
assert_equal 6
[
r setrange mykey 5 2
]
assert_equal 6
[
r setrange mykey 5 2
]
...
@@ -577,7 +545,9 @@ start_server {tags {"basic"}} {
...
@@ -577,7 +545,9 @@ start_server {tags {"basic"}} {
test
"SETRANGE with out of range offset"
{
test
"SETRANGE with out of range offset"
{
r del mykey
r del mykey
assert_error
"*maximum allowed size*"
{
r setrange mykey
[
expr 512*1024*1024-4
]
world
}
assert_error
"*maximum allowed size*"
{
r setrange mykey
[
expr 512*1024*1024-4
]
world
}
r set mykey
"hello"
r set mykey
"hello"
assert_error
"*out of range*"
{
r setrange mykey -1 world
}
assert_error
"*maximum allowed size*"
{
r setrange mykey
[
expr 512*1024*1024-4
]
world
}
assert_error
"*maximum allowed size*"
{
r setrange mykey
[
expr 512*1024*1024-4
]
world
}
}
}
...
...
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