mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 00:28:26 -05:00
Free fakeclient argv on AOF error.
We exit later, so no bug fixed, but it is more correct. See #6054, thanks to @ShooterIT for finding the issue.
This commit is contained in:
parent
5234bff579
commit
9466dae4e5
14
src/aof.c
14
src/aof.c
@ -781,18 +781,24 @@ int loadAppendOnlyFile(char *filename) {
|
|||||||
argc = atoi(buf+1);
|
argc = atoi(buf+1);
|
||||||
if (argc < 1) goto fmterr;
|
if (argc < 1) goto fmterr;
|
||||||
|
|
||||||
|
/* Load the next command in the AOF as our fake client
|
||||||
|
* argv. */
|
||||||
argv = zmalloc(sizeof(robj*)*argc);
|
argv = zmalloc(sizeof(robj*)*argc);
|
||||||
fakeClient->argc = argc;
|
fakeClient->argc = argc;
|
||||||
fakeClient->argv = argv;
|
fakeClient->argv = argv;
|
||||||
|
|
||||||
for (j = 0; j < argc; j++) {
|
for (j = 0; j < argc; j++) {
|
||||||
if (fgets(buf,sizeof(buf),fp) == NULL) {
|
/* Parse the argument len. */
|
||||||
|
if (fgets(buf,sizeof(buf),fp) == NULL ||
|
||||||
|
buf[0] != '$')
|
||||||
|
{
|
||||||
fakeClient->argc = j; /* Free up to j-1. */
|
fakeClient->argc = j; /* Free up to j-1. */
|
||||||
freeFakeClientArgv(fakeClient);
|
freeFakeClientArgv(fakeClient);
|
||||||
goto readerr;
|
goto readerr;
|
||||||
}
|
}
|
||||||
if (buf[0] != '$') goto fmterr;
|
|
||||||
len = strtol(buf+1,NULL,10);
|
len = strtol(buf+1,NULL,10);
|
||||||
|
|
||||||
|
/* Read it into a string object. */
|
||||||
argsds = sdsnewlen(SDS_NOINIT,len);
|
argsds = sdsnewlen(SDS_NOINIT,len);
|
||||||
if (len && fread(argsds,len,1,fp) == 0) {
|
if (len && fread(argsds,len,1,fp) == 0) {
|
||||||
sdsfree(argsds);
|
sdsfree(argsds);
|
||||||
@ -801,10 +807,12 @@ int loadAppendOnlyFile(char *filename) {
|
|||||||
goto readerr;
|
goto readerr;
|
||||||
}
|
}
|
||||||
argv[j] = createObject(OBJ_STRING,argsds);
|
argv[j] = createObject(OBJ_STRING,argsds);
|
||||||
|
|
||||||
|
/* Discard CRLF. */
|
||||||
if (fread(buf,2,1,fp) == 0) {
|
if (fread(buf,2,1,fp) == 0) {
|
||||||
fakeClient->argc = j+1; /* Free up to j. */
|
fakeClient->argc = j+1; /* Free up to j. */
|
||||||
freeFakeClientArgv(fakeClient);
|
freeFakeClientArgv(fakeClient);
|
||||||
goto readerr; /* discard CRLF */
|
goto readerr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user