Prevent invalid mvcc timestamps from causing critical errors
Former-commit-id: 6f2dbb00119b1d0a1f5a2543d2c6af05f83ef5de
This commit is contained in:
parent
39dccbbf21
commit
72e02159f4
@ -5167,11 +5167,12 @@ void dumpCommand(client *c) {
|
|||||||
|
|
||||||
/* KEYDB.MVCCRESTORE key mvcc expire serialized-value */
|
/* KEYDB.MVCCRESTORE key mvcc expire serialized-value */
|
||||||
void mvccrestoreCommand(client *c) {
|
void mvccrestoreCommand(client *c) {
|
||||||
long long mvcc, expire;
|
long long expire;
|
||||||
|
uint64_t mvcc;
|
||||||
robj *key = c->argv[1], *obj = nullptr;
|
robj *key = c->argv[1], *obj = nullptr;
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
if (getLongLongFromObjectOrReply(c, c->argv[2], &mvcc, "Invalid MVCC Tstamp") != C_OK)
|
if (getUnsignedLongLongFromObjectOrReply(c, c->argv[2], &mvcc, "Invalid MVCC Tstamp") != C_OK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (getLongLongFromObjectOrReply(c, c->argv[3], &expire, "Invalid expire") != C_OK)
|
if (getLongLongFromObjectOrReply(c, c->argv[3], &expire, "Invalid expire") != C_OK)
|
||||||
|
@ -763,6 +763,20 @@ int getLongLongFromObjectOrReply(client *c, robj *o, long long *target, const ch
|
|||||||
return C_OK;
|
return C_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getUnsignedLongLongFromObjectOrReply(client *c, robj *o, uint64_t *target, const char *msg) {
|
||||||
|
uint64_t value;
|
||||||
|
if (getUnsignedLongLongFromObject(o, &value) != C_OK) {
|
||||||
|
if (msg != NULL) {
|
||||||
|
addReplyError(c,(char*)msg);
|
||||||
|
} else {
|
||||||
|
addReplyError(c,"value is not an integer or out of range");
|
||||||
|
}
|
||||||
|
return C_ERR;
|
||||||
|
}
|
||||||
|
*target = value;
|
||||||
|
return C_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int getLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg) {
|
int getLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg) {
|
||||||
long long value;
|
long long value;
|
||||||
|
|
||||||
|
@ -2376,6 +2376,7 @@ robj *createZsetZiplistObject(void);
|
|||||||
robj *createStreamObject(void);
|
robj *createStreamObject(void);
|
||||||
robj *createModuleObject(moduleType *mt, void *value);
|
robj *createModuleObject(moduleType *mt, void *value);
|
||||||
int getLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg);
|
int getLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg);
|
||||||
|
int getUnsignedLongLongFromObjectOrReply(client *c, robj *o, uint64_t *target, const char *msg);
|
||||||
int getPositiveLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg);
|
int getPositiveLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg);
|
||||||
int getRangeLongFromObjectOrReply(client *c, robj *o, long min, long max, long *target, const char *msg);
|
int getRangeLongFromObjectOrReply(client *c, robj *o, long min, long max, long *target, const char *msg);
|
||||||
int checkType(client *c, robj_roptr o, int type);
|
int checkType(client *c, robj_roptr o, int type);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user