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
hiredis
Commits
f05909cd
Commit
f05909cd
authored
Jan 26, 2013
by
Pieter Noordhuis
Browse files
Merge pull request #147 from hdoreau/
d7e3268f
Prevent hiredis from crashing on memory allocation failure
parents
9df327e8
d7e3268f
Changes
5
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
f05909cd
...
...
@@ -44,7 +44,7 @@ After trying to connect to Redis using `redisConnect` you should
check the
`err`
field to see if establishing the connection was successful:
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c->err) {
if (c
!= NULL && c
->err) {
printf("Error: %s\n", c->errstr);
// handle error
}
...
...
async.c
View file @
f05909cd
...
...
@@ -102,7 +102,12 @@ static dictType callbackDict = {
};
static
redisAsyncContext
*
redisAsyncInitialize
(
redisContext
*
c
)
{
redisAsyncContext
*
ac
=
realloc
(
c
,
sizeof
(
redisAsyncContext
));
redisAsyncContext
*
ac
;
ac
=
realloc
(
c
,
sizeof
(
redisAsyncContext
));
if
(
ac
==
NULL
)
return
NULL
;
c
=
&
(
ac
->
c
);
/* The regular connect functions will always set the flag REDIS_CONNECTED.
...
...
@@ -142,15 +147,32 @@ static void __redisAsyncCopyError(redisAsyncContext *ac) {
}
redisAsyncContext
*
redisAsyncConnect
(
const
char
*
ip
,
int
port
)
{
redisContext
*
c
=
redisConnectNonBlock
(
ip
,
port
);
redisAsyncContext
*
ac
=
redisAsyncInitialize
(
c
);
redisContext
*
c
;
redisAsyncContext
*
ac
;
c
=
redisConnectNonBlock
(
ip
,
port
);
if
(
c
==
NULL
)
return
NULL
;
ac
=
redisAsyncInitialize
(
c
);
if
(
ac
==
NULL
)
{
redisFree
(
c
);
return
NULL
;
}
__redisAsyncCopyError
(
ac
);
return
ac
;
}
redisAsyncContext
*
redisAsyncConnectUnix
(
const
char
*
path
)
{
redisContext
*
c
=
redisConnectUnixNonBlock
(
path
);
redisAsyncContext
*
ac
=
redisAsyncInitialize
(
c
);
redisContext
*
c
;
redisAsyncContext
*
ac
;
c
=
redisConnectUnixNonBlock
(
path
);
if
(
c
==
NULL
)
return
NULL
;
ac
=
redisAsyncInitialize
(
c
);
__redisAsyncCopyError
(
ac
);
return
ac
;
}
...
...
@@ -182,6 +204,9 @@ static int __redisPushCallback(redisCallbackList *list, redisCallback *source) {
/* Copy callback from stack to heap */
cb
=
malloc
(
sizeof
(
*
cb
));
if
(
cb
==
NULL
)
return
REDIS_ERR_OOM
;
if
(
source
!=
NULL
)
{
memcpy
(
cb
,
source
,
sizeof
(
*
cb
));
cb
->
next
=
NULL
;
...
...
example.c
View file @
f05909cd
...
...
@@ -11,8 +11,13 @@ int main(void) {
struct
timeval
timeout
=
{
1
,
500000
};
// 1.5 seconds
c
=
redisConnectWithTimeout
((
char
*
)
"127.0.0.1"
,
6379
,
timeout
);
if
(
c
->
err
)
{
printf
(
"Connection error: %s
\n
"
,
c
->
errstr
);
if
(
c
==
NULL
||
c
->
err
)
{
if
(
c
)
{
printf
(
"Connection error: %s
\n
"
,
c
->
errstr
);
redisFree
(
c
);
}
else
{
printf
(
"Connection error: can't allocate redis context
\n
"
);
}
exit
(
1
);
}
...
...
hiredis.c
View file @
f05909cd
...
...
@@ -1014,42 +1014,72 @@ void redisFree(redisContext *c) {
* context will be set to the return value of the error function.
* When no set of reply functions is given, the default set will be used. */
redisContext
*
redisConnect
(
const
char
*
ip
,
int
port
)
{
redisContext
*
c
=
redisContextInit
();
redisContext
*
c
;
c
=
redisContextInit
();
if
(
c
==
NULL
)
return
NULL
;
c
->
flags
|=
REDIS_BLOCK
;
redisContextConnectTcp
(
c
,
ip
,
port
,
NULL
);
return
c
;
}
redisContext
*
redisConnectWithTimeout
(
const
char
*
ip
,
int
port
,
struct
timeval
tv
)
{
redisContext
*
c
=
redisContextInit
();
redisContext
*
c
;
c
=
redisContextInit
();
if
(
c
==
NULL
)
return
NULL
;
c
->
flags
|=
REDIS_BLOCK
;
redisContextConnectTcp
(
c
,
ip
,
port
,
&
tv
);
return
c
;
}
redisContext
*
redisConnectNonBlock
(
const
char
*
ip
,
int
port
)
{
redisContext
*
c
=
redisContextInit
();
redisContext
*
c
;
c
=
redisContextInit
();
if
(
c
==
NULL
)
return
NULL
;
c
->
flags
&=
~
REDIS_BLOCK
;
redisContextConnectTcp
(
c
,
ip
,
port
,
NULL
);
return
c
;
}
redisContext
*
redisConnectUnix
(
const
char
*
path
)
{
redisContext
*
c
=
redisContextInit
();
redisContext
*
c
;
c
=
redisContextInit
();
if
(
c
==
NULL
)
return
NULL
;
c
->
flags
|=
REDIS_BLOCK
;
redisContextConnectUnix
(
c
,
path
,
NULL
);
return
c
;
}
redisContext
*
redisConnectUnixWithTimeout
(
const
char
*
path
,
struct
timeval
tv
)
{
redisContext
*
c
=
redisContextInit
();
redisContext
*
c
;
c
=
redisContextInit
();
if
(
c
==
NULL
)
return
NULL
;
c
->
flags
|=
REDIS_BLOCK
;
redisContextConnectUnix
(
c
,
path
,
&
tv
);
return
c
;
}
redisContext
*
redisConnectUnixNonBlock
(
const
char
*
path
)
{
redisContext
*
c
=
redisContextInit
();
redisContext
*
c
;
c
=
redisContextInit
();
if
(
c
==
NULL
)
return
NULL
;
c
->
flags
&=
~
REDIS_BLOCK
;
redisContextConnectUnix
(
c
,
path
,
NULL
);
return
c
;
...
...
test.c
View file @
f05909cd
...
...
@@ -88,7 +88,10 @@ static redisContext *connect(struct config config) {
assert
(
NULL
);
}
if
(
c
->
err
)
{
if
(
c
==
NULL
)
{
printf
(
"Connection error: can't allocate redis context
\n
"
);
exit
(
1
);
}
else
if
(
c
->
err
)
{
printf
(
"Connection error: %s
\n
"
,
c
->
errstr
);
exit
(
1
);
}
...
...
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