2010-08-13 19:28:49 +02:00
|
|
|
/* The ziplist is a specially encoded dually linked list that is designed
|
|
|
|
* to be very memory efficient. It stores both strings and integer values,
|
|
|
|
* where integers are encoded as actual integers instead of a series of
|
|
|
|
* characters. It allows push and pop operations on either side of the list
|
|
|
|
* in O(1) time. However, because every operation requires a reallocation of
|
|
|
|
* the memory used by the ziplist, the actual complexity is related to the
|
|
|
|
* amount of memory used by the ziplist.
|
2010-05-21 12:54:01 +02:00
|
|
|
*
|
2010-08-13 19:28:49 +02:00
|
|
|
* ----------------------------------------------------------------------------
|
2010-05-21 12:54:01 +02:00
|
|
|
*
|
2016-12-16 09:04:57 +01:00
|
|
|
* ZIPLIST OVERALL LAYOUT
|
2017-01-27 16:54:20 +01:00
|
|
|
* ======================
|
2016-12-16 09:04:57 +01:00
|
|
|
*
|
2010-08-13 19:28:49 +02:00
|
|
|
* The general layout of the ziplist is as follows:
|
2010-05-21 12:54:01 +02:00
|
|
|
*
|
2016-12-16 09:04:57 +01:00
|
|
|
* <zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
|
|
|
|
*
|
2017-01-27 16:54:20 +01:00
|
|
|
* NOTE: all fields are stored in little endian, if not specified otherwise.
|
2016-12-16 09:04:57 +01:00
|
|
|
*
|
|
|
|
* <uint32_t zlbytes> is an unsigned integer to hold the number of bytes that
|
2017-01-27 16:54:20 +01:00
|
|
|
* the ziplist occupies, including the four bytes of the zlbytes field itself.
|
|
|
|
* This value needs to be stored to be able to resize the entire structure
|
|
|
|
* without the need to traverse it first.
|
2010-08-13 19:28:49 +02:00
|
|
|
*
|
2016-12-16 09:04:57 +01:00
|
|
|
* <uint32_t zltail> is the offset to the last entry in the list. This allows
|
|
|
|
* a pop operation on the far side of the list without the need for full
|
|
|
|
* traversal.
|
|
|
|
*
|
2017-01-27 16:54:20 +01:00
|
|
|
* <uint16_t zllen> is the number of entries. When there are more than
|
2018-06-07 14:36:56 +02:00
|
|
|
* 2^16-2 entries, this value is set to 2^16-1 and we need to traverse the
|
2017-01-27 16:54:20 +01:00
|
|
|
* entire list to know how many items it holds.
|
2010-08-13 19:28:49 +02:00
|
|
|
*
|
2017-01-27 16:54:20 +01:00
|
|
|
* <uint8_t zlend> is a special entry representing the end of the ziplist.
|
|
|
|
* Is encoded as a single byte equal to 255. No other normal entry starts
|
|
|
|
* with a byte set to the value of 255.
|
2010-08-13 19:28:49 +02:00
|
|
|
*
|
2016-12-16 09:04:57 +01:00
|
|
|
* ZIPLIST ENTRIES
|
2017-01-27 16:54:20 +01:00
|
|
|
* ===============
|
2010-08-13 19:28:49 +02:00
|
|
|
*
|
2017-01-27 16:54:20 +01:00
|
|
|
* Every entry in the ziplist is prefixed by metadata that contains two pieces
|
2010-08-13 19:28:49 +02:00
|
|
|
* of information. First, the length of the previous entry is stored to be
|
2017-01-27 16:54:20 +01:00
|
|
|
* able to traverse the list from back to front. Second, the entry encoding is
|
|
|
|
* provided. It represents the entry type, integer or string, and in the case
|
|
|
|
* of strings it also represents the length of the string payload.
|
|
|
|
* So a complete entry is stored like this:
|
|
|
|
*
|
|
|
|
* <prevlen> <encoding> <entry-data>
|
|
|
|
*
|
|
|
|
* Sometimes the encoding represents the entry itself, like for small integers
|
|
|
|
* as we'll see later. In such a case the <entry-data> part is missing, and we
|
|
|
|
* could have just:
|
|
|
|
*
|
|
|
|
* <prevlen> <encoding>
|
|
|
|
*
|
|
|
|
* The length of the previous entry, <prevlen>, is encoded in the following way:
|
2018-02-23 12:19:30 +01:00
|
|
|
* If this length is smaller than 254 bytes, it will only consume a single
|
2017-01-27 16:54:20 +01:00
|
|
|
* byte representing the length as an unsinged 8 bit integer. When the length
|
2018-02-23 12:19:30 +01:00
|
|
|
* is greater than or equal to 254, it will consume 5 bytes. The first byte is
|
|
|
|
* set to 254 (FE) to indicate a larger value is following. The remaining 4
|
2017-01-27 16:54:20 +01:00
|
|
|
* bytes take the length of the previous entry as value.
|
|
|
|
*
|
|
|
|
* So practically an entry is encoded in the following way:
|
|
|
|
*
|
2018-02-23 12:19:30 +01:00
|
|
|
* <prevlen from 0 to 253> <encoding> <entry>
|
2017-01-27 16:54:20 +01:00
|
|
|
*
|
2018-02-23 12:19:30 +01:00
|
|
|
* Or alternatively if the previous entry length is greater than 253 bytes
|
2017-01-27 16:54:20 +01:00
|
|
|
* the following encoding is used:
|
|
|
|
*
|
2018-02-23 12:19:30 +01:00
|
|
|
* 0xFE <4 bytes unsigned little endian prevlen> <encoding> <entry>
|
2017-01-27 16:54:20 +01:00
|
|
|
*
|
|
|
|
* The encoding field of the entry depends on the content of the
|
|
|
|
* entry. When the entry is a string, the first 2 bits of the encoding first
|
|
|
|
* byte will hold the type of encoding used to store the length of the string,
|
|
|
|
* followed by the actual length of the string. When the entry is an integer
|
|
|
|
* the first 2 bits are both set to 1. The following 2 bits are used to specify
|
|
|
|
* what kind of integer will be stored after this header. An overview of the
|
|
|
|
* different types and encodings is as follows. The first byte is always enough
|
|
|
|
* to determine the kind of entry.
|
2010-08-13 19:28:49 +02:00
|
|
|
*
|
|
|
|
* |00pppppp| - 1 byte
|
|
|
|
* String value with length less than or equal to 63 bytes (6 bits).
|
2017-01-27 16:54:20 +01:00
|
|
|
* "pppppp" represents the unsigned 6 bit length.
|
2010-08-13 19:28:49 +02:00
|
|
|
* |01pppppp|qqqqqqqq| - 2 bytes
|
|
|
|
* String value with length less than or equal to 16383 bytes (14 bits).
|
2017-01-27 16:54:20 +01:00
|
|
|
* IMPORTANT: The 14 bit number is stored in big endian.
|
|
|
|
* |10000000|qqqqqqqq|rrrrrrrr|ssssssss|tttttttt| - 5 bytes
|
2010-08-13 19:28:49 +02:00
|
|
|
* String value with length greater than or equal to 16384 bytes.
|
2017-01-27 16:54:20 +01:00
|
|
|
* Only the 4 bytes following the first byte represents the length
|
2020-07-12 03:51:44 +08:00
|
|
|
* up to 2^32-1. The 6 lower bits of the first byte are not used and
|
2017-01-27 16:54:20 +01:00
|
|
|
* are set to zero.
|
|
|
|
* IMPORTANT: The 32 bit number is stored in big endian.
|
|
|
|
* |11000000| - 3 bytes
|
2010-08-13 19:28:49 +02:00
|
|
|
* Integer encoded as int16_t (2 bytes).
|
2017-01-27 16:54:20 +01:00
|
|
|
* |11010000| - 5 bytes
|
2010-08-13 19:28:49 +02:00
|
|
|
* Integer encoded as int32_t (4 bytes).
|
2017-01-27 16:54:20 +01:00
|
|
|
* |11100000| - 9 bytes
|
2010-08-13 19:28:49 +02:00
|
|
|
* Integer encoded as int64_t (8 bytes).
|
2017-01-27 16:54:20 +01:00
|
|
|
* |11110000| - 4 bytes
|
2012-04-24 12:51:59 +02:00
|
|
|
* Integer encoded as 24 bit signed (3 bytes).
|
2017-01-27 16:54:20 +01:00
|
|
|
* |11111110| - 2 bytes
|
2012-04-24 16:54:07 +02:00
|
|
|
* Integer encoded as 8 bit signed (1 byte).
|
Squash merging 125 typo/grammar/comment/doc PRs (#7773)
List of squashed commits or PRs
===============================
commit 66801ea
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Jan 13 00:54:31 2020 -0500
typo fix in acl.c
commit 46f55db
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun Sep 6 18:24:11 2020 +0300
Updates a couple of comments
Specifically:
* RM_AutoMemory completed instead of pointing to docs
* Updated link to custom type doc
commit 61a2aa0
Author: xindoo <xindoo@qq.com>
Date: Tue Sep 1 19:24:59 2020 +0800
Correct errors in code comments
commit a5871d1
Author: yz1509 <pro-756@qq.com>
Date: Tue Sep 1 18:36:06 2020 +0800
fix typos in module.c
commit 41eede7
Author: bookug <bookug@qq.com>
Date: Sat Aug 15 01:11:33 2020 +0800
docs: fix typos in comments
commit c303c84
Author: lazy-snail <ws.niu@outlook.com>
Date: Fri Aug 7 11:15:44 2020 +0800
fix spelling in redis.conf
commit 1eb76bf
Author: zhujian <zhujianxyz@gmail.com>
Date: Thu Aug 6 15:22:10 2020 +0800
add a missing 'n' in comment
commit 1530ec2
Author: Daniel Dai <764122422@qq.com>
Date: Mon Jul 27 00:46:35 2020 -0400
fix spelling in tracking.c
commit e517b31
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:32 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit c300eff
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:23 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit 4c058a8
Author: 陈浩鹏 <chenhaopeng@heytea.com>
Date: Thu Jun 25 19:00:56 2020 +0800
Grammar fix and clarification
commit 5fcaa81
Author: bodong.ybd <bodong.ybd@alibaba-inc.com>
Date: Fri Jun 19 10:09:00 2020 +0800
Fix typos
commit 4caca9a
Author: Pruthvi P <pruthvi@ixigo.com>
Date: Fri May 22 00:33:22 2020 +0530
Fix typo eviciton => eviction
commit b2a25f6
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Sun May 17 12:39:59 2020 -0400
Fix a typo.
commit 12842ae
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun May 3 17:16:59 2020 -0400
fix spelling in redis conf
commit ddba07c
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Sat May 2 23:25:34 2020 +0100
Correct a "conflicts" spelling error.
commit 8fc7bf2
Author: Nao YONASHIRO <yonashiro@r.recruit.co.jp>
Date: Thu Apr 30 10:25:27 2020 +0900
docs: fix EXPIRE_FAST_CYCLE_DURATION to ACTIVE_EXPIRE_CYCLE_FAST_DURATION
commit 9b2b67a
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Fri Apr 24 11:46:22 2020 -0400
Fix a typo.
commit 0746f10
Author: devilinrust <63737265+devilinrust@users.noreply.github.com>
Date: Thu Apr 16 00:17:53 2020 +0200
Fix typos in server.c
commit 92b588d
Author: benjessop12 <56115861+benjessop12@users.noreply.github.com>
Date: Mon Apr 13 13:43:55 2020 +0100
Fix spelling mistake in lazyfree.c
commit 1da37aa
Merge: 2d4ba28 af347a8
Author: hwware <wen.hui.ware@gmail.com>
Date: Thu Mar 5 22:41:31 2020 -0500
Merge remote-tracking branch 'upstream/unstable' into expiretypofix
commit 2d4ba28
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Mar 2 00:09:40 2020 -0500
fix typo in expire.c
commit 1a746f7
Author: SennoYuki <minakami1yuki@gmail.com>
Date: Thu Feb 27 16:54:32 2020 +0800
fix typo
commit 8599b1a
Author: dongheejeong <donghee950403@gmail.com>
Date: Sun Feb 16 20:31:43 2020 +0000
Fix typo in server.c
commit f38d4e8
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun Feb 2 22:58:38 2020 -0500
fix typo in evict.c
commit fe143fc
Author: Leo Murillo <leonardo.murillo@gmail.com>
Date: Sun Feb 2 01:57:22 2020 -0600
Fix a few typos in redis.conf
commit 1ab4d21
Author: viraja1 <anchan.viraj@gmail.com>
Date: Fri Dec 27 17:15:58 2019 +0530
Fix typo in Latency API docstring
commit ca1f70e
Author: gosth <danxuedexing@qq.com>
Date: Wed Dec 18 15:18:02 2019 +0800
fix typo in sort.c
commit a57c06b
Author: ZYunH <zyunhjob@163.com>
Date: Mon Dec 16 22:28:46 2019 +0800
fix-zset-typo
commit b8c92b5
Author: git-hulk <hulk.website@gmail.com>
Date: Mon Dec 16 15:51:42 2019 +0800
FIX: typo in cluster.c, onformation->information
commit 9dd981c
Author: wujm2007 <jim.wujm@gmail.com>
Date: Mon Dec 16 09:37:52 2019 +0800
Fix typo
commit e132d7a
Author: Sebastien Williams-Wynn <s.williamswynn.mail@gmail.com>
Date: Fri Nov 15 00:14:07 2019 +0000
Minor typo change
commit 47f44d5
Author: happynote3966 <01ssrmikururudevice01@gmail.com>
Date: Mon Nov 11 22:08:48 2019 +0900
fix comment typo in redis-cli.c
commit b8bdb0d
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 18:00:17 2019 +0800
Fix a spelling mistake of comments in defragDictBucketCallback
commit 0def46a
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 13:09:27 2019 +0800
fix some spelling mistakes of comments in defrag.c
commit f3596fd
Author: Phil Rajchgot <tophil@outlook.com>
Date: Sun Oct 13 02:02:32 2019 -0400
Typo and grammar fixes
Redis and its documentation are great -- just wanted to submit a few corrections in the spirit of Hacktoberfest. Thanks for all your work on this project. I use it all the time and it works beautifully.
commit 2b928cd
Author: KangZhiDong <worldkzd@gmail.com>
Date: Sun Sep 1 07:03:11 2019 +0800
fix typos
commit 33aea14
Author: Axlgrep <axlgrep@gmail.com>
Date: Tue Aug 27 11:02:18 2019 +0800
Fixed eviction spelling issues
commit e282a80
Author: Simen Flatby <simen@oms.no>
Date: Tue Aug 20 15:25:51 2019 +0200
Update comments to reflect prop name
In the comments the prop is referenced as replica-validity-factor,
but it is really named cluster-replica-validity-factor.
commit 74d1f9a
Author: Jim Green <jimgreen2013@qq.com>
Date: Tue Aug 20 20:00:31 2019 +0800
fix comment error, the code is ok
commit eea1407
Author: Liao Tonglang <liaotonglang@gmail.com>
Date: Fri May 31 10:16:18 2019 +0800
typo fix
fix cna't to can't
commit 0da553c
Author: KAWACHI Takashi <tkawachi@gmail.com>
Date: Wed Jul 17 00:38:16 2019 +0900
Fix typo
commit 7fc8fb6
Author: Michael Prokop <mika@grml.org>
Date: Tue May 28 17:58:42 2019 +0200
Typo fixes
s/familar/familiar/
s/compatiblity/compatibility/
s/ ot / to /
s/itsef/itself/
commit 5f46c9d
Author: zhumoing <34539422+zhumoing@users.noreply.github.com>
Date: Tue May 21 21:16:50 2019 +0800
typo-fixes
typo-fixes
commit 321dfe1
Author: wxisme <850885154@qq.com>
Date: Sat Mar 16 15:10:55 2019 +0800
typo fix
commit b4fb131
Merge: 267e0e6 3df1eb8
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Fri Feb 8 22:55:45 2019 +0200
Merge branch 'unstable' of antirez/redis into unstable
commit 267e0e6
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Wed Jan 30 21:26:04 2019 +0200
Minor typo fix
commit 30544e7
Author: inshal96 <39904558+inshal96@users.noreply.github.com>
Date: Fri Jan 4 16:54:50 2019 +0500
remove an extra 'a' in the comments
commit 337969d
Author: BrotherGao <yangdongheng11@gmail.com>
Date: Sat Dec 29 12:37:29 2018 +0800
fix typo in redis.conf
commit 9f4b121
Merge: 423a030 e504583
Author: BrotherGao <yangdongheng@xiaomi.com>
Date: Sat Dec 29 11:41:12 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 423a030
Merge: 42b02b7 46a51cd
Author: 杨东衡 <yangdongheng@xiaomi.com>
Date: Tue Dec 4 23:56:11 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 42b02b7
Merge: 68c0e6e b8febe6
Author: Dongheng Yang <yangdongheng11@gmail.com>
Date: Sun Oct 28 15:54:23 2018 +0800
Merge pull request #1 from antirez/unstable
update local data
commit 714b589
Author: Christian <crifei93@gmail.com>
Date: Fri Dec 28 01:17:26 2018 +0100
fix typo "resulution"
commit e23259d
Author: garenchan <1412950785@qq.com>
Date: Wed Dec 26 09:58:35 2018 +0800
fix typo: segfauls -> segfault
commit a9359f8
Author: xjp <jianping_xie@aliyun.com>
Date: Tue Dec 18 17:31:44 2018 +0800
Fixed REDISMODULE_H spell bug
commit a12c3e4
Author: jdiaz <jrd.palacios@gmail.com>
Date: Sat Dec 15 23:39:52 2018 -0600
Fixes hyperloglog hash function comment block description
commit 770eb11
Author: 林上耀 <1210tom@163.com>
Date: Sun Nov 25 17:16:10 2018 +0800
fix typo
commit fd97fbb
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Fri Nov 23 17:14:01 2018 +0100
Correct "unsupported" typo.
commit a85522d
Author: Jungnam Lee <jungnam.lee@oracle.com>
Date: Thu Nov 8 23:01:29 2018 +0900
fix typo in test comments
commit ade8007
Author: Arun Kumar <palerdot@users.noreply.github.com>
Date: Tue Oct 23 16:56:35 2018 +0530
Fixed grammatical typo
Fixed typo for word 'dictionary'
commit 869ee39
Author: Hamid Alaei <hamid.a85@gmail.com>
Date: Sun Aug 12 16:40:02 2018 +0430
fix documentations: (ThreadSafeContextStart/Stop -> ThreadSafeContextLock/Unlock), minor typo
commit f89d158
Author: Mayank Jain <mayankjain255@gmail.com>
Date: Tue Jul 31 23:01:21 2018 +0530
Updated README.md with some spelling corrections.
Made correction in spelling of some misspelled words.
commit 892198e
Author: dsomeshwar <someshwar.dhayalan@gmail.com>
Date: Sat Jul 21 23:23:04 2018 +0530
typo fix
commit 8a4d780
Author: Itamar Haber <itamar@redislabs.com>
Date: Mon Apr 30 02:06:52 2018 +0300
Fixes some typos
commit e3acef6
Author: Noah Rosamilia <ivoahivoah@gmail.com>
Date: Sat Mar 3 23:41:21 2018 -0500
Fix typo in /deps/README.md
commit 04442fb
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:32:42 2018 +0800
Fix typo in readSyncBulkPayload() comment.
commit 9f36880
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:20:37 2018 +0800
replication.c comment: run_id -> replid.
commit f866b4a
Author: Francesco 'makevoid' Canessa <makevoid@gmail.com>
Date: Thu Feb 22 22:01:56 2018 +0000
fix comment typo in server.c
commit 0ebc69b
Author: 줍 <jubee0124@gmail.com>
Date: Mon Feb 12 16:38:48 2018 +0900
Fix typo in redis.conf
Fix `five behaviors` to `eight behaviors` in [this sentence ](antirez/redis@unstable/redis.conf#L564)
commit b50a620
Author: martinbroadhurst <martinbroadhurst@users.noreply.github.com>
Date: Thu Dec 28 12:07:30 2017 +0000
Fix typo in valgrind.sup
commit 7d8f349
Author: Peter Boughton <peter@sorcerersisle.com>
Date: Mon Nov 27 19:52:19 2017 +0000
Update CONTRIBUTING; refer doc updates to redis-doc repo.
commit 02dec7e
Author: Klauswk <klauswk1@hotmail.com>
Date: Tue Oct 24 16:18:38 2017 -0200
Fix typo in comment
commit e1efbc8
Author: chenshi <baiwfg2@gmail.com>
Date: Tue Oct 3 18:26:30 2017 +0800
Correct two spelling errors of comments
commit 93327d8
Author: spacewander <spacewanderlzx@gmail.com>
Date: Wed Sep 13 16:47:24 2017 +0800
Update the comment for OBJ_ENCODING_EMBSTR_SIZE_LIMIT's value
The value of OBJ_ENCODING_EMBSTR_SIZE_LIMIT is 44 now instead of 39.
commit 63d361f
Author: spacewander <spacewanderlzx@gmail.com>
Date: Tue Sep 12 15:06:42 2017 +0800
Fix <prevlen> related doc in ziplist.c
According to the definition of ZIP_BIG_PREVLEN and other related code,
the guard of single byte <prevlen> should be 254 instead of 255.
commit ebe228d
Author: hanael80 <hanael80@gmail.com>
Date: Tue Aug 15 09:09:40 2017 +0900
Fix typo
commit 6b696e6
Author: Matt Robenolt <matt@ydekproductions.com>
Date: Mon Aug 14 14:50:47 2017 -0700
Fix typo in LATENCY DOCTOR output
commit a2ec6ae
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 15 14:15:16 2017 +0800
Fix a typo: form => from
commit 3ab7699
Author: caosiyang <caosiyang@qiyi.com>
Date: Thu Aug 10 18:40:33 2017 +0800
Fix a typo: replicationFeedSlavesFromMaster() => replicationFeedSlavesFromMasterStream()
commit 72d43ef
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 8 15:57:25 2017 +0800
fix a typo: servewr => server
commit 707c958
Author: Bo Cai <charpty@gmail.com>
Date: Wed Jul 26 21:49:42 2017 +0800
redis-cli.c typo: conut -> count.
Signed-off-by: Bo Cai <charpty@gmail.com>
commit b9385b2
Author: JackDrogon <jack.xsuperman@gmail.com>
Date: Fri Jun 30 14:22:31 2017 +0800
Fix some spell problems
commit 20d9230
Author: akosel <aaronjkosel@gmail.com>
Date: Sun Jun 4 19:35:13 2017 -0500
Fix typo
commit b167bfc
Author: Krzysiek Witkowicz <krzysiekwitkowicz@gmail.com>
Date: Mon May 22 21:32:27 2017 +0100
Fix #4008 small typo in comment
commit 2b78ac8
Author: Jake Clarkson <jacobwclarkson@gmail.com>
Date: Wed Apr 26 15:49:50 2017 +0100
Correct typo in tests/unit/hyperloglog.tcl
commit b0f1cdb
Author: Qi Luo <qiluo-msft@users.noreply.github.com>
Date: Wed Apr 19 14:25:18 2017 -0700
Fix typo
commit a90b0f9
Author: charsyam <charsyam@naver.com>
Date: Thu Mar 16 18:19:53 2017 +0900
fix typos
fix typos
fix typos
commit 8430a79
Author: Richard Hart <richardhart92@gmail.com>
Date: Mon Mar 13 22:17:41 2017 -0400
Fixed log message typo in listenToPort.
commit 481a1c2
Author: Vinod Kumar <kumar003vinod@gmail.com>
Date: Sun Jan 15 23:04:51 2017 +0530
src/db.c: Correct "save" -> "safe" typo
commit 586b4d3
Author: wangshaonan <wshn13@gmail.com>
Date: Wed Dec 21 20:28:27 2016 +0800
Fix typo they->the in helloworld.c
commit c1c4b5e
Author: Jenner <hypxm@qq.com>
Date: Mon Dec 19 16:39:46 2016 +0800
typo error
commit 1ee1a3f
Author: tielei <43289893@qq.com>
Date: Mon Jul 18 13:52:25 2016 +0800
fix some comments
commit 11a41fb
Author: Otto Kekäläinen <otto@seravo.fi>
Date: Sun Jul 3 10:23:55 2016 +0100
Fix spelling in documentation and comments
commit 5fb5d82
Author: francischan <f1ancis621@gmail.com>
Date: Tue Jun 28 00:19:33 2016 +0800
Fix outdated comments about redis.c file.
It should now refer to server.c file.
commit 6b254bc
Author: lmatt-bit <lmatt123n@gmail.com>
Date: Thu Apr 21 21:45:58 2016 +0800
Refine the comment of dictRehashMilliseconds func
SLAVECONF->REPLCONF in comment - by andyli029
commit ee9869f
Author: clark.kang <charsyam@naver.com>
Date: Tue Mar 22 11:09:51 2016 +0900
fix typos
commit f7b3b11
Author: Harisankar H <harisankarh@gmail.com>
Date: Wed Mar 9 11:49:42 2016 +0530
Typo correction: "faield" --> "failed"
Typo correction: "faield" --> "failed"
commit 3fd40fc
Author: Itamar Haber <itamar@redislabs.com>
Date: Thu Feb 25 10:31:51 2016 +0200
Fixes a typo in comments
commit 621c160
Author: Prayag Verma <prayag.verma@gmail.com>
Date: Mon Feb 1 12:36:20 2016 +0530
Fix typo in Readme.md
Spelling mistakes -
`eviciton` > `eviction`
`familar` > `familiar`
commit d7d07d6
Author: WonCheol Lee <toctoc21c@gmail.com>
Date: Wed Dec 30 15:11:34 2015 +0900
Typo fixed
commit a4dade7
Author: Felix Bünemann <buenemann@louis.info>
Date: Mon Dec 28 11:02:55 2015 +0100
[ci skip] Improve supervised upstart config docs
This mentions that "expect stop" is required for supervised upstart
to work correctly. See http://upstart.ubuntu.com/cookbook/#expect-stop
for an explanation.
commit d9caba9
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:30:03 2015 +1100
README: Remove trailing whitespace
commit 72d42e5
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:32 2015 +1100
README: Fix typo. th => the
commit dd6e957
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:20 2015 +1100
README: Fix typo. familar => familiar
commit 3a12b23
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:28:54 2015 +1100
README: Fix typo. eviciton => eviction
commit 2d1d03b
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:21:45 2015 +1100
README: Fix typo. sever => server
commit 3973b06
Author: Itamar Haber <itamar@garantiadata.com>
Date: Sat Dec 19 17:01:20 2015 +0200
Typo fix
commit 4f2e460
Author: Steve Gao <fu@2token.com>
Date: Fri Dec 4 10:22:05 2015 +0800
Update README - fix typos
commit b21667c
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:48:37 2015 +0800
delete redundancy color judge in sdscatcolor
commit 88894c7
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:14:42 2015 +0800
the example output shoule be HelloWorld
commit 2763470
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 17:41:39 2015 +0800
modify error word keyevente
Signed-off-by: binyan <binbin.yan@nokia.com>
commit 0847b3d
Author: Bruno Martins <bscmartins@gmail.com>
Date: Wed Nov 4 11:37:01 2015 +0000
typo
commit bbb9e9e
Author: dawedawe <dawedawe@gmx.de>
Date: Fri Mar 27 00:46:41 2015 +0100
typo: zimap -> zipmap
commit 5ed297e
Author: Axel Advento <badwolf.bloodseeker.rev@gmail.com>
Date: Tue Mar 3 15:58:29 2015 +0800
Fix 'salve' typos to 'slave'
commit edec9d6
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Wed Jun 12 14:12:47 2019 +0200
Update README.md
Co-Authored-By: Qix <Qix-@users.noreply.github.com>
commit 692a7af
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Tue May 28 14:32:04 2019 +0200
grammar
commit d962b0a
Author: Nick Frost <nickfrostatx@gmail.com>
Date: Wed Jul 20 15:17:12 2016 -0700
Minor grammar fix
commit 24fff01aaccaf5956973ada8c50ceb1462e211c6 (typos)
Author: Chad Miller <chadm@squareup.com>
Date: Tue Sep 8 13:46:11 2020 -0400
Fix faulty comment about operation of unlink()
commit 3cd5c1f3326c52aa552ada7ec797c6bb16452355
Author: Kevin <kevin.xgr@gmail.com>
Date: Wed Nov 20 00:13:50 2019 +0800
Fix typo in server.c.
From a83af59 Mon Sep 17 00:00:00 2001
From: wuwo <wuwo@wacai.com>
Date: Fri, 17 Mar 2017 20:37:45 +0800
Subject: [PATCH] falure to failure
From c961896 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B7=A6=E6=87=B6?= <veficos@gmail.com>
Date: Sat, 27 May 2017 15:33:04 +0800
Subject: [PATCH] fix typo
From e600ef2 Mon Sep 17 00:00:00 2001
From: "rui.zou" <rui.zou@yunify.com>
Date: Sat, 30 Sep 2017 12:38:15 +0800
Subject: [PATCH] fix a typo
From c7d07fa Mon Sep 17 00:00:00 2001
From: Alexandre Perrin <alex@kaworu.ch>
Date: Thu, 16 Aug 2018 10:35:31 +0200
Subject: [PATCH] deps README.md typo
From b25cb67 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 10:55:37 +0300
Subject: [PATCH 1/2] fix typos in header
From ad28ca6 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 11:02:36 +0300
Subject: [PATCH 2/2] fix typos
commit 34924cdedd8552466fc22c1168d49236cb7ee915
Author: Adrian Lynch <adi_ady_ade@hotmail.com>
Date: Sat Apr 4 21:59:15 2015 +0100
Typos fixed
commit fd2a1e7
Author: Jan <jsteemann@users.noreply.github.com>
Date: Sat Oct 27 19:13:01 2018 +0200
Fix typos
Fix typos
commit e14e47c1a234b53b0e103c5f6a1c61481cbcbb02
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:30:07 2019 -0500
Fix multiple misspellings of "following"
commit 79b948ce2dac6b453fe80995abbcaac04c213d5a
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:24:28 2019 -0500
Fix misspelling of create-cluster
commit 1fffde52666dc99ab35efbd31071a4c008cb5a71
Author: Andy Lester <andy@petdance.com>
Date: Wed Jul 31 17:57:56 2019 -0500
Fix typos
commit 204c9ba9651e9e05fd73936b452b9a30be456cfe
Author: Xiaobo Zhu <xiaobo.zhu@shopee.com>
Date: Tue Aug 13 22:19:25 2019 +0800
fix typos
Squashed commit of the following:
commit 1d9aaf8
Author: danmedani <danmedani@gmail.com>
Date: Sun Aug 2 11:40:26 2015 -0700
README typo fix.
Squashed commit of the following:
commit 32bfa7c
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Jul 6 21:15:08 2015 +0200
Fixed grammer
Squashed commit of the following:
commit b24f69c
Author: Sisir Koppaka <sisir.koppaka@gmail.com>
Date: Mon Mar 2 22:38:45 2015 -0500
utils/hashtable/rehashing.c: Fix typos
Squashed commit of the following:
commit 4e04082
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Mar 23 08:22:21 2015 +0000
Small config file documentation improvements
Squashed commit of the following:
commit acb8773
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:52:48 2015 -0700
Typo and grammar fixes in readme
commit 2eb75b6
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:36:18 2015 -0700
fixed redis.conf comment
Squashed commit of the following:
commit a8249a2
Author: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Fri Dec 11 11:39:52 2015 +0530
Revise correction of typos.
Squashed commit of the following:
commit 3c02028
Author: zhaojun11 <zhaojun11@jd.com>
Date: Wed Jan 17 19:05:28 2018 +0800
Fix typos include two code typos in cluster.c and latency.c
Squashed commit of the following:
commit 9dba47c
Author: q191201771 <191201771@qq.com>
Date: Sat Jan 4 11:31:04 2020 +0800
fix function listCreate comment in adlist.c
Update src/server.c
commit 2c7c2cb536e78dd211b1ac6f7bda00f0f54faaeb
Author: charpty <charpty@gmail.com>
Date: Tue May 1 23:16:59 2018 +0800
server.c typo: modules system dictionary type comment
Signed-off-by: charpty <charpty@gmail.com>
commit a8395323fb63cb59cb3591cb0f0c8edb7c29a680
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun May 6 00:25:18 2018 +0300
Updates test_helper.tcl's help with undocumented options
Specifically:
* Host
* Port
* Client
commit bde6f9ced15755cd6407b4af7d601b030f36d60b
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 15:19:19 2018 +0800
fix comments in deps files
commit 3172474ba991532ab799ee1873439f3402412331
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 14:33:49 2018 +0800
fix some comments
commit 01b6f2b6858b5cf2ce4ad5092d2c746e755f53f0
Author: Thor Juhasz <thor@juhasz.pro>
Date: Sun Nov 18 14:37:41 2018 +0100
Minor fixes to comments
Found some parts a little unclear on a first read, which prompted me to have a better look at the file and fix some minor things I noticed.
Fixing minor typos and grammar. There are no changes to configuration options.
These changes are only meant to help the user better understand the explanations to the various configuration options
2020-09-10 13:43:38 +03:00
|
|
|
* |1111xxxx| - (with xxxx between 0001 and 1101) immediate 4 bit integer.
|
2012-04-24 16:54:07 +02:00
|
|
|
* Unsigned integer from 0 to 12. The encoded value is actually from
|
|
|
|
* 1 to 13 because 0000 and 1111 can not be used, so 1 should be
|
|
|
|
* subtracted from the encoded 4 bit value to obtain the right value.
|
2017-01-27 16:54:20 +01:00
|
|
|
* |11111111| - End of ziplist special entry.
|
|
|
|
*
|
|
|
|
* Like for the ziplist header, all the integers are represented in little
|
|
|
|
* endian byte order, even when this code is compiled in big endian systems.
|
|
|
|
*
|
|
|
|
* EXAMPLES OF ACTUAL ZIPLISTS
|
|
|
|
* ===========================
|
2012-04-24 12:51:59 +02:00
|
|
|
*
|
2017-01-27 16:54:20 +01:00
|
|
|
* The following is a ziplist containing the two elements representing
|
|
|
|
* the strings "2" and "5". It is composed of 15 bytes, that we visually
|
|
|
|
* split into sections:
|
|
|
|
*
|
|
|
|
* [0f 00 00 00] [0c 00 00 00] [02 00] [00 f3] [02 f6] [ff]
|
|
|
|
* | | | | | |
|
|
|
|
* zlbytes zltail entries "2" "5" end
|
|
|
|
*
|
|
|
|
* The first 4 bytes represent the number 15, that is the number of bytes
|
|
|
|
* the whole ziplist is composed of. The second 4 bytes are the offset
|
|
|
|
* at which the last ziplist entry is found, that is 12, in fact the
|
|
|
|
* last entry, that is "5", is at offset 12 inside the ziplist.
|
|
|
|
* The next 16 bit integer represents the number of elements inside the
|
|
|
|
* ziplist, its value is 2 since there are just two elements inside.
|
|
|
|
* Finally "00 f3" is the first entry representing the number 2. It is
|
|
|
|
* composed of the previous entry length, which is zero because this is
|
|
|
|
* our first entry, and the byte F3 which corresponds to the encoding
|
|
|
|
* |1111xxxx| with xxxx between 0001 and 1101. We need to remove the "F"
|
|
|
|
* higher order bits 1111, and subtract 1 from the "3", so the entry value
|
|
|
|
* is "2". The next entry has a prevlen of 02, since the first entry is
|
|
|
|
* composed of exactly two bytes. The entry itself, F6, is encoded exactly
|
|
|
|
* like the first entry, and 6-1 = 5, so the value of the entry is 5.
|
|
|
|
* Finally the special entry FF signals the end of the ziplist.
|
|
|
|
*
|
|
|
|
* Adding another element to the above string with the value "Hello World"
|
|
|
|
* allows us to show how the ziplist encodes small strings. We'll just show
|
|
|
|
* the hex dump of the entry itself. Imagine the bytes as following the
|
|
|
|
* entry that stores "5" in the ziplist above:
|
|
|
|
*
|
|
|
|
* [02] [0b] [48 65 6c 6c 6f 20 57 6f 72 6c 64]
|
|
|
|
*
|
|
|
|
* The first byte, 02, is the length of the previous entry. The next
|
|
|
|
* byte represents the encoding in the pattern |00pppppp| that means
|
|
|
|
* that the entry is a string of length <pppppp>, so 0B means that
|
|
|
|
* an 11 bytes string follows. From the third byte (48) to the last (64)
|
|
|
|
* there are just the ASCII characters for "Hello World".
|
2012-11-08 18:25:23 +01:00
|
|
|
*
|
|
|
|
* ----------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* Copyright (c) 2009-2012, Pieter Noordhuis <pcnoordhuis at gmail dot com>
|
2017-01-27 16:54:20 +01:00
|
|
|
* Copyright (c) 2009-2017, Salvatore Sanfilippo <antirez at gmail dot com>
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
* Copyright (c) 2020, Redis Labs, Inc
|
2012-11-08 18:25:23 +01:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
*
|
|
|
|
* * Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* * Neither the name of Redis nor the names of its contributors may be used
|
|
|
|
* to endorse or promote products derived from this software without
|
|
|
|
* specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
2010-05-21 12:54:01 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
2010-05-22 15:07:12 +02:00
|
|
|
#include <stdlib.h>
|
2010-05-21 12:54:01 +02:00
|
|
|
#include <string.h>
|
2010-06-01 18:55:37 +02:00
|
|
|
#include <stdint.h>
|
2010-05-22 15:07:12 +02:00
|
|
|
#include <limits.h>
|
2010-05-21 12:54:01 +02:00
|
|
|
#include "zmalloc.h"
|
2011-04-27 13:30:32 +02:00
|
|
|
#include "util.h"
|
2010-05-21 12:54:01 +02:00
|
|
|
#include "ziplist.h"
|
2020-09-08 15:51:20 +03:00
|
|
|
#include "config.h"
|
2012-02-14 16:11:46 +01:00
|
|
|
#include "endianconv.h"
|
2013-08-19 14:54:31 +02:00
|
|
|
#include "redisassert.h"
|
2010-05-21 12:54:01 +02:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
#define ZIP_END 255 /* Special "end of ziplist" entry. */
|
Squash merging 125 typo/grammar/comment/doc PRs (#7773)
List of squashed commits or PRs
===============================
commit 66801ea
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Jan 13 00:54:31 2020 -0500
typo fix in acl.c
commit 46f55db
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun Sep 6 18:24:11 2020 +0300
Updates a couple of comments
Specifically:
* RM_AutoMemory completed instead of pointing to docs
* Updated link to custom type doc
commit 61a2aa0
Author: xindoo <xindoo@qq.com>
Date: Tue Sep 1 19:24:59 2020 +0800
Correct errors in code comments
commit a5871d1
Author: yz1509 <pro-756@qq.com>
Date: Tue Sep 1 18:36:06 2020 +0800
fix typos in module.c
commit 41eede7
Author: bookug <bookug@qq.com>
Date: Sat Aug 15 01:11:33 2020 +0800
docs: fix typos in comments
commit c303c84
Author: lazy-snail <ws.niu@outlook.com>
Date: Fri Aug 7 11:15:44 2020 +0800
fix spelling in redis.conf
commit 1eb76bf
Author: zhujian <zhujianxyz@gmail.com>
Date: Thu Aug 6 15:22:10 2020 +0800
add a missing 'n' in comment
commit 1530ec2
Author: Daniel Dai <764122422@qq.com>
Date: Mon Jul 27 00:46:35 2020 -0400
fix spelling in tracking.c
commit e517b31
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:32 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit c300eff
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:23 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit 4c058a8
Author: 陈浩鹏 <chenhaopeng@heytea.com>
Date: Thu Jun 25 19:00:56 2020 +0800
Grammar fix and clarification
commit 5fcaa81
Author: bodong.ybd <bodong.ybd@alibaba-inc.com>
Date: Fri Jun 19 10:09:00 2020 +0800
Fix typos
commit 4caca9a
Author: Pruthvi P <pruthvi@ixigo.com>
Date: Fri May 22 00:33:22 2020 +0530
Fix typo eviciton => eviction
commit b2a25f6
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Sun May 17 12:39:59 2020 -0400
Fix a typo.
commit 12842ae
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun May 3 17:16:59 2020 -0400
fix spelling in redis conf
commit ddba07c
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Sat May 2 23:25:34 2020 +0100
Correct a "conflicts" spelling error.
commit 8fc7bf2
Author: Nao YONASHIRO <yonashiro@r.recruit.co.jp>
Date: Thu Apr 30 10:25:27 2020 +0900
docs: fix EXPIRE_FAST_CYCLE_DURATION to ACTIVE_EXPIRE_CYCLE_FAST_DURATION
commit 9b2b67a
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Fri Apr 24 11:46:22 2020 -0400
Fix a typo.
commit 0746f10
Author: devilinrust <63737265+devilinrust@users.noreply.github.com>
Date: Thu Apr 16 00:17:53 2020 +0200
Fix typos in server.c
commit 92b588d
Author: benjessop12 <56115861+benjessop12@users.noreply.github.com>
Date: Mon Apr 13 13:43:55 2020 +0100
Fix spelling mistake in lazyfree.c
commit 1da37aa
Merge: 2d4ba28 af347a8
Author: hwware <wen.hui.ware@gmail.com>
Date: Thu Mar 5 22:41:31 2020 -0500
Merge remote-tracking branch 'upstream/unstable' into expiretypofix
commit 2d4ba28
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Mar 2 00:09:40 2020 -0500
fix typo in expire.c
commit 1a746f7
Author: SennoYuki <minakami1yuki@gmail.com>
Date: Thu Feb 27 16:54:32 2020 +0800
fix typo
commit 8599b1a
Author: dongheejeong <donghee950403@gmail.com>
Date: Sun Feb 16 20:31:43 2020 +0000
Fix typo in server.c
commit f38d4e8
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun Feb 2 22:58:38 2020 -0500
fix typo in evict.c
commit fe143fc
Author: Leo Murillo <leonardo.murillo@gmail.com>
Date: Sun Feb 2 01:57:22 2020 -0600
Fix a few typos in redis.conf
commit 1ab4d21
Author: viraja1 <anchan.viraj@gmail.com>
Date: Fri Dec 27 17:15:58 2019 +0530
Fix typo in Latency API docstring
commit ca1f70e
Author: gosth <danxuedexing@qq.com>
Date: Wed Dec 18 15:18:02 2019 +0800
fix typo in sort.c
commit a57c06b
Author: ZYunH <zyunhjob@163.com>
Date: Mon Dec 16 22:28:46 2019 +0800
fix-zset-typo
commit b8c92b5
Author: git-hulk <hulk.website@gmail.com>
Date: Mon Dec 16 15:51:42 2019 +0800
FIX: typo in cluster.c, onformation->information
commit 9dd981c
Author: wujm2007 <jim.wujm@gmail.com>
Date: Mon Dec 16 09:37:52 2019 +0800
Fix typo
commit e132d7a
Author: Sebastien Williams-Wynn <s.williamswynn.mail@gmail.com>
Date: Fri Nov 15 00:14:07 2019 +0000
Minor typo change
commit 47f44d5
Author: happynote3966 <01ssrmikururudevice01@gmail.com>
Date: Mon Nov 11 22:08:48 2019 +0900
fix comment typo in redis-cli.c
commit b8bdb0d
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 18:00:17 2019 +0800
Fix a spelling mistake of comments in defragDictBucketCallback
commit 0def46a
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 13:09:27 2019 +0800
fix some spelling mistakes of comments in defrag.c
commit f3596fd
Author: Phil Rajchgot <tophil@outlook.com>
Date: Sun Oct 13 02:02:32 2019 -0400
Typo and grammar fixes
Redis and its documentation are great -- just wanted to submit a few corrections in the spirit of Hacktoberfest. Thanks for all your work on this project. I use it all the time and it works beautifully.
commit 2b928cd
Author: KangZhiDong <worldkzd@gmail.com>
Date: Sun Sep 1 07:03:11 2019 +0800
fix typos
commit 33aea14
Author: Axlgrep <axlgrep@gmail.com>
Date: Tue Aug 27 11:02:18 2019 +0800
Fixed eviction spelling issues
commit e282a80
Author: Simen Flatby <simen@oms.no>
Date: Tue Aug 20 15:25:51 2019 +0200
Update comments to reflect prop name
In the comments the prop is referenced as replica-validity-factor,
but it is really named cluster-replica-validity-factor.
commit 74d1f9a
Author: Jim Green <jimgreen2013@qq.com>
Date: Tue Aug 20 20:00:31 2019 +0800
fix comment error, the code is ok
commit eea1407
Author: Liao Tonglang <liaotonglang@gmail.com>
Date: Fri May 31 10:16:18 2019 +0800
typo fix
fix cna't to can't
commit 0da553c
Author: KAWACHI Takashi <tkawachi@gmail.com>
Date: Wed Jul 17 00:38:16 2019 +0900
Fix typo
commit 7fc8fb6
Author: Michael Prokop <mika@grml.org>
Date: Tue May 28 17:58:42 2019 +0200
Typo fixes
s/familar/familiar/
s/compatiblity/compatibility/
s/ ot / to /
s/itsef/itself/
commit 5f46c9d
Author: zhumoing <34539422+zhumoing@users.noreply.github.com>
Date: Tue May 21 21:16:50 2019 +0800
typo-fixes
typo-fixes
commit 321dfe1
Author: wxisme <850885154@qq.com>
Date: Sat Mar 16 15:10:55 2019 +0800
typo fix
commit b4fb131
Merge: 267e0e6 3df1eb8
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Fri Feb 8 22:55:45 2019 +0200
Merge branch 'unstable' of antirez/redis into unstable
commit 267e0e6
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Wed Jan 30 21:26:04 2019 +0200
Minor typo fix
commit 30544e7
Author: inshal96 <39904558+inshal96@users.noreply.github.com>
Date: Fri Jan 4 16:54:50 2019 +0500
remove an extra 'a' in the comments
commit 337969d
Author: BrotherGao <yangdongheng11@gmail.com>
Date: Sat Dec 29 12:37:29 2018 +0800
fix typo in redis.conf
commit 9f4b121
Merge: 423a030 e504583
Author: BrotherGao <yangdongheng@xiaomi.com>
Date: Sat Dec 29 11:41:12 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 423a030
Merge: 42b02b7 46a51cd
Author: 杨东衡 <yangdongheng@xiaomi.com>
Date: Tue Dec 4 23:56:11 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 42b02b7
Merge: 68c0e6e b8febe6
Author: Dongheng Yang <yangdongheng11@gmail.com>
Date: Sun Oct 28 15:54:23 2018 +0800
Merge pull request #1 from antirez/unstable
update local data
commit 714b589
Author: Christian <crifei93@gmail.com>
Date: Fri Dec 28 01:17:26 2018 +0100
fix typo "resulution"
commit e23259d
Author: garenchan <1412950785@qq.com>
Date: Wed Dec 26 09:58:35 2018 +0800
fix typo: segfauls -> segfault
commit a9359f8
Author: xjp <jianping_xie@aliyun.com>
Date: Tue Dec 18 17:31:44 2018 +0800
Fixed REDISMODULE_H spell bug
commit a12c3e4
Author: jdiaz <jrd.palacios@gmail.com>
Date: Sat Dec 15 23:39:52 2018 -0600
Fixes hyperloglog hash function comment block description
commit 770eb11
Author: 林上耀 <1210tom@163.com>
Date: Sun Nov 25 17:16:10 2018 +0800
fix typo
commit fd97fbb
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Fri Nov 23 17:14:01 2018 +0100
Correct "unsupported" typo.
commit a85522d
Author: Jungnam Lee <jungnam.lee@oracle.com>
Date: Thu Nov 8 23:01:29 2018 +0900
fix typo in test comments
commit ade8007
Author: Arun Kumar <palerdot@users.noreply.github.com>
Date: Tue Oct 23 16:56:35 2018 +0530
Fixed grammatical typo
Fixed typo for word 'dictionary'
commit 869ee39
Author: Hamid Alaei <hamid.a85@gmail.com>
Date: Sun Aug 12 16:40:02 2018 +0430
fix documentations: (ThreadSafeContextStart/Stop -> ThreadSafeContextLock/Unlock), minor typo
commit f89d158
Author: Mayank Jain <mayankjain255@gmail.com>
Date: Tue Jul 31 23:01:21 2018 +0530
Updated README.md with some spelling corrections.
Made correction in spelling of some misspelled words.
commit 892198e
Author: dsomeshwar <someshwar.dhayalan@gmail.com>
Date: Sat Jul 21 23:23:04 2018 +0530
typo fix
commit 8a4d780
Author: Itamar Haber <itamar@redislabs.com>
Date: Mon Apr 30 02:06:52 2018 +0300
Fixes some typos
commit e3acef6
Author: Noah Rosamilia <ivoahivoah@gmail.com>
Date: Sat Mar 3 23:41:21 2018 -0500
Fix typo in /deps/README.md
commit 04442fb
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:32:42 2018 +0800
Fix typo in readSyncBulkPayload() comment.
commit 9f36880
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:20:37 2018 +0800
replication.c comment: run_id -> replid.
commit f866b4a
Author: Francesco 'makevoid' Canessa <makevoid@gmail.com>
Date: Thu Feb 22 22:01:56 2018 +0000
fix comment typo in server.c
commit 0ebc69b
Author: 줍 <jubee0124@gmail.com>
Date: Mon Feb 12 16:38:48 2018 +0900
Fix typo in redis.conf
Fix `five behaviors` to `eight behaviors` in [this sentence ](antirez/redis@unstable/redis.conf#L564)
commit b50a620
Author: martinbroadhurst <martinbroadhurst@users.noreply.github.com>
Date: Thu Dec 28 12:07:30 2017 +0000
Fix typo in valgrind.sup
commit 7d8f349
Author: Peter Boughton <peter@sorcerersisle.com>
Date: Mon Nov 27 19:52:19 2017 +0000
Update CONTRIBUTING; refer doc updates to redis-doc repo.
commit 02dec7e
Author: Klauswk <klauswk1@hotmail.com>
Date: Tue Oct 24 16:18:38 2017 -0200
Fix typo in comment
commit e1efbc8
Author: chenshi <baiwfg2@gmail.com>
Date: Tue Oct 3 18:26:30 2017 +0800
Correct two spelling errors of comments
commit 93327d8
Author: spacewander <spacewanderlzx@gmail.com>
Date: Wed Sep 13 16:47:24 2017 +0800
Update the comment for OBJ_ENCODING_EMBSTR_SIZE_LIMIT's value
The value of OBJ_ENCODING_EMBSTR_SIZE_LIMIT is 44 now instead of 39.
commit 63d361f
Author: spacewander <spacewanderlzx@gmail.com>
Date: Tue Sep 12 15:06:42 2017 +0800
Fix <prevlen> related doc in ziplist.c
According to the definition of ZIP_BIG_PREVLEN and other related code,
the guard of single byte <prevlen> should be 254 instead of 255.
commit ebe228d
Author: hanael80 <hanael80@gmail.com>
Date: Tue Aug 15 09:09:40 2017 +0900
Fix typo
commit 6b696e6
Author: Matt Robenolt <matt@ydekproductions.com>
Date: Mon Aug 14 14:50:47 2017 -0700
Fix typo in LATENCY DOCTOR output
commit a2ec6ae
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 15 14:15:16 2017 +0800
Fix a typo: form => from
commit 3ab7699
Author: caosiyang <caosiyang@qiyi.com>
Date: Thu Aug 10 18:40:33 2017 +0800
Fix a typo: replicationFeedSlavesFromMaster() => replicationFeedSlavesFromMasterStream()
commit 72d43ef
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 8 15:57:25 2017 +0800
fix a typo: servewr => server
commit 707c958
Author: Bo Cai <charpty@gmail.com>
Date: Wed Jul 26 21:49:42 2017 +0800
redis-cli.c typo: conut -> count.
Signed-off-by: Bo Cai <charpty@gmail.com>
commit b9385b2
Author: JackDrogon <jack.xsuperman@gmail.com>
Date: Fri Jun 30 14:22:31 2017 +0800
Fix some spell problems
commit 20d9230
Author: akosel <aaronjkosel@gmail.com>
Date: Sun Jun 4 19:35:13 2017 -0500
Fix typo
commit b167bfc
Author: Krzysiek Witkowicz <krzysiekwitkowicz@gmail.com>
Date: Mon May 22 21:32:27 2017 +0100
Fix #4008 small typo in comment
commit 2b78ac8
Author: Jake Clarkson <jacobwclarkson@gmail.com>
Date: Wed Apr 26 15:49:50 2017 +0100
Correct typo in tests/unit/hyperloglog.tcl
commit b0f1cdb
Author: Qi Luo <qiluo-msft@users.noreply.github.com>
Date: Wed Apr 19 14:25:18 2017 -0700
Fix typo
commit a90b0f9
Author: charsyam <charsyam@naver.com>
Date: Thu Mar 16 18:19:53 2017 +0900
fix typos
fix typos
fix typos
commit 8430a79
Author: Richard Hart <richardhart92@gmail.com>
Date: Mon Mar 13 22:17:41 2017 -0400
Fixed log message typo in listenToPort.
commit 481a1c2
Author: Vinod Kumar <kumar003vinod@gmail.com>
Date: Sun Jan 15 23:04:51 2017 +0530
src/db.c: Correct "save" -> "safe" typo
commit 586b4d3
Author: wangshaonan <wshn13@gmail.com>
Date: Wed Dec 21 20:28:27 2016 +0800
Fix typo they->the in helloworld.c
commit c1c4b5e
Author: Jenner <hypxm@qq.com>
Date: Mon Dec 19 16:39:46 2016 +0800
typo error
commit 1ee1a3f
Author: tielei <43289893@qq.com>
Date: Mon Jul 18 13:52:25 2016 +0800
fix some comments
commit 11a41fb
Author: Otto Kekäläinen <otto@seravo.fi>
Date: Sun Jul 3 10:23:55 2016 +0100
Fix spelling in documentation and comments
commit 5fb5d82
Author: francischan <f1ancis621@gmail.com>
Date: Tue Jun 28 00:19:33 2016 +0800
Fix outdated comments about redis.c file.
It should now refer to server.c file.
commit 6b254bc
Author: lmatt-bit <lmatt123n@gmail.com>
Date: Thu Apr 21 21:45:58 2016 +0800
Refine the comment of dictRehashMilliseconds func
SLAVECONF->REPLCONF in comment - by andyli029
commit ee9869f
Author: clark.kang <charsyam@naver.com>
Date: Tue Mar 22 11:09:51 2016 +0900
fix typos
commit f7b3b11
Author: Harisankar H <harisankarh@gmail.com>
Date: Wed Mar 9 11:49:42 2016 +0530
Typo correction: "faield" --> "failed"
Typo correction: "faield" --> "failed"
commit 3fd40fc
Author: Itamar Haber <itamar@redislabs.com>
Date: Thu Feb 25 10:31:51 2016 +0200
Fixes a typo in comments
commit 621c160
Author: Prayag Verma <prayag.verma@gmail.com>
Date: Mon Feb 1 12:36:20 2016 +0530
Fix typo in Readme.md
Spelling mistakes -
`eviciton` > `eviction`
`familar` > `familiar`
commit d7d07d6
Author: WonCheol Lee <toctoc21c@gmail.com>
Date: Wed Dec 30 15:11:34 2015 +0900
Typo fixed
commit a4dade7
Author: Felix Bünemann <buenemann@louis.info>
Date: Mon Dec 28 11:02:55 2015 +0100
[ci skip] Improve supervised upstart config docs
This mentions that "expect stop" is required for supervised upstart
to work correctly. See http://upstart.ubuntu.com/cookbook/#expect-stop
for an explanation.
commit d9caba9
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:30:03 2015 +1100
README: Remove trailing whitespace
commit 72d42e5
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:32 2015 +1100
README: Fix typo. th => the
commit dd6e957
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:20 2015 +1100
README: Fix typo. familar => familiar
commit 3a12b23
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:28:54 2015 +1100
README: Fix typo. eviciton => eviction
commit 2d1d03b
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:21:45 2015 +1100
README: Fix typo. sever => server
commit 3973b06
Author: Itamar Haber <itamar@garantiadata.com>
Date: Sat Dec 19 17:01:20 2015 +0200
Typo fix
commit 4f2e460
Author: Steve Gao <fu@2token.com>
Date: Fri Dec 4 10:22:05 2015 +0800
Update README - fix typos
commit b21667c
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:48:37 2015 +0800
delete redundancy color judge in sdscatcolor
commit 88894c7
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:14:42 2015 +0800
the example output shoule be HelloWorld
commit 2763470
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 17:41:39 2015 +0800
modify error word keyevente
Signed-off-by: binyan <binbin.yan@nokia.com>
commit 0847b3d
Author: Bruno Martins <bscmartins@gmail.com>
Date: Wed Nov 4 11:37:01 2015 +0000
typo
commit bbb9e9e
Author: dawedawe <dawedawe@gmx.de>
Date: Fri Mar 27 00:46:41 2015 +0100
typo: zimap -> zipmap
commit 5ed297e
Author: Axel Advento <badwolf.bloodseeker.rev@gmail.com>
Date: Tue Mar 3 15:58:29 2015 +0800
Fix 'salve' typos to 'slave'
commit edec9d6
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Wed Jun 12 14:12:47 2019 +0200
Update README.md
Co-Authored-By: Qix <Qix-@users.noreply.github.com>
commit 692a7af
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Tue May 28 14:32:04 2019 +0200
grammar
commit d962b0a
Author: Nick Frost <nickfrostatx@gmail.com>
Date: Wed Jul 20 15:17:12 2016 -0700
Minor grammar fix
commit 24fff01aaccaf5956973ada8c50ceb1462e211c6 (typos)
Author: Chad Miller <chadm@squareup.com>
Date: Tue Sep 8 13:46:11 2020 -0400
Fix faulty comment about operation of unlink()
commit 3cd5c1f3326c52aa552ada7ec797c6bb16452355
Author: Kevin <kevin.xgr@gmail.com>
Date: Wed Nov 20 00:13:50 2019 +0800
Fix typo in server.c.
From a83af59 Mon Sep 17 00:00:00 2001
From: wuwo <wuwo@wacai.com>
Date: Fri, 17 Mar 2017 20:37:45 +0800
Subject: [PATCH] falure to failure
From c961896 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B7=A6=E6=87=B6?= <veficos@gmail.com>
Date: Sat, 27 May 2017 15:33:04 +0800
Subject: [PATCH] fix typo
From e600ef2 Mon Sep 17 00:00:00 2001
From: "rui.zou" <rui.zou@yunify.com>
Date: Sat, 30 Sep 2017 12:38:15 +0800
Subject: [PATCH] fix a typo
From c7d07fa Mon Sep 17 00:00:00 2001
From: Alexandre Perrin <alex@kaworu.ch>
Date: Thu, 16 Aug 2018 10:35:31 +0200
Subject: [PATCH] deps README.md typo
From b25cb67 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 10:55:37 +0300
Subject: [PATCH 1/2] fix typos in header
From ad28ca6 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 11:02:36 +0300
Subject: [PATCH 2/2] fix typos
commit 34924cdedd8552466fc22c1168d49236cb7ee915
Author: Adrian Lynch <adi_ady_ade@hotmail.com>
Date: Sat Apr 4 21:59:15 2015 +0100
Typos fixed
commit fd2a1e7
Author: Jan <jsteemann@users.noreply.github.com>
Date: Sat Oct 27 19:13:01 2018 +0200
Fix typos
Fix typos
commit e14e47c1a234b53b0e103c5f6a1c61481cbcbb02
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:30:07 2019 -0500
Fix multiple misspellings of "following"
commit 79b948ce2dac6b453fe80995abbcaac04c213d5a
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:24:28 2019 -0500
Fix misspelling of create-cluster
commit 1fffde52666dc99ab35efbd31071a4c008cb5a71
Author: Andy Lester <andy@petdance.com>
Date: Wed Jul 31 17:57:56 2019 -0500
Fix typos
commit 204c9ba9651e9e05fd73936b452b9a30be456cfe
Author: Xiaobo Zhu <xiaobo.zhu@shopee.com>
Date: Tue Aug 13 22:19:25 2019 +0800
fix typos
Squashed commit of the following:
commit 1d9aaf8
Author: danmedani <danmedani@gmail.com>
Date: Sun Aug 2 11:40:26 2015 -0700
README typo fix.
Squashed commit of the following:
commit 32bfa7c
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Jul 6 21:15:08 2015 +0200
Fixed grammer
Squashed commit of the following:
commit b24f69c
Author: Sisir Koppaka <sisir.koppaka@gmail.com>
Date: Mon Mar 2 22:38:45 2015 -0500
utils/hashtable/rehashing.c: Fix typos
Squashed commit of the following:
commit 4e04082
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Mar 23 08:22:21 2015 +0000
Small config file documentation improvements
Squashed commit of the following:
commit acb8773
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:52:48 2015 -0700
Typo and grammar fixes in readme
commit 2eb75b6
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:36:18 2015 -0700
fixed redis.conf comment
Squashed commit of the following:
commit a8249a2
Author: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Fri Dec 11 11:39:52 2015 +0530
Revise correction of typos.
Squashed commit of the following:
commit 3c02028
Author: zhaojun11 <zhaojun11@jd.com>
Date: Wed Jan 17 19:05:28 2018 +0800
Fix typos include two code typos in cluster.c and latency.c
Squashed commit of the following:
commit 9dba47c
Author: q191201771 <191201771@qq.com>
Date: Sat Jan 4 11:31:04 2020 +0800
fix function listCreate comment in adlist.c
Update src/server.c
commit 2c7c2cb536e78dd211b1ac6f7bda00f0f54faaeb
Author: charpty <charpty@gmail.com>
Date: Tue May 1 23:16:59 2018 +0800
server.c typo: modules system dictionary type comment
Signed-off-by: charpty <charpty@gmail.com>
commit a8395323fb63cb59cb3591cb0f0c8edb7c29a680
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun May 6 00:25:18 2018 +0300
Updates test_helper.tcl's help with undocumented options
Specifically:
* Host
* Port
* Client
commit bde6f9ced15755cd6407b4af7d601b030f36d60b
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 15:19:19 2018 +0800
fix comments in deps files
commit 3172474ba991532ab799ee1873439f3402412331
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 14:33:49 2018 +0800
fix some comments
commit 01b6f2b6858b5cf2ce4ad5092d2c746e755f53f0
Author: Thor Juhasz <thor@juhasz.pro>
Date: Sun Nov 18 14:37:41 2018 +0100
Minor fixes to comments
Found some parts a little unclear on a first read, which prompted me to have a better look at the file and fix some minor things I noticed.
Fixing minor typos and grammar. There are no changes to configuration options.
These changes are only meant to help the user better understand the explanations to the various configuration options
2020-09-10 13:43:38 +03:00
|
|
|
#define ZIP_BIG_PREVLEN 254 /* ZIP_BIG_PREVLEN - 1 is the max number of bytes of
|
|
|
|
the previous entry, for the "prevlen" field prefixing
|
|
|
|
each entry, to be represented with just a single byte.
|
|
|
|
Otherwise it is represented as FE AA BB CC DD, where
|
2017-01-27 16:54:20 +01:00
|
|
|
AA BB CC DD are a 4 bytes unsigned integer
|
|
|
|
representing the previous entry len. */
|
2010-05-22 15:18:30 +02:00
|
|
|
|
2010-08-13 19:28:49 +02:00
|
|
|
/* Different encoding/length possibilities */
|
2012-04-24 16:54:07 +02:00
|
|
|
#define ZIP_STR_MASK 0xc0
|
|
|
|
#define ZIP_INT_MASK 0x30
|
2010-08-13 19:28:49 +02:00
|
|
|
#define ZIP_STR_06B (0 << 6)
|
|
|
|
#define ZIP_STR_14B (1 << 6)
|
|
|
|
#define ZIP_STR_32B (2 << 6)
|
|
|
|
#define ZIP_INT_16B (0xc0 | 0<<4)
|
|
|
|
#define ZIP_INT_32B (0xc0 | 1<<4)
|
|
|
|
#define ZIP_INT_64B (0xc0 | 2<<4)
|
2012-04-20 10:38:42 -04:00
|
|
|
#define ZIP_INT_24B (0xc0 | 3<<4)
|
2012-04-24 16:54:07 +02:00
|
|
|
#define ZIP_INT_8B 0xfe
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* 4 bit integer immediate encoding |1111xxxx| with xxxx between
|
|
|
|
* 0001 and 1101. */
|
|
|
|
#define ZIP_INT_IMM_MASK 0x0f /* Mask to extract the 4 bits value. To add
|
|
|
|
one is needed to reconstruct the value. */
|
2012-04-24 16:54:07 +02:00
|
|
|
#define ZIP_INT_IMM_MIN 0xf1 /* 11110001 */
|
|
|
|
#define ZIP_INT_IMM_MAX 0xfd /* 11111101 */
|
2012-04-20 10:38:42 -04:00
|
|
|
|
|
|
|
#define INT24_MAX 0x7fffff
|
|
|
|
#define INT24_MIN (-INT24_MAX - 1)
|
2010-05-22 15:18:30 +02:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Macro to determine if the entry is a string. String entries never start
|
|
|
|
* with "11" as most significant bits of the first byte. */
|
2012-01-03 15:48:55 -08:00
|
|
|
#define ZIP_IS_STR(enc) (((enc) & ZIP_STR_MASK) < ZIP_STR_MASK)
|
2010-05-22 15:18:30 +02:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Utility macros.*/
|
|
|
|
|
|
|
|
/* Return total bytes a ziplist is composed of. */
|
2010-06-01 18:55:37 +02:00
|
|
|
#define ZIPLIST_BYTES(zl) (*((uint32_t*)(zl)))
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Return the offset of the last item inside the ziplist. */
|
2010-06-01 18:55:37 +02:00
|
|
|
#define ZIPLIST_TAIL_OFFSET(zl) (*((uint32_t*)((zl)+sizeof(uint32_t))))
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Return the length of a ziplist, or UINT16_MAX if the length cannot be
|
|
|
|
* determined without scanning the whole ziplist. */
|
2010-06-01 18:55:37 +02:00
|
|
|
#define ZIPLIST_LENGTH(zl) (*((uint16_t*)((zl)+sizeof(uint32_t)*2)))
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* The size of a ziplist header: two 32 bit integers for the total
|
|
|
|
* bytes count and last item offset. One 16 bit integer for the number
|
|
|
|
* of items field. */
|
2010-06-01 18:55:37 +02:00
|
|
|
#define ZIPLIST_HEADER_SIZE (sizeof(uint32_t)*2+sizeof(uint16_t))
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Size of the "end of ziplist" entry. Just one byte. */
|
2014-11-21 14:52:10 -05:00
|
|
|
#define ZIPLIST_END_SIZE (sizeof(uint8_t))
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Return the pointer to the first entry of a ziplist. */
|
2010-06-01 18:55:37 +02:00
|
|
|
#define ZIPLIST_ENTRY_HEAD(zl) ((zl)+ZIPLIST_HEADER_SIZE)
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Return the pointer to the last entry of a ziplist, using the
|
|
|
|
* last entry offset inside the ziplist header. */
|
2012-02-08 23:20:39 +01:00
|
|
|
#define ZIPLIST_ENTRY_TAIL(zl) ((zl)+intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl)))
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Return the pointer to the last byte of a ziplist, which is, the
|
|
|
|
* end of ziplist FF entry. */
|
2012-02-08 23:20:39 +01:00
|
|
|
#define ZIPLIST_ENTRY_END(zl) ((zl)+intrev32ifbe(ZIPLIST_BYTES(zl))-1)
|
2010-06-01 18:55:37 +02:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Increment the number of items field in the ziplist header. Note that this
|
2018-06-07 14:36:56 +02:00
|
|
|
* macro should never overflow the unsigned 16 bit integer, since entries are
|
2017-01-27 16:54:20 +01:00
|
|
|
* always pushed one at a time. When UINT16_MAX is reached we want the count
|
|
|
|
* to stay there to signal that a full scan is needed to get the number of
|
|
|
|
* items inside the ziplist. */
|
2010-05-22 14:58:58 +02:00
|
|
|
#define ZIPLIST_INCR_LENGTH(zl,incr) { \
|
2012-02-08 22:59:35 +01:00
|
|
|
if (ZIPLIST_LENGTH(zl) < UINT16_MAX) \
|
2012-02-09 16:28:35 +01:00
|
|
|
ZIPLIST_LENGTH(zl) = intrev16ifbe(intrev16ifbe(ZIPLIST_LENGTH(zl))+incr); \
|
2012-02-08 22:59:35 +01:00
|
|
|
}
|
2010-05-21 12:54:01 +02:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* We use this function to receive information about a ziplist entry.
|
|
|
|
* Note that this is not how the data is actually encoded, is just what we
|
|
|
|
* get filled by a function in order to operate more easily. */
|
2010-05-29 16:20:01 +02:00
|
|
|
typedef struct zlentry {
|
2018-07-01 13:24:50 +08:00
|
|
|
unsigned int prevrawlensize; /* Bytes used to encode the previous entry len*/
|
2017-01-27 16:54:20 +01:00
|
|
|
unsigned int prevrawlen; /* Previous entry len. */
|
|
|
|
unsigned int lensize; /* Bytes used to encode this entry type/len.
|
|
|
|
For example strings have a 1, 2 or 5 bytes
|
|
|
|
header. Integers always use a single byte.*/
|
|
|
|
unsigned int len; /* Bytes used to represent the actual entry.
|
|
|
|
For strings this is just the string length
|
|
|
|
while for integers it is 1, 2, 3, 4, 8 or
|
|
|
|
0 (for 4 bit immediate) depending on the
|
|
|
|
number range. */
|
|
|
|
unsigned int headersize; /* prevrawlensize + lensize. */
|
|
|
|
unsigned char encoding; /* Set to ZIP_STR_* or ZIP_INT_* depending on
|
|
|
|
the entry encoding. However for 4 bits
|
|
|
|
immediate integers this can assume a range
|
|
|
|
of values and must be range-checked. */
|
|
|
|
unsigned char *p; /* Pointer to the very start of the entry, that
|
|
|
|
is, this points to prev-entry-len field. */
|
2010-05-29 16:20:01 +02:00
|
|
|
} zlentry;
|
|
|
|
|
2014-11-13 16:21:27 -05:00
|
|
|
#define ZIPLIST_ENTRY_ZERO(zle) { \
|
|
|
|
(zle)->prevrawlensize = (zle)->prevrawlen = 0; \
|
|
|
|
(zle)->lensize = (zle)->len = (zle)->headersize = 0; \
|
|
|
|
(zle)->encoding = 0; \
|
|
|
|
(zle)->p = NULL; \
|
|
|
|
}
|
|
|
|
|
2012-04-24 16:54:07 +02:00
|
|
|
/* Extract the encoding from the byte pointed by 'ptr' and set it into
|
2017-01-27 16:54:20 +01:00
|
|
|
* 'encoding' field of the zlentry structure. */
|
2012-04-24 16:54:07 +02:00
|
|
|
#define ZIP_ENTRY_ENCODING(ptr, encoding) do { \
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
(encoding) = ((ptr)[0]); \
|
2012-04-24 16:54:07 +02:00
|
|
|
if ((encoding) < ZIP_STR_MASK) (encoding) &= ZIP_STR_MASK; \
|
2012-01-03 15:48:55 -08:00
|
|
|
} while(0)
|
2010-08-13 19:28:49 +02:00
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
#define ZIP_ENCODING_SIZE_INVALID 0xff
|
|
|
|
/* Return the number of bytes required to encode the entry type + length.
|
|
|
|
* On error, return ZIP_ENCODING_SIZE_INVALID */
|
|
|
|
static inline unsigned int zipEncodingLenSize(unsigned char encoding) {
|
|
|
|
if (encoding == ZIP_INT_16B || encoding == ZIP_INT_32B ||
|
|
|
|
encoding == ZIP_INT_24B || encoding == ZIP_INT_64B ||
|
|
|
|
encoding == ZIP_INT_8B)
|
|
|
|
return 1;
|
|
|
|
if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX)
|
|
|
|
return 1;
|
|
|
|
if (encoding == ZIP_STR_06B)
|
|
|
|
return 1;
|
|
|
|
if (encoding == ZIP_STR_14B)
|
|
|
|
return 2;
|
|
|
|
if (encoding == ZIP_STR_32B)
|
|
|
|
return 5;
|
|
|
|
return ZIP_ENCODING_SIZE_INVALID;
|
|
|
|
}
|
|
|
|
|
2020-09-08 15:51:20 +03:00
|
|
|
#define ZIP_ASSERT_ENCODING(encoding) do { \
|
|
|
|
assert(zipEncodingLenSize(encoding) != ZIP_ENCODING_SIZE_INVALID); \
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
} while (0)
|
|
|
|
|
2020-09-08 15:51:20 +03:00
|
|
|
/* Return bytes needed to store integer encoded by 'encoding' */
|
|
|
|
static inline unsigned int zipIntSize(unsigned char encoding) {
|
2010-08-13 19:28:49 +02:00
|
|
|
switch(encoding) {
|
2012-04-24 16:54:07 +02:00
|
|
|
case ZIP_INT_8B: return 1;
|
|
|
|
case ZIP_INT_16B: return 2;
|
|
|
|
case ZIP_INT_24B: return 3;
|
|
|
|
case ZIP_INT_32B: return 4;
|
|
|
|
case ZIP_INT_64B: return 8;
|
2010-05-22 15:18:30 +02:00
|
|
|
}
|
2017-01-27 16:54:20 +01:00
|
|
|
if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX)
|
|
|
|
return 0; /* 4 bit immediate */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* bad encoding, covered by a previous call to ZIP_ASSERT_ENCODING */
|
2020-09-08 15:51:20 +03:00
|
|
|
redis_unreachable();
|
2010-12-23 11:25:56 +00:00
|
|
|
return 0;
|
2010-05-22 15:18:30 +02:00
|
|
|
}
|
|
|
|
|
Squash merging 125 typo/grammar/comment/doc PRs (#7773)
List of squashed commits or PRs
===============================
commit 66801ea
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Jan 13 00:54:31 2020 -0500
typo fix in acl.c
commit 46f55db
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun Sep 6 18:24:11 2020 +0300
Updates a couple of comments
Specifically:
* RM_AutoMemory completed instead of pointing to docs
* Updated link to custom type doc
commit 61a2aa0
Author: xindoo <xindoo@qq.com>
Date: Tue Sep 1 19:24:59 2020 +0800
Correct errors in code comments
commit a5871d1
Author: yz1509 <pro-756@qq.com>
Date: Tue Sep 1 18:36:06 2020 +0800
fix typos in module.c
commit 41eede7
Author: bookug <bookug@qq.com>
Date: Sat Aug 15 01:11:33 2020 +0800
docs: fix typos in comments
commit c303c84
Author: lazy-snail <ws.niu@outlook.com>
Date: Fri Aug 7 11:15:44 2020 +0800
fix spelling in redis.conf
commit 1eb76bf
Author: zhujian <zhujianxyz@gmail.com>
Date: Thu Aug 6 15:22:10 2020 +0800
add a missing 'n' in comment
commit 1530ec2
Author: Daniel Dai <764122422@qq.com>
Date: Mon Jul 27 00:46:35 2020 -0400
fix spelling in tracking.c
commit e517b31
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:32 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit c300eff
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:23 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit 4c058a8
Author: 陈浩鹏 <chenhaopeng@heytea.com>
Date: Thu Jun 25 19:00:56 2020 +0800
Grammar fix and clarification
commit 5fcaa81
Author: bodong.ybd <bodong.ybd@alibaba-inc.com>
Date: Fri Jun 19 10:09:00 2020 +0800
Fix typos
commit 4caca9a
Author: Pruthvi P <pruthvi@ixigo.com>
Date: Fri May 22 00:33:22 2020 +0530
Fix typo eviciton => eviction
commit b2a25f6
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Sun May 17 12:39:59 2020 -0400
Fix a typo.
commit 12842ae
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun May 3 17:16:59 2020 -0400
fix spelling in redis conf
commit ddba07c
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Sat May 2 23:25:34 2020 +0100
Correct a "conflicts" spelling error.
commit 8fc7bf2
Author: Nao YONASHIRO <yonashiro@r.recruit.co.jp>
Date: Thu Apr 30 10:25:27 2020 +0900
docs: fix EXPIRE_FAST_CYCLE_DURATION to ACTIVE_EXPIRE_CYCLE_FAST_DURATION
commit 9b2b67a
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Fri Apr 24 11:46:22 2020 -0400
Fix a typo.
commit 0746f10
Author: devilinrust <63737265+devilinrust@users.noreply.github.com>
Date: Thu Apr 16 00:17:53 2020 +0200
Fix typos in server.c
commit 92b588d
Author: benjessop12 <56115861+benjessop12@users.noreply.github.com>
Date: Mon Apr 13 13:43:55 2020 +0100
Fix spelling mistake in lazyfree.c
commit 1da37aa
Merge: 2d4ba28 af347a8
Author: hwware <wen.hui.ware@gmail.com>
Date: Thu Mar 5 22:41:31 2020 -0500
Merge remote-tracking branch 'upstream/unstable' into expiretypofix
commit 2d4ba28
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Mar 2 00:09:40 2020 -0500
fix typo in expire.c
commit 1a746f7
Author: SennoYuki <minakami1yuki@gmail.com>
Date: Thu Feb 27 16:54:32 2020 +0800
fix typo
commit 8599b1a
Author: dongheejeong <donghee950403@gmail.com>
Date: Sun Feb 16 20:31:43 2020 +0000
Fix typo in server.c
commit f38d4e8
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun Feb 2 22:58:38 2020 -0500
fix typo in evict.c
commit fe143fc
Author: Leo Murillo <leonardo.murillo@gmail.com>
Date: Sun Feb 2 01:57:22 2020 -0600
Fix a few typos in redis.conf
commit 1ab4d21
Author: viraja1 <anchan.viraj@gmail.com>
Date: Fri Dec 27 17:15:58 2019 +0530
Fix typo in Latency API docstring
commit ca1f70e
Author: gosth <danxuedexing@qq.com>
Date: Wed Dec 18 15:18:02 2019 +0800
fix typo in sort.c
commit a57c06b
Author: ZYunH <zyunhjob@163.com>
Date: Mon Dec 16 22:28:46 2019 +0800
fix-zset-typo
commit b8c92b5
Author: git-hulk <hulk.website@gmail.com>
Date: Mon Dec 16 15:51:42 2019 +0800
FIX: typo in cluster.c, onformation->information
commit 9dd981c
Author: wujm2007 <jim.wujm@gmail.com>
Date: Mon Dec 16 09:37:52 2019 +0800
Fix typo
commit e132d7a
Author: Sebastien Williams-Wynn <s.williamswynn.mail@gmail.com>
Date: Fri Nov 15 00:14:07 2019 +0000
Minor typo change
commit 47f44d5
Author: happynote3966 <01ssrmikururudevice01@gmail.com>
Date: Mon Nov 11 22:08:48 2019 +0900
fix comment typo in redis-cli.c
commit b8bdb0d
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 18:00:17 2019 +0800
Fix a spelling mistake of comments in defragDictBucketCallback
commit 0def46a
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 13:09:27 2019 +0800
fix some spelling mistakes of comments in defrag.c
commit f3596fd
Author: Phil Rajchgot <tophil@outlook.com>
Date: Sun Oct 13 02:02:32 2019 -0400
Typo and grammar fixes
Redis and its documentation are great -- just wanted to submit a few corrections in the spirit of Hacktoberfest. Thanks for all your work on this project. I use it all the time and it works beautifully.
commit 2b928cd
Author: KangZhiDong <worldkzd@gmail.com>
Date: Sun Sep 1 07:03:11 2019 +0800
fix typos
commit 33aea14
Author: Axlgrep <axlgrep@gmail.com>
Date: Tue Aug 27 11:02:18 2019 +0800
Fixed eviction spelling issues
commit e282a80
Author: Simen Flatby <simen@oms.no>
Date: Tue Aug 20 15:25:51 2019 +0200
Update comments to reflect prop name
In the comments the prop is referenced as replica-validity-factor,
but it is really named cluster-replica-validity-factor.
commit 74d1f9a
Author: Jim Green <jimgreen2013@qq.com>
Date: Tue Aug 20 20:00:31 2019 +0800
fix comment error, the code is ok
commit eea1407
Author: Liao Tonglang <liaotonglang@gmail.com>
Date: Fri May 31 10:16:18 2019 +0800
typo fix
fix cna't to can't
commit 0da553c
Author: KAWACHI Takashi <tkawachi@gmail.com>
Date: Wed Jul 17 00:38:16 2019 +0900
Fix typo
commit 7fc8fb6
Author: Michael Prokop <mika@grml.org>
Date: Tue May 28 17:58:42 2019 +0200
Typo fixes
s/familar/familiar/
s/compatiblity/compatibility/
s/ ot / to /
s/itsef/itself/
commit 5f46c9d
Author: zhumoing <34539422+zhumoing@users.noreply.github.com>
Date: Tue May 21 21:16:50 2019 +0800
typo-fixes
typo-fixes
commit 321dfe1
Author: wxisme <850885154@qq.com>
Date: Sat Mar 16 15:10:55 2019 +0800
typo fix
commit b4fb131
Merge: 267e0e6 3df1eb8
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Fri Feb 8 22:55:45 2019 +0200
Merge branch 'unstable' of antirez/redis into unstable
commit 267e0e6
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Wed Jan 30 21:26:04 2019 +0200
Minor typo fix
commit 30544e7
Author: inshal96 <39904558+inshal96@users.noreply.github.com>
Date: Fri Jan 4 16:54:50 2019 +0500
remove an extra 'a' in the comments
commit 337969d
Author: BrotherGao <yangdongheng11@gmail.com>
Date: Sat Dec 29 12:37:29 2018 +0800
fix typo in redis.conf
commit 9f4b121
Merge: 423a030 e504583
Author: BrotherGao <yangdongheng@xiaomi.com>
Date: Sat Dec 29 11:41:12 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 423a030
Merge: 42b02b7 46a51cd
Author: 杨东衡 <yangdongheng@xiaomi.com>
Date: Tue Dec 4 23:56:11 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 42b02b7
Merge: 68c0e6e b8febe6
Author: Dongheng Yang <yangdongheng11@gmail.com>
Date: Sun Oct 28 15:54:23 2018 +0800
Merge pull request #1 from antirez/unstable
update local data
commit 714b589
Author: Christian <crifei93@gmail.com>
Date: Fri Dec 28 01:17:26 2018 +0100
fix typo "resulution"
commit e23259d
Author: garenchan <1412950785@qq.com>
Date: Wed Dec 26 09:58:35 2018 +0800
fix typo: segfauls -> segfault
commit a9359f8
Author: xjp <jianping_xie@aliyun.com>
Date: Tue Dec 18 17:31:44 2018 +0800
Fixed REDISMODULE_H spell bug
commit a12c3e4
Author: jdiaz <jrd.palacios@gmail.com>
Date: Sat Dec 15 23:39:52 2018 -0600
Fixes hyperloglog hash function comment block description
commit 770eb11
Author: 林上耀 <1210tom@163.com>
Date: Sun Nov 25 17:16:10 2018 +0800
fix typo
commit fd97fbb
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Fri Nov 23 17:14:01 2018 +0100
Correct "unsupported" typo.
commit a85522d
Author: Jungnam Lee <jungnam.lee@oracle.com>
Date: Thu Nov 8 23:01:29 2018 +0900
fix typo in test comments
commit ade8007
Author: Arun Kumar <palerdot@users.noreply.github.com>
Date: Tue Oct 23 16:56:35 2018 +0530
Fixed grammatical typo
Fixed typo for word 'dictionary'
commit 869ee39
Author: Hamid Alaei <hamid.a85@gmail.com>
Date: Sun Aug 12 16:40:02 2018 +0430
fix documentations: (ThreadSafeContextStart/Stop -> ThreadSafeContextLock/Unlock), minor typo
commit f89d158
Author: Mayank Jain <mayankjain255@gmail.com>
Date: Tue Jul 31 23:01:21 2018 +0530
Updated README.md with some spelling corrections.
Made correction in spelling of some misspelled words.
commit 892198e
Author: dsomeshwar <someshwar.dhayalan@gmail.com>
Date: Sat Jul 21 23:23:04 2018 +0530
typo fix
commit 8a4d780
Author: Itamar Haber <itamar@redislabs.com>
Date: Mon Apr 30 02:06:52 2018 +0300
Fixes some typos
commit e3acef6
Author: Noah Rosamilia <ivoahivoah@gmail.com>
Date: Sat Mar 3 23:41:21 2018 -0500
Fix typo in /deps/README.md
commit 04442fb
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:32:42 2018 +0800
Fix typo in readSyncBulkPayload() comment.
commit 9f36880
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:20:37 2018 +0800
replication.c comment: run_id -> replid.
commit f866b4a
Author: Francesco 'makevoid' Canessa <makevoid@gmail.com>
Date: Thu Feb 22 22:01:56 2018 +0000
fix comment typo in server.c
commit 0ebc69b
Author: 줍 <jubee0124@gmail.com>
Date: Mon Feb 12 16:38:48 2018 +0900
Fix typo in redis.conf
Fix `five behaviors` to `eight behaviors` in [this sentence ](antirez/redis@unstable/redis.conf#L564)
commit b50a620
Author: martinbroadhurst <martinbroadhurst@users.noreply.github.com>
Date: Thu Dec 28 12:07:30 2017 +0000
Fix typo in valgrind.sup
commit 7d8f349
Author: Peter Boughton <peter@sorcerersisle.com>
Date: Mon Nov 27 19:52:19 2017 +0000
Update CONTRIBUTING; refer doc updates to redis-doc repo.
commit 02dec7e
Author: Klauswk <klauswk1@hotmail.com>
Date: Tue Oct 24 16:18:38 2017 -0200
Fix typo in comment
commit e1efbc8
Author: chenshi <baiwfg2@gmail.com>
Date: Tue Oct 3 18:26:30 2017 +0800
Correct two spelling errors of comments
commit 93327d8
Author: spacewander <spacewanderlzx@gmail.com>
Date: Wed Sep 13 16:47:24 2017 +0800
Update the comment for OBJ_ENCODING_EMBSTR_SIZE_LIMIT's value
The value of OBJ_ENCODING_EMBSTR_SIZE_LIMIT is 44 now instead of 39.
commit 63d361f
Author: spacewander <spacewanderlzx@gmail.com>
Date: Tue Sep 12 15:06:42 2017 +0800
Fix <prevlen> related doc in ziplist.c
According to the definition of ZIP_BIG_PREVLEN and other related code,
the guard of single byte <prevlen> should be 254 instead of 255.
commit ebe228d
Author: hanael80 <hanael80@gmail.com>
Date: Tue Aug 15 09:09:40 2017 +0900
Fix typo
commit 6b696e6
Author: Matt Robenolt <matt@ydekproductions.com>
Date: Mon Aug 14 14:50:47 2017 -0700
Fix typo in LATENCY DOCTOR output
commit a2ec6ae
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 15 14:15:16 2017 +0800
Fix a typo: form => from
commit 3ab7699
Author: caosiyang <caosiyang@qiyi.com>
Date: Thu Aug 10 18:40:33 2017 +0800
Fix a typo: replicationFeedSlavesFromMaster() => replicationFeedSlavesFromMasterStream()
commit 72d43ef
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 8 15:57:25 2017 +0800
fix a typo: servewr => server
commit 707c958
Author: Bo Cai <charpty@gmail.com>
Date: Wed Jul 26 21:49:42 2017 +0800
redis-cli.c typo: conut -> count.
Signed-off-by: Bo Cai <charpty@gmail.com>
commit b9385b2
Author: JackDrogon <jack.xsuperman@gmail.com>
Date: Fri Jun 30 14:22:31 2017 +0800
Fix some spell problems
commit 20d9230
Author: akosel <aaronjkosel@gmail.com>
Date: Sun Jun 4 19:35:13 2017 -0500
Fix typo
commit b167bfc
Author: Krzysiek Witkowicz <krzysiekwitkowicz@gmail.com>
Date: Mon May 22 21:32:27 2017 +0100
Fix #4008 small typo in comment
commit 2b78ac8
Author: Jake Clarkson <jacobwclarkson@gmail.com>
Date: Wed Apr 26 15:49:50 2017 +0100
Correct typo in tests/unit/hyperloglog.tcl
commit b0f1cdb
Author: Qi Luo <qiluo-msft@users.noreply.github.com>
Date: Wed Apr 19 14:25:18 2017 -0700
Fix typo
commit a90b0f9
Author: charsyam <charsyam@naver.com>
Date: Thu Mar 16 18:19:53 2017 +0900
fix typos
fix typos
fix typos
commit 8430a79
Author: Richard Hart <richardhart92@gmail.com>
Date: Mon Mar 13 22:17:41 2017 -0400
Fixed log message typo in listenToPort.
commit 481a1c2
Author: Vinod Kumar <kumar003vinod@gmail.com>
Date: Sun Jan 15 23:04:51 2017 +0530
src/db.c: Correct "save" -> "safe" typo
commit 586b4d3
Author: wangshaonan <wshn13@gmail.com>
Date: Wed Dec 21 20:28:27 2016 +0800
Fix typo they->the in helloworld.c
commit c1c4b5e
Author: Jenner <hypxm@qq.com>
Date: Mon Dec 19 16:39:46 2016 +0800
typo error
commit 1ee1a3f
Author: tielei <43289893@qq.com>
Date: Mon Jul 18 13:52:25 2016 +0800
fix some comments
commit 11a41fb
Author: Otto Kekäläinen <otto@seravo.fi>
Date: Sun Jul 3 10:23:55 2016 +0100
Fix spelling in documentation and comments
commit 5fb5d82
Author: francischan <f1ancis621@gmail.com>
Date: Tue Jun 28 00:19:33 2016 +0800
Fix outdated comments about redis.c file.
It should now refer to server.c file.
commit 6b254bc
Author: lmatt-bit <lmatt123n@gmail.com>
Date: Thu Apr 21 21:45:58 2016 +0800
Refine the comment of dictRehashMilliseconds func
SLAVECONF->REPLCONF in comment - by andyli029
commit ee9869f
Author: clark.kang <charsyam@naver.com>
Date: Tue Mar 22 11:09:51 2016 +0900
fix typos
commit f7b3b11
Author: Harisankar H <harisankarh@gmail.com>
Date: Wed Mar 9 11:49:42 2016 +0530
Typo correction: "faield" --> "failed"
Typo correction: "faield" --> "failed"
commit 3fd40fc
Author: Itamar Haber <itamar@redislabs.com>
Date: Thu Feb 25 10:31:51 2016 +0200
Fixes a typo in comments
commit 621c160
Author: Prayag Verma <prayag.verma@gmail.com>
Date: Mon Feb 1 12:36:20 2016 +0530
Fix typo in Readme.md
Spelling mistakes -
`eviciton` > `eviction`
`familar` > `familiar`
commit d7d07d6
Author: WonCheol Lee <toctoc21c@gmail.com>
Date: Wed Dec 30 15:11:34 2015 +0900
Typo fixed
commit a4dade7
Author: Felix Bünemann <buenemann@louis.info>
Date: Mon Dec 28 11:02:55 2015 +0100
[ci skip] Improve supervised upstart config docs
This mentions that "expect stop" is required for supervised upstart
to work correctly. See http://upstart.ubuntu.com/cookbook/#expect-stop
for an explanation.
commit d9caba9
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:30:03 2015 +1100
README: Remove trailing whitespace
commit 72d42e5
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:32 2015 +1100
README: Fix typo. th => the
commit dd6e957
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:20 2015 +1100
README: Fix typo. familar => familiar
commit 3a12b23
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:28:54 2015 +1100
README: Fix typo. eviciton => eviction
commit 2d1d03b
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:21:45 2015 +1100
README: Fix typo. sever => server
commit 3973b06
Author: Itamar Haber <itamar@garantiadata.com>
Date: Sat Dec 19 17:01:20 2015 +0200
Typo fix
commit 4f2e460
Author: Steve Gao <fu@2token.com>
Date: Fri Dec 4 10:22:05 2015 +0800
Update README - fix typos
commit b21667c
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:48:37 2015 +0800
delete redundancy color judge in sdscatcolor
commit 88894c7
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:14:42 2015 +0800
the example output shoule be HelloWorld
commit 2763470
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 17:41:39 2015 +0800
modify error word keyevente
Signed-off-by: binyan <binbin.yan@nokia.com>
commit 0847b3d
Author: Bruno Martins <bscmartins@gmail.com>
Date: Wed Nov 4 11:37:01 2015 +0000
typo
commit bbb9e9e
Author: dawedawe <dawedawe@gmx.de>
Date: Fri Mar 27 00:46:41 2015 +0100
typo: zimap -> zipmap
commit 5ed297e
Author: Axel Advento <badwolf.bloodseeker.rev@gmail.com>
Date: Tue Mar 3 15:58:29 2015 +0800
Fix 'salve' typos to 'slave'
commit edec9d6
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Wed Jun 12 14:12:47 2019 +0200
Update README.md
Co-Authored-By: Qix <Qix-@users.noreply.github.com>
commit 692a7af
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Tue May 28 14:32:04 2019 +0200
grammar
commit d962b0a
Author: Nick Frost <nickfrostatx@gmail.com>
Date: Wed Jul 20 15:17:12 2016 -0700
Minor grammar fix
commit 24fff01aaccaf5956973ada8c50ceb1462e211c6 (typos)
Author: Chad Miller <chadm@squareup.com>
Date: Tue Sep 8 13:46:11 2020 -0400
Fix faulty comment about operation of unlink()
commit 3cd5c1f3326c52aa552ada7ec797c6bb16452355
Author: Kevin <kevin.xgr@gmail.com>
Date: Wed Nov 20 00:13:50 2019 +0800
Fix typo in server.c.
From a83af59 Mon Sep 17 00:00:00 2001
From: wuwo <wuwo@wacai.com>
Date: Fri, 17 Mar 2017 20:37:45 +0800
Subject: [PATCH] falure to failure
From c961896 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B7=A6=E6=87=B6?= <veficos@gmail.com>
Date: Sat, 27 May 2017 15:33:04 +0800
Subject: [PATCH] fix typo
From e600ef2 Mon Sep 17 00:00:00 2001
From: "rui.zou" <rui.zou@yunify.com>
Date: Sat, 30 Sep 2017 12:38:15 +0800
Subject: [PATCH] fix a typo
From c7d07fa Mon Sep 17 00:00:00 2001
From: Alexandre Perrin <alex@kaworu.ch>
Date: Thu, 16 Aug 2018 10:35:31 +0200
Subject: [PATCH] deps README.md typo
From b25cb67 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 10:55:37 +0300
Subject: [PATCH 1/2] fix typos in header
From ad28ca6 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 11:02:36 +0300
Subject: [PATCH 2/2] fix typos
commit 34924cdedd8552466fc22c1168d49236cb7ee915
Author: Adrian Lynch <adi_ady_ade@hotmail.com>
Date: Sat Apr 4 21:59:15 2015 +0100
Typos fixed
commit fd2a1e7
Author: Jan <jsteemann@users.noreply.github.com>
Date: Sat Oct 27 19:13:01 2018 +0200
Fix typos
Fix typos
commit e14e47c1a234b53b0e103c5f6a1c61481cbcbb02
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:30:07 2019 -0500
Fix multiple misspellings of "following"
commit 79b948ce2dac6b453fe80995abbcaac04c213d5a
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:24:28 2019 -0500
Fix misspelling of create-cluster
commit 1fffde52666dc99ab35efbd31071a4c008cb5a71
Author: Andy Lester <andy@petdance.com>
Date: Wed Jul 31 17:57:56 2019 -0500
Fix typos
commit 204c9ba9651e9e05fd73936b452b9a30be456cfe
Author: Xiaobo Zhu <xiaobo.zhu@shopee.com>
Date: Tue Aug 13 22:19:25 2019 +0800
fix typos
Squashed commit of the following:
commit 1d9aaf8
Author: danmedani <danmedani@gmail.com>
Date: Sun Aug 2 11:40:26 2015 -0700
README typo fix.
Squashed commit of the following:
commit 32bfa7c
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Jul 6 21:15:08 2015 +0200
Fixed grammer
Squashed commit of the following:
commit b24f69c
Author: Sisir Koppaka <sisir.koppaka@gmail.com>
Date: Mon Mar 2 22:38:45 2015 -0500
utils/hashtable/rehashing.c: Fix typos
Squashed commit of the following:
commit 4e04082
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Mar 23 08:22:21 2015 +0000
Small config file documentation improvements
Squashed commit of the following:
commit acb8773
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:52:48 2015 -0700
Typo and grammar fixes in readme
commit 2eb75b6
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:36:18 2015 -0700
fixed redis.conf comment
Squashed commit of the following:
commit a8249a2
Author: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Fri Dec 11 11:39:52 2015 +0530
Revise correction of typos.
Squashed commit of the following:
commit 3c02028
Author: zhaojun11 <zhaojun11@jd.com>
Date: Wed Jan 17 19:05:28 2018 +0800
Fix typos include two code typos in cluster.c and latency.c
Squashed commit of the following:
commit 9dba47c
Author: q191201771 <191201771@qq.com>
Date: Sat Jan 4 11:31:04 2020 +0800
fix function listCreate comment in adlist.c
Update src/server.c
commit 2c7c2cb536e78dd211b1ac6f7bda00f0f54faaeb
Author: charpty <charpty@gmail.com>
Date: Tue May 1 23:16:59 2018 +0800
server.c typo: modules system dictionary type comment
Signed-off-by: charpty <charpty@gmail.com>
commit a8395323fb63cb59cb3591cb0f0c8edb7c29a680
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun May 6 00:25:18 2018 +0300
Updates test_helper.tcl's help with undocumented options
Specifically:
* Host
* Port
* Client
commit bde6f9ced15755cd6407b4af7d601b030f36d60b
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 15:19:19 2018 +0800
fix comments in deps files
commit 3172474ba991532ab799ee1873439f3402412331
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 14:33:49 2018 +0800
fix some comments
commit 01b6f2b6858b5cf2ce4ad5092d2c746e755f53f0
Author: Thor Juhasz <thor@juhasz.pro>
Date: Sun Nov 18 14:37:41 2018 +0100
Minor fixes to comments
Found some parts a little unclear on a first read, which prompted me to have a better look at the file and fix some minor things I noticed.
Fixing minor typos and grammar. There are no changes to configuration options.
These changes are only meant to help the user better understand the explanations to the various configuration options
2020-09-10 13:43:38 +03:00
|
|
|
/* Write the encoding header of the entry in 'p'. If p is NULL it just returns
|
2017-01-27 16:54:20 +01:00
|
|
|
* the amount of bytes required to encode such a length. Arguments:
|
|
|
|
*
|
|
|
|
* 'encoding' is the encoding we are using for the entry. It could be
|
|
|
|
* ZIP_INT_* or ZIP_STR_* or between ZIP_INT_IMM_MIN and ZIP_INT_IMM_MAX
|
|
|
|
* for single-byte small immediate integers.
|
|
|
|
*
|
|
|
|
* 'rawlen' is only used for ZIP_STR_* encodings and is the length of the
|
Squash merging 125 typo/grammar/comment/doc PRs (#7773)
List of squashed commits or PRs
===============================
commit 66801ea
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Jan 13 00:54:31 2020 -0500
typo fix in acl.c
commit 46f55db
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun Sep 6 18:24:11 2020 +0300
Updates a couple of comments
Specifically:
* RM_AutoMemory completed instead of pointing to docs
* Updated link to custom type doc
commit 61a2aa0
Author: xindoo <xindoo@qq.com>
Date: Tue Sep 1 19:24:59 2020 +0800
Correct errors in code comments
commit a5871d1
Author: yz1509 <pro-756@qq.com>
Date: Tue Sep 1 18:36:06 2020 +0800
fix typos in module.c
commit 41eede7
Author: bookug <bookug@qq.com>
Date: Sat Aug 15 01:11:33 2020 +0800
docs: fix typos in comments
commit c303c84
Author: lazy-snail <ws.niu@outlook.com>
Date: Fri Aug 7 11:15:44 2020 +0800
fix spelling in redis.conf
commit 1eb76bf
Author: zhujian <zhujianxyz@gmail.com>
Date: Thu Aug 6 15:22:10 2020 +0800
add a missing 'n' in comment
commit 1530ec2
Author: Daniel Dai <764122422@qq.com>
Date: Mon Jul 27 00:46:35 2020 -0400
fix spelling in tracking.c
commit e517b31
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:32 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit c300eff
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:23 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit 4c058a8
Author: 陈浩鹏 <chenhaopeng@heytea.com>
Date: Thu Jun 25 19:00:56 2020 +0800
Grammar fix and clarification
commit 5fcaa81
Author: bodong.ybd <bodong.ybd@alibaba-inc.com>
Date: Fri Jun 19 10:09:00 2020 +0800
Fix typos
commit 4caca9a
Author: Pruthvi P <pruthvi@ixigo.com>
Date: Fri May 22 00:33:22 2020 +0530
Fix typo eviciton => eviction
commit b2a25f6
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Sun May 17 12:39:59 2020 -0400
Fix a typo.
commit 12842ae
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun May 3 17:16:59 2020 -0400
fix spelling in redis conf
commit ddba07c
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Sat May 2 23:25:34 2020 +0100
Correct a "conflicts" spelling error.
commit 8fc7bf2
Author: Nao YONASHIRO <yonashiro@r.recruit.co.jp>
Date: Thu Apr 30 10:25:27 2020 +0900
docs: fix EXPIRE_FAST_CYCLE_DURATION to ACTIVE_EXPIRE_CYCLE_FAST_DURATION
commit 9b2b67a
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Fri Apr 24 11:46:22 2020 -0400
Fix a typo.
commit 0746f10
Author: devilinrust <63737265+devilinrust@users.noreply.github.com>
Date: Thu Apr 16 00:17:53 2020 +0200
Fix typos in server.c
commit 92b588d
Author: benjessop12 <56115861+benjessop12@users.noreply.github.com>
Date: Mon Apr 13 13:43:55 2020 +0100
Fix spelling mistake in lazyfree.c
commit 1da37aa
Merge: 2d4ba28 af347a8
Author: hwware <wen.hui.ware@gmail.com>
Date: Thu Mar 5 22:41:31 2020 -0500
Merge remote-tracking branch 'upstream/unstable' into expiretypofix
commit 2d4ba28
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Mar 2 00:09:40 2020 -0500
fix typo in expire.c
commit 1a746f7
Author: SennoYuki <minakami1yuki@gmail.com>
Date: Thu Feb 27 16:54:32 2020 +0800
fix typo
commit 8599b1a
Author: dongheejeong <donghee950403@gmail.com>
Date: Sun Feb 16 20:31:43 2020 +0000
Fix typo in server.c
commit f38d4e8
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun Feb 2 22:58:38 2020 -0500
fix typo in evict.c
commit fe143fc
Author: Leo Murillo <leonardo.murillo@gmail.com>
Date: Sun Feb 2 01:57:22 2020 -0600
Fix a few typos in redis.conf
commit 1ab4d21
Author: viraja1 <anchan.viraj@gmail.com>
Date: Fri Dec 27 17:15:58 2019 +0530
Fix typo in Latency API docstring
commit ca1f70e
Author: gosth <danxuedexing@qq.com>
Date: Wed Dec 18 15:18:02 2019 +0800
fix typo in sort.c
commit a57c06b
Author: ZYunH <zyunhjob@163.com>
Date: Mon Dec 16 22:28:46 2019 +0800
fix-zset-typo
commit b8c92b5
Author: git-hulk <hulk.website@gmail.com>
Date: Mon Dec 16 15:51:42 2019 +0800
FIX: typo in cluster.c, onformation->information
commit 9dd981c
Author: wujm2007 <jim.wujm@gmail.com>
Date: Mon Dec 16 09:37:52 2019 +0800
Fix typo
commit e132d7a
Author: Sebastien Williams-Wynn <s.williamswynn.mail@gmail.com>
Date: Fri Nov 15 00:14:07 2019 +0000
Minor typo change
commit 47f44d5
Author: happynote3966 <01ssrmikururudevice01@gmail.com>
Date: Mon Nov 11 22:08:48 2019 +0900
fix comment typo in redis-cli.c
commit b8bdb0d
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 18:00:17 2019 +0800
Fix a spelling mistake of comments in defragDictBucketCallback
commit 0def46a
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 13:09:27 2019 +0800
fix some spelling mistakes of comments in defrag.c
commit f3596fd
Author: Phil Rajchgot <tophil@outlook.com>
Date: Sun Oct 13 02:02:32 2019 -0400
Typo and grammar fixes
Redis and its documentation are great -- just wanted to submit a few corrections in the spirit of Hacktoberfest. Thanks for all your work on this project. I use it all the time and it works beautifully.
commit 2b928cd
Author: KangZhiDong <worldkzd@gmail.com>
Date: Sun Sep 1 07:03:11 2019 +0800
fix typos
commit 33aea14
Author: Axlgrep <axlgrep@gmail.com>
Date: Tue Aug 27 11:02:18 2019 +0800
Fixed eviction spelling issues
commit e282a80
Author: Simen Flatby <simen@oms.no>
Date: Tue Aug 20 15:25:51 2019 +0200
Update comments to reflect prop name
In the comments the prop is referenced as replica-validity-factor,
but it is really named cluster-replica-validity-factor.
commit 74d1f9a
Author: Jim Green <jimgreen2013@qq.com>
Date: Tue Aug 20 20:00:31 2019 +0800
fix comment error, the code is ok
commit eea1407
Author: Liao Tonglang <liaotonglang@gmail.com>
Date: Fri May 31 10:16:18 2019 +0800
typo fix
fix cna't to can't
commit 0da553c
Author: KAWACHI Takashi <tkawachi@gmail.com>
Date: Wed Jul 17 00:38:16 2019 +0900
Fix typo
commit 7fc8fb6
Author: Michael Prokop <mika@grml.org>
Date: Tue May 28 17:58:42 2019 +0200
Typo fixes
s/familar/familiar/
s/compatiblity/compatibility/
s/ ot / to /
s/itsef/itself/
commit 5f46c9d
Author: zhumoing <34539422+zhumoing@users.noreply.github.com>
Date: Tue May 21 21:16:50 2019 +0800
typo-fixes
typo-fixes
commit 321dfe1
Author: wxisme <850885154@qq.com>
Date: Sat Mar 16 15:10:55 2019 +0800
typo fix
commit b4fb131
Merge: 267e0e6 3df1eb8
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Fri Feb 8 22:55:45 2019 +0200
Merge branch 'unstable' of antirez/redis into unstable
commit 267e0e6
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Wed Jan 30 21:26:04 2019 +0200
Minor typo fix
commit 30544e7
Author: inshal96 <39904558+inshal96@users.noreply.github.com>
Date: Fri Jan 4 16:54:50 2019 +0500
remove an extra 'a' in the comments
commit 337969d
Author: BrotherGao <yangdongheng11@gmail.com>
Date: Sat Dec 29 12:37:29 2018 +0800
fix typo in redis.conf
commit 9f4b121
Merge: 423a030 e504583
Author: BrotherGao <yangdongheng@xiaomi.com>
Date: Sat Dec 29 11:41:12 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 423a030
Merge: 42b02b7 46a51cd
Author: 杨东衡 <yangdongheng@xiaomi.com>
Date: Tue Dec 4 23:56:11 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 42b02b7
Merge: 68c0e6e b8febe6
Author: Dongheng Yang <yangdongheng11@gmail.com>
Date: Sun Oct 28 15:54:23 2018 +0800
Merge pull request #1 from antirez/unstable
update local data
commit 714b589
Author: Christian <crifei93@gmail.com>
Date: Fri Dec 28 01:17:26 2018 +0100
fix typo "resulution"
commit e23259d
Author: garenchan <1412950785@qq.com>
Date: Wed Dec 26 09:58:35 2018 +0800
fix typo: segfauls -> segfault
commit a9359f8
Author: xjp <jianping_xie@aliyun.com>
Date: Tue Dec 18 17:31:44 2018 +0800
Fixed REDISMODULE_H spell bug
commit a12c3e4
Author: jdiaz <jrd.palacios@gmail.com>
Date: Sat Dec 15 23:39:52 2018 -0600
Fixes hyperloglog hash function comment block description
commit 770eb11
Author: 林上耀 <1210tom@163.com>
Date: Sun Nov 25 17:16:10 2018 +0800
fix typo
commit fd97fbb
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Fri Nov 23 17:14:01 2018 +0100
Correct "unsupported" typo.
commit a85522d
Author: Jungnam Lee <jungnam.lee@oracle.com>
Date: Thu Nov 8 23:01:29 2018 +0900
fix typo in test comments
commit ade8007
Author: Arun Kumar <palerdot@users.noreply.github.com>
Date: Tue Oct 23 16:56:35 2018 +0530
Fixed grammatical typo
Fixed typo for word 'dictionary'
commit 869ee39
Author: Hamid Alaei <hamid.a85@gmail.com>
Date: Sun Aug 12 16:40:02 2018 +0430
fix documentations: (ThreadSafeContextStart/Stop -> ThreadSafeContextLock/Unlock), minor typo
commit f89d158
Author: Mayank Jain <mayankjain255@gmail.com>
Date: Tue Jul 31 23:01:21 2018 +0530
Updated README.md with some spelling corrections.
Made correction in spelling of some misspelled words.
commit 892198e
Author: dsomeshwar <someshwar.dhayalan@gmail.com>
Date: Sat Jul 21 23:23:04 2018 +0530
typo fix
commit 8a4d780
Author: Itamar Haber <itamar@redislabs.com>
Date: Mon Apr 30 02:06:52 2018 +0300
Fixes some typos
commit e3acef6
Author: Noah Rosamilia <ivoahivoah@gmail.com>
Date: Sat Mar 3 23:41:21 2018 -0500
Fix typo in /deps/README.md
commit 04442fb
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:32:42 2018 +0800
Fix typo in readSyncBulkPayload() comment.
commit 9f36880
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:20:37 2018 +0800
replication.c comment: run_id -> replid.
commit f866b4a
Author: Francesco 'makevoid' Canessa <makevoid@gmail.com>
Date: Thu Feb 22 22:01:56 2018 +0000
fix comment typo in server.c
commit 0ebc69b
Author: 줍 <jubee0124@gmail.com>
Date: Mon Feb 12 16:38:48 2018 +0900
Fix typo in redis.conf
Fix `five behaviors` to `eight behaviors` in [this sentence ](antirez/redis@unstable/redis.conf#L564)
commit b50a620
Author: martinbroadhurst <martinbroadhurst@users.noreply.github.com>
Date: Thu Dec 28 12:07:30 2017 +0000
Fix typo in valgrind.sup
commit 7d8f349
Author: Peter Boughton <peter@sorcerersisle.com>
Date: Mon Nov 27 19:52:19 2017 +0000
Update CONTRIBUTING; refer doc updates to redis-doc repo.
commit 02dec7e
Author: Klauswk <klauswk1@hotmail.com>
Date: Tue Oct 24 16:18:38 2017 -0200
Fix typo in comment
commit e1efbc8
Author: chenshi <baiwfg2@gmail.com>
Date: Tue Oct 3 18:26:30 2017 +0800
Correct two spelling errors of comments
commit 93327d8
Author: spacewander <spacewanderlzx@gmail.com>
Date: Wed Sep 13 16:47:24 2017 +0800
Update the comment for OBJ_ENCODING_EMBSTR_SIZE_LIMIT's value
The value of OBJ_ENCODING_EMBSTR_SIZE_LIMIT is 44 now instead of 39.
commit 63d361f
Author: spacewander <spacewanderlzx@gmail.com>
Date: Tue Sep 12 15:06:42 2017 +0800
Fix <prevlen> related doc in ziplist.c
According to the definition of ZIP_BIG_PREVLEN and other related code,
the guard of single byte <prevlen> should be 254 instead of 255.
commit ebe228d
Author: hanael80 <hanael80@gmail.com>
Date: Tue Aug 15 09:09:40 2017 +0900
Fix typo
commit 6b696e6
Author: Matt Robenolt <matt@ydekproductions.com>
Date: Mon Aug 14 14:50:47 2017 -0700
Fix typo in LATENCY DOCTOR output
commit a2ec6ae
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 15 14:15:16 2017 +0800
Fix a typo: form => from
commit 3ab7699
Author: caosiyang <caosiyang@qiyi.com>
Date: Thu Aug 10 18:40:33 2017 +0800
Fix a typo: replicationFeedSlavesFromMaster() => replicationFeedSlavesFromMasterStream()
commit 72d43ef
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 8 15:57:25 2017 +0800
fix a typo: servewr => server
commit 707c958
Author: Bo Cai <charpty@gmail.com>
Date: Wed Jul 26 21:49:42 2017 +0800
redis-cli.c typo: conut -> count.
Signed-off-by: Bo Cai <charpty@gmail.com>
commit b9385b2
Author: JackDrogon <jack.xsuperman@gmail.com>
Date: Fri Jun 30 14:22:31 2017 +0800
Fix some spell problems
commit 20d9230
Author: akosel <aaronjkosel@gmail.com>
Date: Sun Jun 4 19:35:13 2017 -0500
Fix typo
commit b167bfc
Author: Krzysiek Witkowicz <krzysiekwitkowicz@gmail.com>
Date: Mon May 22 21:32:27 2017 +0100
Fix #4008 small typo in comment
commit 2b78ac8
Author: Jake Clarkson <jacobwclarkson@gmail.com>
Date: Wed Apr 26 15:49:50 2017 +0100
Correct typo in tests/unit/hyperloglog.tcl
commit b0f1cdb
Author: Qi Luo <qiluo-msft@users.noreply.github.com>
Date: Wed Apr 19 14:25:18 2017 -0700
Fix typo
commit a90b0f9
Author: charsyam <charsyam@naver.com>
Date: Thu Mar 16 18:19:53 2017 +0900
fix typos
fix typos
fix typos
commit 8430a79
Author: Richard Hart <richardhart92@gmail.com>
Date: Mon Mar 13 22:17:41 2017 -0400
Fixed log message typo in listenToPort.
commit 481a1c2
Author: Vinod Kumar <kumar003vinod@gmail.com>
Date: Sun Jan 15 23:04:51 2017 +0530
src/db.c: Correct "save" -> "safe" typo
commit 586b4d3
Author: wangshaonan <wshn13@gmail.com>
Date: Wed Dec 21 20:28:27 2016 +0800
Fix typo they->the in helloworld.c
commit c1c4b5e
Author: Jenner <hypxm@qq.com>
Date: Mon Dec 19 16:39:46 2016 +0800
typo error
commit 1ee1a3f
Author: tielei <43289893@qq.com>
Date: Mon Jul 18 13:52:25 2016 +0800
fix some comments
commit 11a41fb
Author: Otto Kekäläinen <otto@seravo.fi>
Date: Sun Jul 3 10:23:55 2016 +0100
Fix spelling in documentation and comments
commit 5fb5d82
Author: francischan <f1ancis621@gmail.com>
Date: Tue Jun 28 00:19:33 2016 +0800
Fix outdated comments about redis.c file.
It should now refer to server.c file.
commit 6b254bc
Author: lmatt-bit <lmatt123n@gmail.com>
Date: Thu Apr 21 21:45:58 2016 +0800
Refine the comment of dictRehashMilliseconds func
SLAVECONF->REPLCONF in comment - by andyli029
commit ee9869f
Author: clark.kang <charsyam@naver.com>
Date: Tue Mar 22 11:09:51 2016 +0900
fix typos
commit f7b3b11
Author: Harisankar H <harisankarh@gmail.com>
Date: Wed Mar 9 11:49:42 2016 +0530
Typo correction: "faield" --> "failed"
Typo correction: "faield" --> "failed"
commit 3fd40fc
Author: Itamar Haber <itamar@redislabs.com>
Date: Thu Feb 25 10:31:51 2016 +0200
Fixes a typo in comments
commit 621c160
Author: Prayag Verma <prayag.verma@gmail.com>
Date: Mon Feb 1 12:36:20 2016 +0530
Fix typo in Readme.md
Spelling mistakes -
`eviciton` > `eviction`
`familar` > `familiar`
commit d7d07d6
Author: WonCheol Lee <toctoc21c@gmail.com>
Date: Wed Dec 30 15:11:34 2015 +0900
Typo fixed
commit a4dade7
Author: Felix Bünemann <buenemann@louis.info>
Date: Mon Dec 28 11:02:55 2015 +0100
[ci skip] Improve supervised upstart config docs
This mentions that "expect stop" is required for supervised upstart
to work correctly. See http://upstart.ubuntu.com/cookbook/#expect-stop
for an explanation.
commit d9caba9
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:30:03 2015 +1100
README: Remove trailing whitespace
commit 72d42e5
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:32 2015 +1100
README: Fix typo. th => the
commit dd6e957
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:20 2015 +1100
README: Fix typo. familar => familiar
commit 3a12b23
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:28:54 2015 +1100
README: Fix typo. eviciton => eviction
commit 2d1d03b
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:21:45 2015 +1100
README: Fix typo. sever => server
commit 3973b06
Author: Itamar Haber <itamar@garantiadata.com>
Date: Sat Dec 19 17:01:20 2015 +0200
Typo fix
commit 4f2e460
Author: Steve Gao <fu@2token.com>
Date: Fri Dec 4 10:22:05 2015 +0800
Update README - fix typos
commit b21667c
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:48:37 2015 +0800
delete redundancy color judge in sdscatcolor
commit 88894c7
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:14:42 2015 +0800
the example output shoule be HelloWorld
commit 2763470
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 17:41:39 2015 +0800
modify error word keyevente
Signed-off-by: binyan <binbin.yan@nokia.com>
commit 0847b3d
Author: Bruno Martins <bscmartins@gmail.com>
Date: Wed Nov 4 11:37:01 2015 +0000
typo
commit bbb9e9e
Author: dawedawe <dawedawe@gmx.de>
Date: Fri Mar 27 00:46:41 2015 +0100
typo: zimap -> zipmap
commit 5ed297e
Author: Axel Advento <badwolf.bloodseeker.rev@gmail.com>
Date: Tue Mar 3 15:58:29 2015 +0800
Fix 'salve' typos to 'slave'
commit edec9d6
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Wed Jun 12 14:12:47 2019 +0200
Update README.md
Co-Authored-By: Qix <Qix-@users.noreply.github.com>
commit 692a7af
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Tue May 28 14:32:04 2019 +0200
grammar
commit d962b0a
Author: Nick Frost <nickfrostatx@gmail.com>
Date: Wed Jul 20 15:17:12 2016 -0700
Minor grammar fix
commit 24fff01aaccaf5956973ada8c50ceb1462e211c6 (typos)
Author: Chad Miller <chadm@squareup.com>
Date: Tue Sep 8 13:46:11 2020 -0400
Fix faulty comment about operation of unlink()
commit 3cd5c1f3326c52aa552ada7ec797c6bb16452355
Author: Kevin <kevin.xgr@gmail.com>
Date: Wed Nov 20 00:13:50 2019 +0800
Fix typo in server.c.
From a83af59 Mon Sep 17 00:00:00 2001
From: wuwo <wuwo@wacai.com>
Date: Fri, 17 Mar 2017 20:37:45 +0800
Subject: [PATCH] falure to failure
From c961896 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B7=A6=E6=87=B6?= <veficos@gmail.com>
Date: Sat, 27 May 2017 15:33:04 +0800
Subject: [PATCH] fix typo
From e600ef2 Mon Sep 17 00:00:00 2001
From: "rui.zou" <rui.zou@yunify.com>
Date: Sat, 30 Sep 2017 12:38:15 +0800
Subject: [PATCH] fix a typo
From c7d07fa Mon Sep 17 00:00:00 2001
From: Alexandre Perrin <alex@kaworu.ch>
Date: Thu, 16 Aug 2018 10:35:31 +0200
Subject: [PATCH] deps README.md typo
From b25cb67 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 10:55:37 +0300
Subject: [PATCH 1/2] fix typos in header
From ad28ca6 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 11:02:36 +0300
Subject: [PATCH 2/2] fix typos
commit 34924cdedd8552466fc22c1168d49236cb7ee915
Author: Adrian Lynch <adi_ady_ade@hotmail.com>
Date: Sat Apr 4 21:59:15 2015 +0100
Typos fixed
commit fd2a1e7
Author: Jan <jsteemann@users.noreply.github.com>
Date: Sat Oct 27 19:13:01 2018 +0200
Fix typos
Fix typos
commit e14e47c1a234b53b0e103c5f6a1c61481cbcbb02
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:30:07 2019 -0500
Fix multiple misspellings of "following"
commit 79b948ce2dac6b453fe80995abbcaac04c213d5a
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:24:28 2019 -0500
Fix misspelling of create-cluster
commit 1fffde52666dc99ab35efbd31071a4c008cb5a71
Author: Andy Lester <andy@petdance.com>
Date: Wed Jul 31 17:57:56 2019 -0500
Fix typos
commit 204c9ba9651e9e05fd73936b452b9a30be456cfe
Author: Xiaobo Zhu <xiaobo.zhu@shopee.com>
Date: Tue Aug 13 22:19:25 2019 +0800
fix typos
Squashed commit of the following:
commit 1d9aaf8
Author: danmedani <danmedani@gmail.com>
Date: Sun Aug 2 11:40:26 2015 -0700
README typo fix.
Squashed commit of the following:
commit 32bfa7c
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Jul 6 21:15:08 2015 +0200
Fixed grammer
Squashed commit of the following:
commit b24f69c
Author: Sisir Koppaka <sisir.koppaka@gmail.com>
Date: Mon Mar 2 22:38:45 2015 -0500
utils/hashtable/rehashing.c: Fix typos
Squashed commit of the following:
commit 4e04082
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Mar 23 08:22:21 2015 +0000
Small config file documentation improvements
Squashed commit of the following:
commit acb8773
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:52:48 2015 -0700
Typo and grammar fixes in readme
commit 2eb75b6
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:36:18 2015 -0700
fixed redis.conf comment
Squashed commit of the following:
commit a8249a2
Author: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Fri Dec 11 11:39:52 2015 +0530
Revise correction of typos.
Squashed commit of the following:
commit 3c02028
Author: zhaojun11 <zhaojun11@jd.com>
Date: Wed Jan 17 19:05:28 2018 +0800
Fix typos include two code typos in cluster.c and latency.c
Squashed commit of the following:
commit 9dba47c
Author: q191201771 <191201771@qq.com>
Date: Sat Jan 4 11:31:04 2020 +0800
fix function listCreate comment in adlist.c
Update src/server.c
commit 2c7c2cb536e78dd211b1ac6f7bda00f0f54faaeb
Author: charpty <charpty@gmail.com>
Date: Tue May 1 23:16:59 2018 +0800
server.c typo: modules system dictionary type comment
Signed-off-by: charpty <charpty@gmail.com>
commit a8395323fb63cb59cb3591cb0f0c8edb7c29a680
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun May 6 00:25:18 2018 +0300
Updates test_helper.tcl's help with undocumented options
Specifically:
* Host
* Port
* Client
commit bde6f9ced15755cd6407b4af7d601b030f36d60b
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 15:19:19 2018 +0800
fix comments in deps files
commit 3172474ba991532ab799ee1873439f3402412331
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 14:33:49 2018 +0800
fix some comments
commit 01b6f2b6858b5cf2ce4ad5092d2c746e755f53f0
Author: Thor Juhasz <thor@juhasz.pro>
Date: Sun Nov 18 14:37:41 2018 +0100
Minor fixes to comments
Found some parts a little unclear on a first read, which prompted me to have a better look at the file and fix some minor things I noticed.
Fixing minor typos and grammar. There are no changes to configuration options.
These changes are only meant to help the user better understand the explanations to the various configuration options
2020-09-10 13:43:38 +03:00
|
|
|
* string that this entry represents.
|
2017-01-27 16:54:20 +01:00
|
|
|
*
|
|
|
|
* The function returns the number of bytes used by the encoding/length
|
|
|
|
* header stored in 'p'. */
|
|
|
|
unsigned int zipStoreEntryEncoding(unsigned char *p, unsigned char encoding, unsigned int rawlen) {
|
2010-08-13 19:28:49 +02:00
|
|
|
unsigned char len = 1, buf[5];
|
|
|
|
|
|
|
|
if (ZIP_IS_STR(encoding)) {
|
|
|
|
/* Although encoding is given it may not be set for strings,
|
|
|
|
* so we determine it here using the raw length. */
|
|
|
|
if (rawlen <= 0x3f) {
|
2010-05-22 15:18:30 +02:00
|
|
|
if (!p) return len;
|
2010-08-13 19:28:49 +02:00
|
|
|
buf[0] = ZIP_STR_06B | rawlen;
|
|
|
|
} else if (rawlen <= 0x3fff) {
|
|
|
|
len += 1;
|
2010-05-22 15:18:30 +02:00
|
|
|
if (!p) return len;
|
2010-08-13 19:28:49 +02:00
|
|
|
buf[0] = ZIP_STR_14B | ((rawlen >> 8) & 0x3f);
|
|
|
|
buf[1] = rawlen & 0xff;
|
2010-05-22 15:18:30 +02:00
|
|
|
} else {
|
|
|
|
len += 4;
|
|
|
|
if (!p) return len;
|
2010-08-13 19:28:49 +02:00
|
|
|
buf[0] = ZIP_STR_32B;
|
|
|
|
buf[1] = (rawlen >> 24) & 0xff;
|
|
|
|
buf[2] = (rawlen >> 16) & 0xff;
|
|
|
|
buf[3] = (rawlen >> 8) & 0xff;
|
|
|
|
buf[4] = rawlen & 0xff;
|
2010-05-22 15:18:30 +02:00
|
|
|
}
|
2010-08-13 19:28:49 +02:00
|
|
|
} else {
|
|
|
|
/* Implies integer encoding, so length is always 1. */
|
|
|
|
if (!p) return len;
|
|
|
|
buf[0] = encoding;
|
2010-05-22 15:18:30 +02:00
|
|
|
}
|
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Store this length at p. */
|
2010-05-22 15:18:30 +02:00
|
|
|
memcpy(p,buf,len);
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Decode the entry encoding type and data length (string length for strings,
|
|
|
|
* number of bytes used for the integer for integer entries) encoded in 'ptr'.
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
* The 'encoding' variable is input, extracted by the caller, the 'lensize'
|
2017-01-27 16:54:20 +01:00
|
|
|
* variable will hold the number of bytes required to encode the entry
|
2020-09-08 15:51:20 +03:00
|
|
|
* length, and the 'len' variable will hold the entry length.
|
|
|
|
* On invalid encoding error, lensize is set to 0. */
|
2012-01-03 15:48:55 -08:00
|
|
|
#define ZIP_DECODE_LENGTH(ptr, encoding, lensize, len) do { \
|
|
|
|
if ((encoding) < ZIP_STR_MASK) { \
|
|
|
|
if ((encoding) == ZIP_STR_06B) { \
|
|
|
|
(lensize) = 1; \
|
|
|
|
(len) = (ptr)[0] & 0x3f; \
|
|
|
|
} else if ((encoding) == ZIP_STR_14B) { \
|
|
|
|
(lensize) = 2; \
|
|
|
|
(len) = (((ptr)[0] & 0x3f) << 8) | (ptr)[1]; \
|
2016-12-19 17:37:41 -05:00
|
|
|
} else if ((encoding) == ZIP_STR_32B) { \
|
2012-01-03 15:48:55 -08:00
|
|
|
(lensize) = 5; \
|
|
|
|
(len) = ((ptr)[1] << 24) | \
|
|
|
|
((ptr)[2] << 16) | \
|
|
|
|
((ptr)[3] << 8) | \
|
|
|
|
((ptr)[4]); \
|
|
|
|
} else { \
|
2020-09-08 15:51:20 +03:00
|
|
|
(lensize) = 0; /* bad encoding, should be covered by a previous */ \
|
|
|
|
(len) = 0; /* ZIP_ASSERT_ENCODING / zipEncodingLenSize, or */ \
|
|
|
|
/* match the lensize after this macro with 0. */ \
|
2012-01-03 15:48:55 -08:00
|
|
|
} \
|
|
|
|
} else { \
|
|
|
|
(lensize) = 1; \
|
2020-09-08 15:51:20 +03:00
|
|
|
if ((encoding) == ZIP_INT_8B) (len) = 1; \
|
|
|
|
else if ((encoding) == ZIP_INT_16B) (len) = 2; \
|
|
|
|
else if ((encoding) == ZIP_INT_24B) (len) = 3; \
|
|
|
|
else if ((encoding) == ZIP_INT_32B) (len) = 4; \
|
|
|
|
else if ((encoding) == ZIP_INT_64B) (len) = 8; \
|
|
|
|
else if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX) \
|
|
|
|
(len) = 0; /* 4 bit immediate */ \
|
|
|
|
else \
|
|
|
|
(lensize) = (len) = 0; /* bad encoding */ \
|
2012-01-03 15:48:55 -08:00
|
|
|
} \
|
2020-09-23 14:09:48 +08:00
|
|
|
} while(0)
|
2010-05-29 19:26:35 +02:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Encode the length of the previous entry and write it to "p". This only
|
|
|
|
* uses the larger encoding (required in __ziplistCascadeUpdate). */
|
|
|
|
int zipStorePrevEntryLengthLarge(unsigned char *p, unsigned int len) {
|
2020-12-24 17:58:43 +08:00
|
|
|
uint32_t u32;
|
2017-01-27 16:54:20 +01:00
|
|
|
if (p != NULL) {
|
|
|
|
p[0] = ZIP_BIG_PREVLEN;
|
2020-12-24 17:58:43 +08:00
|
|
|
u32 = len;
|
|
|
|
memcpy(p+1,&u32,sizeof(u32));
|
2017-01-27 16:54:20 +01:00
|
|
|
memrev32ifbe(p+1);
|
|
|
|
}
|
2020-12-24 17:58:43 +08:00
|
|
|
return 1 + sizeof(uint32_t);
|
2017-01-27 16:54:20 +01:00
|
|
|
}
|
|
|
|
|
2010-05-29 19:26:35 +02:00
|
|
|
/* Encode the length of the previous entry and write it to "p". Return the
|
|
|
|
* number of bytes needed to encode this length if "p" is NULL. */
|
2017-01-27 16:54:20 +01:00
|
|
|
unsigned int zipStorePrevEntryLength(unsigned char *p, unsigned int len) {
|
2010-05-29 19:26:35 +02:00
|
|
|
if (p == NULL) {
|
2020-12-24 17:58:43 +08:00
|
|
|
return (len < ZIP_BIG_PREVLEN) ? 1 : sizeof(uint32_t) + 1;
|
2010-05-29 19:26:35 +02:00
|
|
|
} else {
|
2017-01-27 16:54:20 +01:00
|
|
|
if (len < ZIP_BIG_PREVLEN) {
|
2010-05-29 19:26:35 +02:00
|
|
|
p[0] = len;
|
|
|
|
return 1;
|
|
|
|
} else {
|
2017-01-27 16:54:20 +01:00
|
|
|
return zipStorePrevEntryLengthLarge(p,len);
|
2010-05-29 19:26:35 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Return the number of bytes used to encode the length of the previous
|
|
|
|
* entry. The length is returned by setting the var 'prevlensize'. */
|
2012-01-03 15:48:55 -08:00
|
|
|
#define ZIP_DECODE_PREVLENSIZE(ptr, prevlensize) do { \
|
2017-01-27 16:54:20 +01:00
|
|
|
if ((ptr)[0] < ZIP_BIG_PREVLEN) { \
|
2012-01-03 15:48:55 -08:00
|
|
|
(prevlensize) = 1; \
|
|
|
|
} else { \
|
|
|
|
(prevlensize) = 5; \
|
|
|
|
} \
|
2020-09-23 14:09:48 +08:00
|
|
|
} while(0)
|
2012-01-03 15:48:55 -08:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Return the length of the previous element, and the number of bytes that
|
|
|
|
* are used in order to encode the previous element length.
|
|
|
|
* 'ptr' must point to the prevlen prefix of an entry (that encodes the
|
2018-07-01 13:24:50 +08:00
|
|
|
* length of the previous entry in order to navigate the elements backward).
|
2017-01-27 16:54:20 +01:00
|
|
|
* The length of the previous entry is stored in 'prevlen', the number of
|
|
|
|
* bytes needed to encode the previous entry length are stored in
|
|
|
|
* 'prevlensize'. */
|
2012-01-03 15:48:55 -08:00
|
|
|
#define ZIP_DECODE_PREVLEN(ptr, prevlensize, prevlen) do { \
|
|
|
|
ZIP_DECODE_PREVLENSIZE(ptr, prevlensize); \
|
|
|
|
if ((prevlensize) == 1) { \
|
|
|
|
(prevlen) = (ptr)[0]; \
|
2020-09-08 15:51:20 +03:00
|
|
|
} else { /* prevlensize == 5 */ \
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
(prevlen) = ((ptr)[4] << 24) | \
|
|
|
|
((ptr)[3] << 16) | \
|
|
|
|
((ptr)[2] << 8) | \
|
|
|
|
((ptr)[1]); \
|
2012-01-03 15:48:55 -08:00
|
|
|
} \
|
2020-09-23 14:09:48 +08:00
|
|
|
} while(0)
|
2012-01-03 15:48:55 -08:00
|
|
|
|
2017-01-27 16:54:20 +01:00
|
|
|
/* Given a pointer 'p' to the prevlen info that prefixes an entry, this
|
|
|
|
* function returns the difference in number of bytes needed to encode
|
|
|
|
* the prevlen if the previous entry changes of size.
|
|
|
|
*
|
|
|
|
* So if A is the number of bytes used right now to encode the 'prevlen'
|
|
|
|
* field.
|
|
|
|
*
|
|
|
|
* And B is the number of bytes that are needed in order to encode the
|
|
|
|
* 'prevlen' if the previous element will be updated to one of size 'len'.
|
|
|
|
*
|
|
|
|
* Then the function returns B - A
|
|
|
|
*
|
|
|
|
* So the function returns a positive number if more space is needed,
|
|
|
|
* a negative number if less space is needed, or zero if the same space
|
|
|
|
* is needed. */
|
2017-01-13 11:47:09 +01:00
|
|
|
int zipPrevLenByteDiff(unsigned char *p, unsigned int len) {
|
2010-05-29 15:40:40 +02:00
|
|
|
unsigned int prevlensize;
|
2012-01-03 15:48:55 -08:00
|
|
|
ZIP_DECODE_PREVLENSIZE(p, prevlensize);
|
2017-01-27 16:54:20 +01:00
|
|
|
return zipStorePrevEntryLength(NULL, len) - prevlensize;
|
2012-01-03 15:48:55 -08:00
|
|
|
}
|
|
|
|
|
2010-05-22 15:18:30 +02:00
|
|
|
/* Check if string pointed to by 'entry' can be encoded as an integer.
|
2010-07-27 15:26:08 +02:00
|
|
|
* Stores the integer value in 'v' and its encoding in 'encoding'. */
|
2017-01-13 11:47:09 +01:00
|
|
|
int zipTryEncoding(unsigned char *entry, unsigned int entrylen, long long *v, unsigned char *encoding) {
|
2010-05-22 15:18:30 +02:00
|
|
|
long long value;
|
|
|
|
|
2010-07-27 15:26:08 +02:00
|
|
|
if (entrylen >= 32 || entrylen == 0) return 0;
|
2011-04-27 13:30:32 +02:00
|
|
|
if (string2ll((char*)entry,entrylen,&value)) {
|
2010-07-27 15:26:08 +02:00
|
|
|
/* Great, the string can be encoded. Check what's the smallest
|
|
|
|
* of our encoding types that can hold this value. */
|
2012-04-24 16:54:07 +02:00
|
|
|
if (value >= 0 && value <= 12) {
|
|
|
|
*encoding = ZIP_INT_IMM_MIN+value;
|
|
|
|
} else if (value >= INT8_MIN && value <= INT8_MAX) {
|
|
|
|
*encoding = ZIP_INT_8B;
|
|
|
|
} else if (value >= INT16_MIN && value <= INT16_MAX) {
|
2010-08-13 19:28:49 +02:00
|
|
|
*encoding = ZIP_INT_16B;
|
2012-04-20 10:38:42 -04:00
|
|
|
} else if (value >= INT24_MIN && value <= INT24_MAX) {
|
|
|
|
*encoding = ZIP_INT_24B;
|
2010-06-01 18:55:37 +02:00
|
|
|
} else if (value >= INT32_MIN && value <= INT32_MAX) {
|
2010-08-13 19:28:49 +02:00
|
|
|
*encoding = ZIP_INT_32B;
|
2010-05-22 15:18:30 +02:00
|
|
|
} else {
|
2010-08-13 19:28:49 +02:00
|
|
|
*encoding = ZIP_INT_64B;
|
2010-05-22 15:18:30 +02:00
|
|
|
}
|
|
|
|
*v = value;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Store integer 'value' at 'p', encoded as 'encoding' */
|
2017-01-13 11:47:09 +01:00
|
|
|
void zipSaveInteger(unsigned char *p, int64_t value, unsigned char encoding) {
|
2010-06-01 18:55:37 +02:00
|
|
|
int16_t i16;
|
|
|
|
int32_t i32;
|
|
|
|
int64_t i64;
|
2012-04-24 16:54:07 +02:00
|
|
|
if (encoding == ZIP_INT_8B) {
|
2012-07-18 12:01:43 +02:00
|
|
|
((int8_t*)p)[0] = (int8_t)value;
|
2012-04-24 16:54:07 +02:00
|
|
|
} else if (encoding == ZIP_INT_16B) {
|
2010-06-01 18:55:37 +02:00
|
|
|
i16 = value;
|
|
|
|
memcpy(p,&i16,sizeof(i16));
|
2011-03-09 18:49:59 +01:00
|
|
|
memrev16ifbe(p);
|
2012-04-20 10:38:42 -04:00
|
|
|
} else if (encoding == ZIP_INT_24B) {
|
|
|
|
i32 = value<<8;
|
|
|
|
memrev32ifbe(&i32);
|
2012-07-18 12:01:43 +02:00
|
|
|
memcpy(p,((uint8_t*)&i32)+1,sizeof(i32)-sizeof(uint8_t));
|
2010-08-13 19:28:49 +02:00
|
|
|
} else if (encoding == ZIP_INT_32B) {
|
2010-06-01 18:55:37 +02:00
|
|
|
i32 = value;
|
|
|
|
memcpy(p,&i32,sizeof(i32));
|
2011-03-09 18:49:59 +01:00
|
|
|
memrev32ifbe(p);
|
2010-08-13 19:28:49 +02:00
|
|
|
} else if (encoding == ZIP_INT_64B) {
|
2010-06-01 18:55:37 +02:00
|
|
|
i64 = value;
|
|
|
|
memcpy(p,&i64,sizeof(i64));
|
2011-03-09 18:49:59 +01:00
|
|
|
memrev64ifbe(p);
|
2012-04-24 16:54:07 +02:00
|
|
|
} else if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX) {
|
|
|
|
/* Nothing to do, the value is stored in the encoding itself. */
|
2010-05-22 15:18:30 +02:00
|
|
|
} else {
|
|
|
|
assert(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Read integer encoded as 'encoding' from 'p' */
|
2017-01-13 11:47:09 +01:00
|
|
|
int64_t zipLoadInteger(unsigned char *p, unsigned char encoding) {
|
2010-06-01 18:55:37 +02:00
|
|
|
int16_t i16;
|
|
|
|
int32_t i32;
|
2010-12-23 11:25:56 +00:00
|
|
|
int64_t i64, ret = 0;
|
2012-04-24 16:54:07 +02:00
|
|
|
if (encoding == ZIP_INT_8B) {
|
2012-07-18 12:01:43 +02:00
|
|
|
ret = ((int8_t*)p)[0];
|
2012-04-24 16:54:07 +02:00
|
|
|
} else if (encoding == ZIP_INT_16B) {
|
2010-06-01 18:55:37 +02:00
|
|
|
memcpy(&i16,p,sizeof(i16));
|
2011-03-09 18:49:59 +01:00
|
|
|
memrev16ifbe(&i16);
|
2010-06-01 18:55:37 +02:00
|
|
|
ret = i16;
|
2010-08-13 19:28:49 +02:00
|
|
|
} else if (encoding == ZIP_INT_32B) {
|
2010-06-01 18:55:37 +02:00
|
|
|
memcpy(&i32,p,sizeof(i32));
|
2012-02-09 17:09:01 +01:00
|
|
|
memrev32ifbe(&i32);
|
2010-06-01 18:55:37 +02:00
|
|
|
ret = i32;
|
2012-04-20 10:38:42 -04:00
|
|
|
} else if (encoding == ZIP_INT_24B) {
|
|
|
|
i32 = 0;
|
2012-07-18 12:01:43 +02:00
|
|
|
memcpy(((uint8_t*)&i32)+1,p,sizeof(i32)-sizeof(uint8_t));
|
2012-04-20 10:38:42 -04:00
|
|
|
memrev32ifbe(&i32);
|
|
|
|
ret = i32>>8;
|
2010-08-13 19:28:49 +02:00
|
|
|
} else if (encoding == ZIP_INT_64B) {
|
2010-06-01 18:55:37 +02:00
|
|
|
memcpy(&i64,p,sizeof(i64));
|
2012-02-09 16:28:35 +01:00
|
|
|
memrev64ifbe(&i64);
|
2010-06-01 18:55:37 +02:00
|
|
|
ret = i64;
|
2012-04-24 16:54:07 +02:00
|
|
|
} else if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX) {
|
|
|
|
ret = (encoding & ZIP_INT_IMM_MASK)-1;
|
2010-05-22 15:18:30 +02:00
|
|
|
} else {
|
|
|
|
assert(NULL);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* Fills a struct with all information about an entry.
|
|
|
|
* This function is the "unsafe" alternative to the one blow.
|
|
|
|
* Generally, all function that return a pointer to an element in the ziplist
|
|
|
|
* will assert that this element is valid, so it can be freely used.
|
|
|
|
* Generally functions such ziplistGet assume the input pointer is already
|
|
|
|
* validated (since it's the return value of another function). */
|
2020-09-08 15:51:20 +03:00
|
|
|
static inline void zipEntry(unsigned char *p, zlentry *e) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
ZIP_DECODE_PREVLEN(p, e->prevrawlensize, e->prevrawlen);
|
|
|
|
ZIP_ENTRY_ENCODING(p + e->prevrawlensize, e->encoding);
|
|
|
|
ZIP_DECODE_LENGTH(p + e->prevrawlensize, e->encoding, e->lensize, e->len);
|
2020-09-08 15:51:20 +03:00
|
|
|
assert(e->lensize != 0); /* check that encoding was valid. */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
e->headersize = e->prevrawlensize + e->lensize;
|
|
|
|
e->p = p;
|
|
|
|
}
|
2014-11-13 22:17:57 -05:00
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* Fills a struct with all information about an entry.
|
|
|
|
* This function is safe to use on untrusted pointers, it'll make sure not to
|
|
|
|
* try to access memory outside the ziplist payload.
|
|
|
|
* Returns 1 if the entry is valid, and 0 otherwise. */
|
|
|
|
static inline int zipEntrySafe(unsigned char* zl, size_t zlbytes, unsigned char *p, zlentry *e, int validate_prevlen) {
|
2020-09-08 15:51:20 +03:00
|
|
|
unsigned char *zlfirst = zl + ZIPLIST_HEADER_SIZE;
|
|
|
|
unsigned char *zllast = zl + zlbytes - ZIPLIST_END_SIZE;
|
|
|
|
#define OUT_OF_RANGE(p) (unlikely((p) < zlfirst || (p) > zllast))
|
|
|
|
|
|
|
|
/* If threre's no possibility for the header to reach outside the ziplist,
|
|
|
|
* take the fast path. (max lensize and prevrawlensize are both 5 bytes) */
|
|
|
|
if (p >= zlfirst && p + 10 < zllast) {
|
|
|
|
ZIP_DECODE_PREVLEN(p, e->prevrawlensize, e->prevrawlen);
|
|
|
|
ZIP_ENTRY_ENCODING(p + e->prevrawlensize, e->encoding);
|
|
|
|
ZIP_DECODE_LENGTH(p + e->prevrawlensize, e->encoding, e->lensize, e->len);
|
|
|
|
e->headersize = e->prevrawlensize + e->lensize;
|
|
|
|
e->p = p;
|
|
|
|
/* We didn't call ZIP_ASSERT_ENCODING, so we check lensize was set to 0. */
|
|
|
|
if (unlikely(e->lensize == 0))
|
|
|
|
return 0;
|
|
|
|
/* Make sure the entry doesn't rech outside the edge of the ziplist */
|
|
|
|
if (OUT_OF_RANGE(p + e->headersize + e->len))
|
|
|
|
return 0;
|
|
|
|
/* Make sure prevlen doesn't rech outside the edge of the ziplist */
|
|
|
|
if (validate_prevlen && OUT_OF_RANGE(p - e->prevrawlen))
|
|
|
|
return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
|
|
|
|
/* Make sure the pointer doesn't rech outside the edge of the ziplist */
|
|
|
|
if (OUT_OF_RANGE(p))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Make sure the encoded prevlen header doesn't reach outside the allocation */
|
|
|
|
ZIP_DECODE_PREVLENSIZE(p, e->prevrawlensize);
|
|
|
|
if (OUT_OF_RANGE(p + e->prevrawlensize))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Make sure encoded entry header is valid. */
|
|
|
|
ZIP_ENTRY_ENCODING(p + e->prevrawlensize, e->encoding);
|
|
|
|
e->lensize = zipEncodingLenSize(e->encoding);
|
2020-09-08 15:51:20 +03:00
|
|
|
if (unlikely(e->lensize == ZIP_ENCODING_SIZE_INVALID))
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Make sure the encoded entry header doesn't reach outside the allocation */
|
|
|
|
if (OUT_OF_RANGE(p + e->prevrawlensize + e->lensize))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Decode the prevlen and entry len headers. */
|
2014-11-13 22:17:57 -05:00
|
|
|
ZIP_DECODE_PREVLEN(p, e->prevrawlensize, e->prevrawlen);
|
|
|
|
ZIP_DECODE_LENGTH(p + e->prevrawlensize, e->encoding, e->lensize, e->len);
|
|
|
|
e->headersize = e->prevrawlensize + e->lensize;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
|
|
|
|
/* Make sure the entry doesn't rech outside the edge of the ziplist */
|
|
|
|
if (OUT_OF_RANGE(p + e->headersize + e->len))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Make sure prevlen doesn't rech outside the edge of the ziplist */
|
|
|
|
if (validate_prevlen && OUT_OF_RANGE(p - e->prevrawlen))
|
|
|
|
return 0;
|
|
|
|
|
2014-11-13 22:17:57 -05:00
|
|
|
e->p = p;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
return 1;
|
|
|
|
#undef OUT_OF_RANGE
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the total number of bytes used by the entry pointed to by 'p'. */
|
|
|
|
static inline unsigned int zipRawEntryLengthSafe(unsigned char* zl, size_t zlbytes, unsigned char *p) {
|
|
|
|
zlentry e;
|
|
|
|
assert(zipEntrySafe(zl, zlbytes, p, &e, 0));
|
|
|
|
return e.headersize + e.len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the total number of bytes used by the entry pointed to by 'p'. */
|
|
|
|
static inline unsigned int zipRawEntryLength(unsigned char *p) {
|
|
|
|
zlentry e;
|
|
|
|
zipEntry(p, &e);
|
|
|
|
return e.headersize + e.len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Validate that the entry doesn't reach outside the ziplist allocation. */
|
|
|
|
static inline void zipAssertValidEntry(unsigned char* zl, size_t zlbytes, unsigned char *p) {
|
|
|
|
zlentry e;
|
|
|
|
assert(zipEntrySafe(zl, zlbytes, p, &e, 1));
|
2010-05-29 16:20:01 +02:00
|
|
|
}
|
|
|
|
|
2010-05-21 12:54:01 +02:00
|
|
|
/* Create a new empty ziplist. */
|
|
|
|
unsigned char *ziplistNew(void) {
|
2019-05-08 12:53:56 +08:00
|
|
|
unsigned int bytes = ZIPLIST_HEADER_SIZE+ZIPLIST_END_SIZE;
|
2010-05-21 12:54:01 +02:00
|
|
|
unsigned char *zl = zmalloc(bytes);
|
2012-02-08 22:59:35 +01:00
|
|
|
ZIPLIST_BYTES(zl) = intrev32ifbe(bytes);
|
|
|
|
ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(ZIPLIST_HEADER_SIZE);
|
2010-05-21 12:54:01 +02:00
|
|
|
ZIPLIST_LENGTH(zl) = 0;
|
|
|
|
zl[bytes-1] = ZIP_END;
|
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2010-05-22 15:18:30 +02:00
|
|
|
/* Resize the ziplist. */
|
2017-01-13 11:47:09 +01:00
|
|
|
unsigned char *ziplistResize(unsigned char *zl, unsigned int len) {
|
2010-05-22 15:18:30 +02:00
|
|
|
zl = zrealloc(zl,len);
|
2012-02-08 22:59:35 +01:00
|
|
|
ZIPLIST_BYTES(zl) = intrev32ifbe(len);
|
2010-05-21 12:54:01 +02:00
|
|
|
zl[len-1] = ZIP_END;
|
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2010-09-06 23:12:41 +02:00
|
|
|
/* When an entry is inserted, we need to set the prevlen field of the next
|
|
|
|
* entry to equal the length of the inserted entry. It can occur that this
|
|
|
|
* length cannot be encoded in 1 byte and the next entry needs to be grow
|
|
|
|
* a bit larger to hold the 5-byte encoded prevlen. This can be done for free,
|
|
|
|
* because this only happens when an entry is already being inserted (which
|
|
|
|
* causes a realloc and memmove). However, encoding the prevlen may require
|
|
|
|
* that this entry is grown as well. This effect may cascade throughout
|
|
|
|
* the ziplist when there are consecutive entries with a size close to
|
2017-01-27 16:54:20 +01:00
|
|
|
* ZIP_BIG_PREVLEN, so we need to check that the prevlen can be encoded in
|
|
|
|
* every consecutive entry.
|
2010-09-06 23:12:41 +02:00
|
|
|
*
|
|
|
|
* Note that this effect can also happen in reverse, where the bytes required
|
|
|
|
* to encode the prevlen field can shrink. This effect is deliberately ignored,
|
|
|
|
* because it can cause a "flapping" effect where a chain prevlen fields is
|
|
|
|
* first grown and then shrunk again after consecutive inserts. Rather, the
|
|
|
|
* field is allowed to stay larger than necessary, because a large prevlen
|
|
|
|
* field implies the ziplist is holding large entries anyway.
|
|
|
|
*
|
|
|
|
* The pointer "p" points to the first entry that does NOT need to be
|
|
|
|
* updated, i.e. consecutive fields MAY need an update. */
|
2017-01-13 11:47:09 +01:00
|
|
|
unsigned char *__ziplistCascadeUpdate(unsigned char *zl, unsigned char *p) {
|
2020-08-28 09:22:35 -05:00
|
|
|
zlentry cur;
|
|
|
|
size_t prevlen, prevlensize, prevoffset; /* Informat of the last changed entry. */
|
|
|
|
size_t firstentrylen; /* Used to handle insert at head. */
|
|
|
|
size_t rawlen, curlen = intrev32ifbe(ZIPLIST_BYTES(zl));
|
|
|
|
size_t extra = 0, cnt = 0, offset;
|
|
|
|
size_t delta = 4; /* Extra bytes needed to update a entry's prevlen (5-1). */
|
|
|
|
unsigned char *tail = zl + intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl));
|
|
|
|
|
|
|
|
/* Empty ziplist */
|
|
|
|
if (p[0] == ZIP_END) return zl;
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zipEntry(p, &cur); /* no need for "safe" variant since the input pointer was validated by the function that returned it. */
|
2020-08-28 09:22:35 -05:00
|
|
|
firstentrylen = prevlen = cur.headersize + cur.len;
|
|
|
|
prevlensize = zipStorePrevEntryLength(NULL, prevlen);
|
|
|
|
prevoffset = p - zl;
|
|
|
|
p += prevlen;
|
|
|
|
|
|
|
|
/* Iterate ziplist to find out how many extra bytes do we need to update it. */
|
2010-09-06 23:12:41 +02:00
|
|
|
while (p[0] != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(zipEntrySafe(zl, curlen, p, &cur, 0));
|
2010-09-06 23:12:41 +02:00
|
|
|
|
|
|
|
/* Abort when "prevlen" has not changed. */
|
2020-08-28 09:22:35 -05:00
|
|
|
if (cur.prevrawlen == prevlen) break;
|
2011-05-05 14:55:51 +02:00
|
|
|
|
2020-08-28 09:22:35 -05:00
|
|
|
/* Abort when entry's "prevlensize" is big enough. */
|
|
|
|
if (cur.prevrawlensize >= prevlensize) {
|
|
|
|
if (cur.prevrawlensize == prevlensize) {
|
|
|
|
zipStorePrevEntryLength(p, prevlen);
|
2010-09-06 23:12:41 +02:00
|
|
|
} else {
|
2020-08-28 09:22:35 -05:00
|
|
|
/* This would result in shrinking, which we want to avoid.
|
|
|
|
* So, set "prevlen" in the available bytes. */
|
|
|
|
zipStorePrevEntryLengthLarge(p, prevlen);
|
2010-09-06 23:12:41 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2020-08-28 09:22:35 -05:00
|
|
|
|
|
|
|
/* cur.prevrawlen means cur is the former head entry. */
|
|
|
|
assert(cur.prevrawlen == 0 || cur.prevrawlen + delta == prevlen);
|
|
|
|
|
|
|
|
/* Update prev entry's info and advance the cursor. */
|
|
|
|
rawlen = cur.headersize + cur.len;
|
|
|
|
prevlen = rawlen + delta;
|
|
|
|
prevlensize = zipStorePrevEntryLength(NULL, prevlen);
|
|
|
|
prevoffset = p - zl;
|
|
|
|
p += rawlen;
|
|
|
|
extra += delta;
|
|
|
|
cnt++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Extra bytes is zero all update has been done(or no need to update). */
|
|
|
|
if (extra == 0) return zl;
|
|
|
|
|
|
|
|
/* Update tail offset after loop. */
|
|
|
|
if (tail == zl + prevoffset) {
|
|
|
|
/* When the the last entry we need to update is also the tail, update tail offset
|
|
|
|
* unless this is the only entry that was updated (so the tail offset didn't change). */
|
|
|
|
if (extra - delta != 0) {
|
|
|
|
ZIPLIST_TAIL_OFFSET(zl) =
|
|
|
|
intrev32ifbe(intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl))+extra-delta);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* Update the tail offset in cases where the last entry we updated is not the tail. */
|
|
|
|
ZIPLIST_TAIL_OFFSET(zl) =
|
|
|
|
intrev32ifbe(intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl))+extra);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now "p" points at the first unchanged byte in original ziplist,
|
|
|
|
* move data after that to new ziplist. */
|
|
|
|
offset = p - zl;
|
|
|
|
zl = ziplistResize(zl, curlen + extra);
|
|
|
|
p = zl + offset;
|
|
|
|
memmove(p + extra, p, curlen - offset - 1);
|
|
|
|
p += extra;
|
|
|
|
|
|
|
|
/* Iterate all entries that need to be updated tail to head. */
|
|
|
|
while (cnt) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zipEntry(zl + prevoffset, &cur); /* no need for "safe" variant since we already iterated on all these entries above. */
|
2020-08-28 09:22:35 -05:00
|
|
|
rawlen = cur.headersize + cur.len;
|
|
|
|
/* Move entry to tail and reset prevlen. */
|
|
|
|
memmove(p - (rawlen - cur.prevrawlensize),
|
|
|
|
zl + prevoffset + cur.prevrawlensize,
|
|
|
|
rawlen - cur.prevrawlensize);
|
|
|
|
p -= (rawlen + delta);
|
|
|
|
if (cur.prevrawlen == 0) {
|
|
|
|
/* "cur" is the previous head entry, update its prevlen with firstentrylen. */
|
|
|
|
zipStorePrevEntryLength(p, firstentrylen);
|
|
|
|
} else {
|
|
|
|
/* An entry's prevlen can only increment 4 bytes. */
|
|
|
|
zipStorePrevEntryLength(p, cur.prevrawlen+delta);
|
|
|
|
}
|
|
|
|
/* Foward to previous entry. */
|
|
|
|
prevoffset -= cur.prevrawlen;
|
|
|
|
cnt--;
|
2010-09-06 23:12:41 +02:00
|
|
|
}
|
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2010-05-29 17:38:23 +02:00
|
|
|
/* Delete "num" entries, starting at "p". Returns pointer to the ziplist. */
|
2017-01-13 11:47:09 +01:00
|
|
|
unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsigned int num) {
|
2010-05-29 17:38:23 +02:00
|
|
|
unsigned int i, totlen, deleted = 0;
|
2011-03-13 18:15:57 +01:00
|
|
|
size_t offset;
|
|
|
|
int nextdiff = 0;
|
2010-09-06 23:12:41 +02:00
|
|
|
zlentry first, tail;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t zlbytes = intrev32ifbe(ZIPLIST_BYTES(zl));
|
2010-09-06 23:12:41 +02:00
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zipEntry(p, &first); /* no need for "safe" variant since the input pointer was validated by the function that returned it. */
|
2010-05-29 17:38:23 +02:00
|
|
|
for (i = 0; p[0] != ZIP_END && i < num; i++) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
p += zipRawEntryLengthSafe(zl, zlbytes, p);
|
2010-05-29 17:38:23 +02:00
|
|
|
deleted++;
|
|
|
|
}
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(p >= first.p);
|
2017-01-27 16:54:20 +01:00
|
|
|
totlen = p-first.p; /* Bytes taken by the element(s) to delete. */
|
2010-05-29 17:38:23 +02:00
|
|
|
if (totlen > 0) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
uint32_t set_tail;
|
2010-05-29 17:38:23 +02:00
|
|
|
if (p[0] != ZIP_END) {
|
2012-08-13 12:39:49 -07:00
|
|
|
/* Storing `prevrawlen` in this entry may increase or decrease the
|
|
|
|
* number of bytes required compare to the current `prevrawlen`.
|
|
|
|
* There always is room to store this, because it was previously
|
|
|
|
* stored by an entry that is now being deleted. */
|
2010-05-29 17:38:23 +02:00
|
|
|
nextdiff = zipPrevLenByteDiff(p,first.prevrawlen);
|
2017-01-27 16:54:20 +01:00
|
|
|
|
|
|
|
/* Note that there is always space when p jumps backward: if
|
|
|
|
* the new previous entry is large, one of the deleted elements
|
|
|
|
* had a 5 bytes prevlen header, so there is for sure at least
|
|
|
|
* 5 bytes free and we need just 4. */
|
2012-08-13 12:39:49 -07:00
|
|
|
p -= nextdiff;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(p >= first.p && p<zl+zlbytes-1);
|
2017-01-27 16:54:20 +01:00
|
|
|
zipStorePrevEntryLength(p,first.prevrawlen);
|
2010-05-29 17:38:23 +02:00
|
|
|
|
|
|
|
/* Update offset for tail */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
set_tail = intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl))-totlen;
|
2010-09-06 23:12:41 +02:00
|
|
|
|
|
|
|
/* When the tail contains more than one entry, we need to take
|
|
|
|
* "nextdiff" in account as well. Otherwise, a change in the
|
|
|
|
* size of prevlen doesn't have an effect on the *tail* offset. */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(zipEntrySafe(zl, zlbytes, p, &tail, 1));
|
2012-02-09 16:28:35 +01:00
|
|
|
if (p[tail.headersize+tail.len] != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
set_tail = set_tail + nextdiff;
|
2012-02-09 16:28:35 +01:00
|
|
|
}
|
2010-05-29 17:38:23 +02:00
|
|
|
|
|
|
|
/* Move tail to the front of the ziplist */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* since we asserted that p >= first.p. we know totlen >= 0,
|
|
|
|
* so we know that p > first.p and this is guaranteed not to reach
|
|
|
|
* beyond the allocation, even if the entries lens are corrupted. */
|
|
|
|
size_t bytes_to_move = zlbytes-(p-zl)-1;
|
|
|
|
memmove(first.p,p,bytes_to_move);
|
2010-05-29 17:38:23 +02:00
|
|
|
} else {
|
|
|
|
/* The entire tail was deleted. No need to move memory. */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
set_tail = (first.p-zl)-first.prevrawlen;
|
2010-05-29 17:38:23 +02:00
|
|
|
}
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* Resize the ziplist */
|
2010-09-06 23:12:41 +02:00
|
|
|
offset = first.p-zl;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zlbytes -= totlen - nextdiff;
|
|
|
|
zl = ziplistResize(zl, zlbytes);
|
2010-09-06 23:12:41 +02:00
|
|
|
p = zl+offset;
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* Update record count */
|
|
|
|
ZIPLIST_INCR_LENGTH(zl,-deleted);
|
|
|
|
|
|
|
|
/* Set the tail offset computed above */
|
|
|
|
assert(set_tail <= zlbytes - ZIPLIST_END_SIZE);
|
|
|
|
ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(set_tail);
|
|
|
|
|
2010-09-06 23:12:41 +02:00
|
|
|
/* When nextdiff != 0, the raw length of the next entry has changed, so
|
|
|
|
* we need to cascade the update throughout the ziplist */
|
|
|
|
if (nextdiff != 0)
|
|
|
|
zl = __ziplistCascadeUpdate(zl,p);
|
2010-05-29 17:38:23 +02:00
|
|
|
}
|
|
|
|
return zl;
|
2010-05-21 12:54:01 +02:00
|
|
|
}
|
|
|
|
|
2010-05-29 18:52:49 +02:00
|
|
|
/* Insert item at "p". */
|
2017-01-13 11:47:09 +01:00
|
|
|
unsigned char *__ziplistInsert(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t curlen = intrev32ifbe(ZIPLIST_BYTES(zl)), reqlen, newlen;
|
2014-01-22 21:23:54 +08:00
|
|
|
unsigned int prevlensize, prevlen = 0;
|
2011-03-13 18:15:57 +01:00
|
|
|
size_t offset;
|
|
|
|
int nextdiff = 0;
|
2010-08-13 19:28:49 +02:00
|
|
|
unsigned char encoding = 0;
|
2011-10-23 10:57:01 +02:00
|
|
|
long long value = 123456789; /* initialized to avoid warning. Using a value
|
|
|
|
that is easy to see if for some reason
|
|
|
|
we use it uninitialized. */
|
2014-01-22 21:23:54 +08:00
|
|
|
zlentry tail;
|
2010-05-21 12:54:01 +02:00
|
|
|
|
2010-05-29 18:52:49 +02:00
|
|
|
/* Find out prevlen for the entry that is inserted. */
|
|
|
|
if (p[0] != ZIP_END) {
|
2014-01-22 21:23:54 +08:00
|
|
|
ZIP_DECODE_PREVLEN(p, prevlensize, prevlen);
|
2010-05-29 15:40:40 +02:00
|
|
|
} else {
|
2010-09-06 23:12:41 +02:00
|
|
|
unsigned char *ptail = ZIPLIST_ENTRY_TAIL(zl);
|
|
|
|
if (ptail[0] != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
prevlen = zipRawEntryLengthSafe(zl, curlen, ptail);
|
2010-05-29 18:52:49 +02:00
|
|
|
}
|
2010-05-29 15:40:40 +02:00
|
|
|
}
|
|
|
|
|
2010-05-22 15:07:12 +02:00
|
|
|
/* See if the entry can be encoded */
|
2010-07-27 15:26:08 +02:00
|
|
|
if (zipTryEncoding(s,slen,&value,&encoding)) {
|
2010-08-13 19:28:49 +02:00
|
|
|
/* 'encoding' is set to the appropriate integer encoding */
|
|
|
|
reqlen = zipIntSize(encoding);
|
2010-05-22 15:07:12 +02:00
|
|
|
} else {
|
2017-01-27 16:54:20 +01:00
|
|
|
/* 'encoding' is untouched, however zipStoreEntryEncoding will use the
|
2010-08-13 19:28:49 +02:00
|
|
|
* string length to figure out how to encode it. */
|
2010-05-29 18:52:49 +02:00
|
|
|
reqlen = slen;
|
2010-05-22 15:07:12 +02:00
|
|
|
}
|
2010-05-29 15:40:40 +02:00
|
|
|
/* We need space for both the length of the previous entry and
|
|
|
|
* the length of the payload. */
|
2017-01-27 16:54:20 +01:00
|
|
|
reqlen += zipStorePrevEntryLength(NULL,prevlen);
|
|
|
|
reqlen += zipStoreEntryEncoding(NULL,encoding,slen);
|
2010-05-29 18:52:49 +02:00
|
|
|
|
|
|
|
/* When the insert position is not equal to the tail, we need to
|
|
|
|
* make sure that the next entry can hold this entry's length in
|
|
|
|
* its prevlen field. */
|
2017-01-30 16:34:08 +01:00
|
|
|
int forcelarge = 0;
|
2010-05-30 01:37:03 +02:00
|
|
|
nextdiff = (p[0] != ZIP_END) ? zipPrevLenByteDiff(p,reqlen) : 0;
|
2017-01-30 16:34:08 +01:00
|
|
|
if (nextdiff == -4 && reqlen < 4) {
|
|
|
|
nextdiff = 0;
|
|
|
|
forcelarge = 1;
|
|
|
|
}
|
2010-05-29 18:52:49 +02:00
|
|
|
|
|
|
|
/* Store offset because a realloc may change the address of zl. */
|
|
|
|
offset = p-zl;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
newlen = curlen+reqlen+nextdiff;
|
|
|
|
zl = ziplistResize(zl,newlen);
|
2010-05-29 18:52:49 +02:00
|
|
|
p = zl+offset;
|
|
|
|
|
|
|
|
/* Apply memory move when necessary and update tail offset. */
|
|
|
|
if (p[0] != ZIP_END) {
|
|
|
|
/* Subtract one because of the ZIP_END bytes */
|
|
|
|
memmove(p+reqlen,p-nextdiff,curlen-offset-1+nextdiff);
|
2010-09-06 23:12:41 +02:00
|
|
|
|
2010-05-29 18:52:49 +02:00
|
|
|
/* Encode this entry's raw length in the next entry. */
|
2017-01-30 16:34:08 +01:00
|
|
|
if (forcelarge)
|
|
|
|
zipStorePrevEntryLengthLarge(p+reqlen,reqlen);
|
2017-02-01 17:01:31 +01:00
|
|
|
else
|
|
|
|
zipStorePrevEntryLength(p+reqlen,reqlen);
|
2010-09-06 23:12:41 +02:00
|
|
|
|
2010-05-29 18:52:49 +02:00
|
|
|
/* Update offset for tail */
|
2012-02-09 16:28:35 +01:00
|
|
|
ZIPLIST_TAIL_OFFSET(zl) =
|
|
|
|
intrev32ifbe(intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl))+reqlen);
|
2010-09-06 23:12:41 +02:00
|
|
|
|
|
|
|
/* When the tail contains more than one entry, we need to take
|
|
|
|
* "nextdiff" in account as well. Otherwise, a change in the
|
|
|
|
* size of prevlen doesn't have an effect on the *tail* offset. */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(zipEntrySafe(zl, newlen, p+reqlen, &tail, 1));
|
2012-02-09 16:28:35 +01:00
|
|
|
if (p[reqlen+tail.headersize+tail.len] != ZIP_END) {
|
|
|
|
ZIPLIST_TAIL_OFFSET(zl) =
|
|
|
|
intrev32ifbe(intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl))+nextdiff);
|
|
|
|
}
|
2010-05-21 12:54:01 +02:00
|
|
|
} else {
|
2010-05-29 18:52:49 +02:00
|
|
|
/* This element will be the new tail. */
|
2012-02-08 22:59:35 +01:00
|
|
|
ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(p-zl);
|
2010-05-29 15:40:40 +02:00
|
|
|
}
|
|
|
|
|
2010-09-06 23:12:41 +02:00
|
|
|
/* When nextdiff != 0, the raw length of the next entry has changed, so
|
|
|
|
* we need to cascade the update throughout the ziplist */
|
|
|
|
if (nextdiff != 0) {
|
|
|
|
offset = p-zl;
|
|
|
|
zl = __ziplistCascadeUpdate(zl,p+reqlen);
|
|
|
|
p = zl+offset;
|
|
|
|
}
|
|
|
|
|
2010-05-21 12:54:01 +02:00
|
|
|
/* Write the entry */
|
2017-01-27 16:54:20 +01:00
|
|
|
p += zipStorePrevEntryLength(p,prevlen);
|
|
|
|
p += zipStoreEntryEncoding(p,encoding,slen);
|
2010-08-13 19:28:49 +02:00
|
|
|
if (ZIP_IS_STR(encoding)) {
|
2010-05-29 18:52:49 +02:00
|
|
|
memcpy(p,s,slen);
|
2010-08-13 19:28:49 +02:00
|
|
|
} else {
|
|
|
|
zipSaveInteger(p,value,encoding);
|
2010-05-22 15:07:12 +02:00
|
|
|
}
|
2010-05-22 14:58:58 +02:00
|
|
|
ZIPLIST_INCR_LENGTH(zl,1);
|
2010-05-21 12:54:01 +02:00
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2014-11-21 14:52:10 -05:00
|
|
|
/* Merge ziplists 'first' and 'second' by appending 'second' to 'first'.
|
|
|
|
*
|
|
|
|
* NOTE: The larger ziplist is reallocated to contain the new merged ziplist.
|
|
|
|
* Either 'first' or 'second' can be used for the result. The parameter not
|
|
|
|
* used will be free'd and set to NULL.
|
|
|
|
*
|
|
|
|
* After calling this function, the input parameters are no longer valid since
|
|
|
|
* they are changed and free'd in-place.
|
|
|
|
*
|
|
|
|
* The result ziplist is the contents of 'first' followed by 'second'.
|
|
|
|
*
|
|
|
|
* On failure: returns NULL if the merge is impossible.
|
|
|
|
* On success: returns the merged ziplist (which is expanded version of either
|
|
|
|
* 'first' or 'second', also frees the other unused input ziplist, and sets the
|
|
|
|
* input ziplist argument equal to newly reallocated ziplist return value. */
|
|
|
|
unsigned char *ziplistMerge(unsigned char **first, unsigned char **second) {
|
|
|
|
/* If any params are null, we can't merge, so NULL. */
|
|
|
|
if (first == NULL || *first == NULL || second == NULL || *second == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* Can't merge same list into itself. */
|
|
|
|
if (*first == *second)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
size_t first_bytes = intrev32ifbe(ZIPLIST_BYTES(*first));
|
|
|
|
size_t first_len = intrev16ifbe(ZIPLIST_LENGTH(*first));
|
|
|
|
|
|
|
|
size_t second_bytes = intrev32ifbe(ZIPLIST_BYTES(*second));
|
|
|
|
size_t second_len = intrev16ifbe(ZIPLIST_LENGTH(*second));
|
|
|
|
|
|
|
|
int append;
|
|
|
|
unsigned char *source, *target;
|
|
|
|
size_t target_bytes, source_bytes;
|
|
|
|
/* Pick the largest ziplist so we can resize easily in-place.
|
|
|
|
* We must also track if we are now appending or prepending to
|
|
|
|
* the target ziplist. */
|
|
|
|
if (first_len >= second_len) {
|
|
|
|
/* retain first, append second to first. */
|
|
|
|
target = *first;
|
|
|
|
target_bytes = first_bytes;
|
|
|
|
source = *second;
|
|
|
|
source_bytes = second_bytes;
|
|
|
|
append = 1;
|
|
|
|
} else {
|
|
|
|
/* else, retain second, prepend first to second. */
|
|
|
|
target = *second;
|
|
|
|
target_bytes = second_bytes;
|
|
|
|
source = *first;
|
|
|
|
source_bytes = first_bytes;
|
|
|
|
append = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Calculate final bytes (subtract one pair of metadata) */
|
|
|
|
size_t zlbytes = first_bytes + second_bytes -
|
|
|
|
ZIPLIST_HEADER_SIZE - ZIPLIST_END_SIZE;
|
|
|
|
size_t zllength = first_len + second_len;
|
|
|
|
|
|
|
|
/* Combined zl length should be limited within UINT16_MAX */
|
|
|
|
zllength = zllength < UINT16_MAX ? zllength : UINT16_MAX;
|
|
|
|
|
|
|
|
/* Save offset positions before we start ripping memory apart. */
|
|
|
|
size_t first_offset = intrev32ifbe(ZIPLIST_TAIL_OFFSET(*first));
|
|
|
|
size_t second_offset = intrev32ifbe(ZIPLIST_TAIL_OFFSET(*second));
|
|
|
|
|
|
|
|
/* Extend target to new zlbytes then append or prepend source. */
|
|
|
|
target = zrealloc(target, zlbytes);
|
|
|
|
if (append) {
|
|
|
|
/* append == appending to target */
|
|
|
|
/* Copy source after target (copying over original [END]):
|
|
|
|
* [TARGET - END, SOURCE - HEADER] */
|
|
|
|
memcpy(target + target_bytes - ZIPLIST_END_SIZE,
|
|
|
|
source + ZIPLIST_HEADER_SIZE,
|
|
|
|
source_bytes - ZIPLIST_HEADER_SIZE);
|
|
|
|
} else {
|
|
|
|
/* !append == prepending to target */
|
|
|
|
/* Move target *contents* exactly size of (source - [END]),
|
Squash merging 125 typo/grammar/comment/doc PRs (#7773)
List of squashed commits or PRs
===============================
commit 66801ea
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Jan 13 00:54:31 2020 -0500
typo fix in acl.c
commit 46f55db
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun Sep 6 18:24:11 2020 +0300
Updates a couple of comments
Specifically:
* RM_AutoMemory completed instead of pointing to docs
* Updated link to custom type doc
commit 61a2aa0
Author: xindoo <xindoo@qq.com>
Date: Tue Sep 1 19:24:59 2020 +0800
Correct errors in code comments
commit a5871d1
Author: yz1509 <pro-756@qq.com>
Date: Tue Sep 1 18:36:06 2020 +0800
fix typos in module.c
commit 41eede7
Author: bookug <bookug@qq.com>
Date: Sat Aug 15 01:11:33 2020 +0800
docs: fix typos in comments
commit c303c84
Author: lazy-snail <ws.niu@outlook.com>
Date: Fri Aug 7 11:15:44 2020 +0800
fix spelling in redis.conf
commit 1eb76bf
Author: zhujian <zhujianxyz@gmail.com>
Date: Thu Aug 6 15:22:10 2020 +0800
add a missing 'n' in comment
commit 1530ec2
Author: Daniel Dai <764122422@qq.com>
Date: Mon Jul 27 00:46:35 2020 -0400
fix spelling in tracking.c
commit e517b31
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:32 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit c300eff
Author: Hunter-Chen <huntcool001@gmail.com>
Date: Fri Jul 17 22:33:23 2020 +0800
Update redis.conf
Co-authored-by: Itamar Haber <itamar@redislabs.com>
commit 4c058a8
Author: 陈浩鹏 <chenhaopeng@heytea.com>
Date: Thu Jun 25 19:00:56 2020 +0800
Grammar fix and clarification
commit 5fcaa81
Author: bodong.ybd <bodong.ybd@alibaba-inc.com>
Date: Fri Jun 19 10:09:00 2020 +0800
Fix typos
commit 4caca9a
Author: Pruthvi P <pruthvi@ixigo.com>
Date: Fri May 22 00:33:22 2020 +0530
Fix typo eviciton => eviction
commit b2a25f6
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Sun May 17 12:39:59 2020 -0400
Fix a typo.
commit 12842ae
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun May 3 17:16:59 2020 -0400
fix spelling in redis conf
commit ddba07c
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Sat May 2 23:25:34 2020 +0100
Correct a "conflicts" spelling error.
commit 8fc7bf2
Author: Nao YONASHIRO <yonashiro@r.recruit.co.jp>
Date: Thu Apr 30 10:25:27 2020 +0900
docs: fix EXPIRE_FAST_CYCLE_DURATION to ACTIVE_EXPIRE_CYCLE_FAST_DURATION
commit 9b2b67a
Author: Brad Dunbar <dunbarb2@gmail.com>
Date: Fri Apr 24 11:46:22 2020 -0400
Fix a typo.
commit 0746f10
Author: devilinrust <63737265+devilinrust@users.noreply.github.com>
Date: Thu Apr 16 00:17:53 2020 +0200
Fix typos in server.c
commit 92b588d
Author: benjessop12 <56115861+benjessop12@users.noreply.github.com>
Date: Mon Apr 13 13:43:55 2020 +0100
Fix spelling mistake in lazyfree.c
commit 1da37aa
Merge: 2d4ba28 af347a8
Author: hwware <wen.hui.ware@gmail.com>
Date: Thu Mar 5 22:41:31 2020 -0500
Merge remote-tracking branch 'upstream/unstable' into expiretypofix
commit 2d4ba28
Author: hwware <wen.hui.ware@gmail.com>
Date: Mon Mar 2 00:09:40 2020 -0500
fix typo in expire.c
commit 1a746f7
Author: SennoYuki <minakami1yuki@gmail.com>
Date: Thu Feb 27 16:54:32 2020 +0800
fix typo
commit 8599b1a
Author: dongheejeong <donghee950403@gmail.com>
Date: Sun Feb 16 20:31:43 2020 +0000
Fix typo in server.c
commit f38d4e8
Author: hwware <wen.hui.ware@gmail.com>
Date: Sun Feb 2 22:58:38 2020 -0500
fix typo in evict.c
commit fe143fc
Author: Leo Murillo <leonardo.murillo@gmail.com>
Date: Sun Feb 2 01:57:22 2020 -0600
Fix a few typos in redis.conf
commit 1ab4d21
Author: viraja1 <anchan.viraj@gmail.com>
Date: Fri Dec 27 17:15:58 2019 +0530
Fix typo in Latency API docstring
commit ca1f70e
Author: gosth <danxuedexing@qq.com>
Date: Wed Dec 18 15:18:02 2019 +0800
fix typo in sort.c
commit a57c06b
Author: ZYunH <zyunhjob@163.com>
Date: Mon Dec 16 22:28:46 2019 +0800
fix-zset-typo
commit b8c92b5
Author: git-hulk <hulk.website@gmail.com>
Date: Mon Dec 16 15:51:42 2019 +0800
FIX: typo in cluster.c, onformation->information
commit 9dd981c
Author: wujm2007 <jim.wujm@gmail.com>
Date: Mon Dec 16 09:37:52 2019 +0800
Fix typo
commit e132d7a
Author: Sebastien Williams-Wynn <s.williamswynn.mail@gmail.com>
Date: Fri Nov 15 00:14:07 2019 +0000
Minor typo change
commit 47f44d5
Author: happynote3966 <01ssrmikururudevice01@gmail.com>
Date: Mon Nov 11 22:08:48 2019 +0900
fix comment typo in redis-cli.c
commit b8bdb0d
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 18:00:17 2019 +0800
Fix a spelling mistake of comments in defragDictBucketCallback
commit 0def46a
Author: fulei <fulei@kuaishou.com>
Date: Wed Oct 16 13:09:27 2019 +0800
fix some spelling mistakes of comments in defrag.c
commit f3596fd
Author: Phil Rajchgot <tophil@outlook.com>
Date: Sun Oct 13 02:02:32 2019 -0400
Typo and grammar fixes
Redis and its documentation are great -- just wanted to submit a few corrections in the spirit of Hacktoberfest. Thanks for all your work on this project. I use it all the time and it works beautifully.
commit 2b928cd
Author: KangZhiDong <worldkzd@gmail.com>
Date: Sun Sep 1 07:03:11 2019 +0800
fix typos
commit 33aea14
Author: Axlgrep <axlgrep@gmail.com>
Date: Tue Aug 27 11:02:18 2019 +0800
Fixed eviction spelling issues
commit e282a80
Author: Simen Flatby <simen@oms.no>
Date: Tue Aug 20 15:25:51 2019 +0200
Update comments to reflect prop name
In the comments the prop is referenced as replica-validity-factor,
but it is really named cluster-replica-validity-factor.
commit 74d1f9a
Author: Jim Green <jimgreen2013@qq.com>
Date: Tue Aug 20 20:00:31 2019 +0800
fix comment error, the code is ok
commit eea1407
Author: Liao Tonglang <liaotonglang@gmail.com>
Date: Fri May 31 10:16:18 2019 +0800
typo fix
fix cna't to can't
commit 0da553c
Author: KAWACHI Takashi <tkawachi@gmail.com>
Date: Wed Jul 17 00:38:16 2019 +0900
Fix typo
commit 7fc8fb6
Author: Michael Prokop <mika@grml.org>
Date: Tue May 28 17:58:42 2019 +0200
Typo fixes
s/familar/familiar/
s/compatiblity/compatibility/
s/ ot / to /
s/itsef/itself/
commit 5f46c9d
Author: zhumoing <34539422+zhumoing@users.noreply.github.com>
Date: Tue May 21 21:16:50 2019 +0800
typo-fixes
typo-fixes
commit 321dfe1
Author: wxisme <850885154@qq.com>
Date: Sat Mar 16 15:10:55 2019 +0800
typo fix
commit b4fb131
Merge: 267e0e6 3df1eb8
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Fri Feb 8 22:55:45 2019 +0200
Merge branch 'unstable' of antirez/redis into unstable
commit 267e0e6
Author: Nikitas Bastas <nikitasbst@gmail.com>
Date: Wed Jan 30 21:26:04 2019 +0200
Minor typo fix
commit 30544e7
Author: inshal96 <39904558+inshal96@users.noreply.github.com>
Date: Fri Jan 4 16:54:50 2019 +0500
remove an extra 'a' in the comments
commit 337969d
Author: BrotherGao <yangdongheng11@gmail.com>
Date: Sat Dec 29 12:37:29 2018 +0800
fix typo in redis.conf
commit 9f4b121
Merge: 423a030 e504583
Author: BrotherGao <yangdongheng@xiaomi.com>
Date: Sat Dec 29 11:41:12 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 423a030
Merge: 42b02b7 46a51cd
Author: 杨东衡 <yangdongheng@xiaomi.com>
Date: Tue Dec 4 23:56:11 2018 +0800
Merge branch 'unstable' of antirez/redis into unstable
commit 42b02b7
Merge: 68c0e6e b8febe6
Author: Dongheng Yang <yangdongheng11@gmail.com>
Date: Sun Oct 28 15:54:23 2018 +0800
Merge pull request #1 from antirez/unstable
update local data
commit 714b589
Author: Christian <crifei93@gmail.com>
Date: Fri Dec 28 01:17:26 2018 +0100
fix typo "resulution"
commit e23259d
Author: garenchan <1412950785@qq.com>
Date: Wed Dec 26 09:58:35 2018 +0800
fix typo: segfauls -> segfault
commit a9359f8
Author: xjp <jianping_xie@aliyun.com>
Date: Tue Dec 18 17:31:44 2018 +0800
Fixed REDISMODULE_H spell bug
commit a12c3e4
Author: jdiaz <jrd.palacios@gmail.com>
Date: Sat Dec 15 23:39:52 2018 -0600
Fixes hyperloglog hash function comment block description
commit 770eb11
Author: 林上耀 <1210tom@163.com>
Date: Sun Nov 25 17:16:10 2018 +0800
fix typo
commit fd97fbb
Author: Chris Lamb <chris@chris-lamb.co.uk>
Date: Fri Nov 23 17:14:01 2018 +0100
Correct "unsupported" typo.
commit a85522d
Author: Jungnam Lee <jungnam.lee@oracle.com>
Date: Thu Nov 8 23:01:29 2018 +0900
fix typo in test comments
commit ade8007
Author: Arun Kumar <palerdot@users.noreply.github.com>
Date: Tue Oct 23 16:56:35 2018 +0530
Fixed grammatical typo
Fixed typo for word 'dictionary'
commit 869ee39
Author: Hamid Alaei <hamid.a85@gmail.com>
Date: Sun Aug 12 16:40:02 2018 +0430
fix documentations: (ThreadSafeContextStart/Stop -> ThreadSafeContextLock/Unlock), minor typo
commit f89d158
Author: Mayank Jain <mayankjain255@gmail.com>
Date: Tue Jul 31 23:01:21 2018 +0530
Updated README.md with some spelling corrections.
Made correction in spelling of some misspelled words.
commit 892198e
Author: dsomeshwar <someshwar.dhayalan@gmail.com>
Date: Sat Jul 21 23:23:04 2018 +0530
typo fix
commit 8a4d780
Author: Itamar Haber <itamar@redislabs.com>
Date: Mon Apr 30 02:06:52 2018 +0300
Fixes some typos
commit e3acef6
Author: Noah Rosamilia <ivoahivoah@gmail.com>
Date: Sat Mar 3 23:41:21 2018 -0500
Fix typo in /deps/README.md
commit 04442fb
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:32:42 2018 +0800
Fix typo in readSyncBulkPayload() comment.
commit 9f36880
Author: WuYunlong <xzsyeb@126.com>
Date: Sat Mar 3 10:20:37 2018 +0800
replication.c comment: run_id -> replid.
commit f866b4a
Author: Francesco 'makevoid' Canessa <makevoid@gmail.com>
Date: Thu Feb 22 22:01:56 2018 +0000
fix comment typo in server.c
commit 0ebc69b
Author: 줍 <jubee0124@gmail.com>
Date: Mon Feb 12 16:38:48 2018 +0900
Fix typo in redis.conf
Fix `five behaviors` to `eight behaviors` in [this sentence ](antirez/redis@unstable/redis.conf#L564)
commit b50a620
Author: martinbroadhurst <martinbroadhurst@users.noreply.github.com>
Date: Thu Dec 28 12:07:30 2017 +0000
Fix typo in valgrind.sup
commit 7d8f349
Author: Peter Boughton <peter@sorcerersisle.com>
Date: Mon Nov 27 19:52:19 2017 +0000
Update CONTRIBUTING; refer doc updates to redis-doc repo.
commit 02dec7e
Author: Klauswk <klauswk1@hotmail.com>
Date: Tue Oct 24 16:18:38 2017 -0200
Fix typo in comment
commit e1efbc8
Author: chenshi <baiwfg2@gmail.com>
Date: Tue Oct 3 18:26:30 2017 +0800
Correct two spelling errors of comments
commit 93327d8
Author: spacewander <spacewanderlzx@gmail.com>
Date: Wed Sep 13 16:47:24 2017 +0800
Update the comment for OBJ_ENCODING_EMBSTR_SIZE_LIMIT's value
The value of OBJ_ENCODING_EMBSTR_SIZE_LIMIT is 44 now instead of 39.
commit 63d361f
Author: spacewander <spacewanderlzx@gmail.com>
Date: Tue Sep 12 15:06:42 2017 +0800
Fix <prevlen> related doc in ziplist.c
According to the definition of ZIP_BIG_PREVLEN and other related code,
the guard of single byte <prevlen> should be 254 instead of 255.
commit ebe228d
Author: hanael80 <hanael80@gmail.com>
Date: Tue Aug 15 09:09:40 2017 +0900
Fix typo
commit 6b696e6
Author: Matt Robenolt <matt@ydekproductions.com>
Date: Mon Aug 14 14:50:47 2017 -0700
Fix typo in LATENCY DOCTOR output
commit a2ec6ae
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 15 14:15:16 2017 +0800
Fix a typo: form => from
commit 3ab7699
Author: caosiyang <caosiyang@qiyi.com>
Date: Thu Aug 10 18:40:33 2017 +0800
Fix a typo: replicationFeedSlavesFromMaster() => replicationFeedSlavesFromMasterStream()
commit 72d43ef
Author: caosiyang <caosiyang@qiyi.com>
Date: Tue Aug 8 15:57:25 2017 +0800
fix a typo: servewr => server
commit 707c958
Author: Bo Cai <charpty@gmail.com>
Date: Wed Jul 26 21:49:42 2017 +0800
redis-cli.c typo: conut -> count.
Signed-off-by: Bo Cai <charpty@gmail.com>
commit b9385b2
Author: JackDrogon <jack.xsuperman@gmail.com>
Date: Fri Jun 30 14:22:31 2017 +0800
Fix some spell problems
commit 20d9230
Author: akosel <aaronjkosel@gmail.com>
Date: Sun Jun 4 19:35:13 2017 -0500
Fix typo
commit b167bfc
Author: Krzysiek Witkowicz <krzysiekwitkowicz@gmail.com>
Date: Mon May 22 21:32:27 2017 +0100
Fix #4008 small typo in comment
commit 2b78ac8
Author: Jake Clarkson <jacobwclarkson@gmail.com>
Date: Wed Apr 26 15:49:50 2017 +0100
Correct typo in tests/unit/hyperloglog.tcl
commit b0f1cdb
Author: Qi Luo <qiluo-msft@users.noreply.github.com>
Date: Wed Apr 19 14:25:18 2017 -0700
Fix typo
commit a90b0f9
Author: charsyam <charsyam@naver.com>
Date: Thu Mar 16 18:19:53 2017 +0900
fix typos
fix typos
fix typos
commit 8430a79
Author: Richard Hart <richardhart92@gmail.com>
Date: Mon Mar 13 22:17:41 2017 -0400
Fixed log message typo in listenToPort.
commit 481a1c2
Author: Vinod Kumar <kumar003vinod@gmail.com>
Date: Sun Jan 15 23:04:51 2017 +0530
src/db.c: Correct "save" -> "safe" typo
commit 586b4d3
Author: wangshaonan <wshn13@gmail.com>
Date: Wed Dec 21 20:28:27 2016 +0800
Fix typo they->the in helloworld.c
commit c1c4b5e
Author: Jenner <hypxm@qq.com>
Date: Mon Dec 19 16:39:46 2016 +0800
typo error
commit 1ee1a3f
Author: tielei <43289893@qq.com>
Date: Mon Jul 18 13:52:25 2016 +0800
fix some comments
commit 11a41fb
Author: Otto Kekäläinen <otto@seravo.fi>
Date: Sun Jul 3 10:23:55 2016 +0100
Fix spelling in documentation and comments
commit 5fb5d82
Author: francischan <f1ancis621@gmail.com>
Date: Tue Jun 28 00:19:33 2016 +0800
Fix outdated comments about redis.c file.
It should now refer to server.c file.
commit 6b254bc
Author: lmatt-bit <lmatt123n@gmail.com>
Date: Thu Apr 21 21:45:58 2016 +0800
Refine the comment of dictRehashMilliseconds func
SLAVECONF->REPLCONF in comment - by andyli029
commit ee9869f
Author: clark.kang <charsyam@naver.com>
Date: Tue Mar 22 11:09:51 2016 +0900
fix typos
commit f7b3b11
Author: Harisankar H <harisankarh@gmail.com>
Date: Wed Mar 9 11:49:42 2016 +0530
Typo correction: "faield" --> "failed"
Typo correction: "faield" --> "failed"
commit 3fd40fc
Author: Itamar Haber <itamar@redislabs.com>
Date: Thu Feb 25 10:31:51 2016 +0200
Fixes a typo in comments
commit 621c160
Author: Prayag Verma <prayag.verma@gmail.com>
Date: Mon Feb 1 12:36:20 2016 +0530
Fix typo in Readme.md
Spelling mistakes -
`eviciton` > `eviction`
`familar` > `familiar`
commit d7d07d6
Author: WonCheol Lee <toctoc21c@gmail.com>
Date: Wed Dec 30 15:11:34 2015 +0900
Typo fixed
commit a4dade7
Author: Felix Bünemann <buenemann@louis.info>
Date: Mon Dec 28 11:02:55 2015 +0100
[ci skip] Improve supervised upstart config docs
This mentions that "expect stop" is required for supervised upstart
to work correctly. See http://upstart.ubuntu.com/cookbook/#expect-stop
for an explanation.
commit d9caba9
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:30:03 2015 +1100
README: Remove trailing whitespace
commit 72d42e5
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:32 2015 +1100
README: Fix typo. th => the
commit dd6e957
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:29:20 2015 +1100
README: Fix typo. familar => familiar
commit 3a12b23
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:28:54 2015 +1100
README: Fix typo. eviciton => eviction
commit 2d1d03b
Author: daurnimator <quae@daurnimator.com>
Date: Mon Dec 21 18:21:45 2015 +1100
README: Fix typo. sever => server
commit 3973b06
Author: Itamar Haber <itamar@garantiadata.com>
Date: Sat Dec 19 17:01:20 2015 +0200
Typo fix
commit 4f2e460
Author: Steve Gao <fu@2token.com>
Date: Fri Dec 4 10:22:05 2015 +0800
Update README - fix typos
commit b21667c
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:48:37 2015 +0800
delete redundancy color judge in sdscatcolor
commit 88894c7
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 22:14:42 2015 +0800
the example output shoule be HelloWorld
commit 2763470
Author: binyan <binbin.yan@nokia.com>
Date: Wed Dec 2 17:41:39 2015 +0800
modify error word keyevente
Signed-off-by: binyan <binbin.yan@nokia.com>
commit 0847b3d
Author: Bruno Martins <bscmartins@gmail.com>
Date: Wed Nov 4 11:37:01 2015 +0000
typo
commit bbb9e9e
Author: dawedawe <dawedawe@gmx.de>
Date: Fri Mar 27 00:46:41 2015 +0100
typo: zimap -> zipmap
commit 5ed297e
Author: Axel Advento <badwolf.bloodseeker.rev@gmail.com>
Date: Tue Mar 3 15:58:29 2015 +0800
Fix 'salve' typos to 'slave'
commit edec9d6
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Wed Jun 12 14:12:47 2019 +0200
Update README.md
Co-Authored-By: Qix <Qix-@users.noreply.github.com>
commit 692a7af
Author: LudwikJaniuk <ludvig.janiuk@gmail.com>
Date: Tue May 28 14:32:04 2019 +0200
grammar
commit d962b0a
Author: Nick Frost <nickfrostatx@gmail.com>
Date: Wed Jul 20 15:17:12 2016 -0700
Minor grammar fix
commit 24fff01aaccaf5956973ada8c50ceb1462e211c6 (typos)
Author: Chad Miller <chadm@squareup.com>
Date: Tue Sep 8 13:46:11 2020 -0400
Fix faulty comment about operation of unlink()
commit 3cd5c1f3326c52aa552ada7ec797c6bb16452355
Author: Kevin <kevin.xgr@gmail.com>
Date: Wed Nov 20 00:13:50 2019 +0800
Fix typo in server.c.
From a83af59 Mon Sep 17 00:00:00 2001
From: wuwo <wuwo@wacai.com>
Date: Fri, 17 Mar 2017 20:37:45 +0800
Subject: [PATCH] falure to failure
From c961896 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B7=A6=E6=87=B6?= <veficos@gmail.com>
Date: Sat, 27 May 2017 15:33:04 +0800
Subject: [PATCH] fix typo
From e600ef2 Mon Sep 17 00:00:00 2001
From: "rui.zou" <rui.zou@yunify.com>
Date: Sat, 30 Sep 2017 12:38:15 +0800
Subject: [PATCH] fix a typo
From c7d07fa Mon Sep 17 00:00:00 2001
From: Alexandre Perrin <alex@kaworu.ch>
Date: Thu, 16 Aug 2018 10:35:31 +0200
Subject: [PATCH] deps README.md typo
From b25cb67 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 10:55:37 +0300
Subject: [PATCH 1/2] fix typos in header
From ad28ca6 Mon Sep 17 00:00:00 2001
From: Guy Korland <gkorland@gmail.com>
Date: Wed, 26 Sep 2018 11:02:36 +0300
Subject: [PATCH 2/2] fix typos
commit 34924cdedd8552466fc22c1168d49236cb7ee915
Author: Adrian Lynch <adi_ady_ade@hotmail.com>
Date: Sat Apr 4 21:59:15 2015 +0100
Typos fixed
commit fd2a1e7
Author: Jan <jsteemann@users.noreply.github.com>
Date: Sat Oct 27 19:13:01 2018 +0200
Fix typos
Fix typos
commit e14e47c1a234b53b0e103c5f6a1c61481cbcbb02
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:30:07 2019 -0500
Fix multiple misspellings of "following"
commit 79b948ce2dac6b453fe80995abbcaac04c213d5a
Author: Andy Lester <andy@petdance.com>
Date: Fri Aug 2 22:24:28 2019 -0500
Fix misspelling of create-cluster
commit 1fffde52666dc99ab35efbd31071a4c008cb5a71
Author: Andy Lester <andy@petdance.com>
Date: Wed Jul 31 17:57:56 2019 -0500
Fix typos
commit 204c9ba9651e9e05fd73936b452b9a30be456cfe
Author: Xiaobo Zhu <xiaobo.zhu@shopee.com>
Date: Tue Aug 13 22:19:25 2019 +0800
fix typos
Squashed commit of the following:
commit 1d9aaf8
Author: danmedani <danmedani@gmail.com>
Date: Sun Aug 2 11:40:26 2015 -0700
README typo fix.
Squashed commit of the following:
commit 32bfa7c
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Jul 6 21:15:08 2015 +0200
Fixed grammer
Squashed commit of the following:
commit b24f69c
Author: Sisir Koppaka <sisir.koppaka@gmail.com>
Date: Mon Mar 2 22:38:45 2015 -0500
utils/hashtable/rehashing.c: Fix typos
Squashed commit of the following:
commit 4e04082
Author: Erik Dubbelboer <erik@dubbelboer.com>
Date: Mon Mar 23 08:22:21 2015 +0000
Small config file documentation improvements
Squashed commit of the following:
commit acb8773
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:52:48 2015 -0700
Typo and grammar fixes in readme
commit 2eb75b6
Author: ctd1500 <ctd1500@gmail.com>
Date: Fri May 8 01:36:18 2015 -0700
fixed redis.conf comment
Squashed commit of the following:
commit a8249a2
Author: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Fri Dec 11 11:39:52 2015 +0530
Revise correction of typos.
Squashed commit of the following:
commit 3c02028
Author: zhaojun11 <zhaojun11@jd.com>
Date: Wed Jan 17 19:05:28 2018 +0800
Fix typos include two code typos in cluster.c and latency.c
Squashed commit of the following:
commit 9dba47c
Author: q191201771 <191201771@qq.com>
Date: Sat Jan 4 11:31:04 2020 +0800
fix function listCreate comment in adlist.c
Update src/server.c
commit 2c7c2cb536e78dd211b1ac6f7bda00f0f54faaeb
Author: charpty <charpty@gmail.com>
Date: Tue May 1 23:16:59 2018 +0800
server.c typo: modules system dictionary type comment
Signed-off-by: charpty <charpty@gmail.com>
commit a8395323fb63cb59cb3591cb0f0c8edb7c29a680
Author: Itamar Haber <itamar@redislabs.com>
Date: Sun May 6 00:25:18 2018 +0300
Updates test_helper.tcl's help with undocumented options
Specifically:
* Host
* Port
* Client
commit bde6f9ced15755cd6407b4af7d601b030f36d60b
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 15:19:19 2018 +0800
fix comments in deps files
commit 3172474ba991532ab799ee1873439f3402412331
Author: wxisme <850885154@qq.com>
Date: Wed Aug 8 14:33:49 2018 +0800
fix some comments
commit 01b6f2b6858b5cf2ce4ad5092d2c746e755f53f0
Author: Thor Juhasz <thor@juhasz.pro>
Date: Sun Nov 18 14:37:41 2018 +0100
Minor fixes to comments
Found some parts a little unclear on a first read, which prompted me to have a better look at the file and fix some minor things I noticed.
Fixing minor typos and grammar. There are no changes to configuration options.
These changes are only meant to help the user better understand the explanations to the various configuration options
2020-09-10 13:43:38 +03:00
|
|
|
* then copy source into vacated space (source - [END]):
|
2014-11-21 14:52:10 -05:00
|
|
|
* [SOURCE - END, TARGET - HEADER] */
|
|
|
|
memmove(target + source_bytes - ZIPLIST_END_SIZE,
|
|
|
|
target + ZIPLIST_HEADER_SIZE,
|
|
|
|
target_bytes - ZIPLIST_HEADER_SIZE);
|
|
|
|
memcpy(target, source, source_bytes - ZIPLIST_END_SIZE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Update header metadata. */
|
|
|
|
ZIPLIST_BYTES(target) = intrev32ifbe(zlbytes);
|
|
|
|
ZIPLIST_LENGTH(target) = intrev16ifbe(zllength);
|
|
|
|
/* New tail offset is:
|
|
|
|
* + N bytes of first ziplist
|
|
|
|
* - 1 byte for [END] of first ziplist
|
|
|
|
* + M bytes for the offset of the original tail of the second ziplist
|
|
|
|
* - J bytes for HEADER because second_offset keeps no header. */
|
|
|
|
ZIPLIST_TAIL_OFFSET(target) = intrev32ifbe(
|
|
|
|
(first_bytes - ZIPLIST_END_SIZE) +
|
|
|
|
(second_offset - ZIPLIST_HEADER_SIZE));
|
|
|
|
|
|
|
|
/* __ziplistCascadeUpdate just fixes the prev length values until it finds a
|
|
|
|
* correct prev length value (then it assumes the rest of the list is okay).
|
|
|
|
* We tell CascadeUpdate to start at the first ziplist's tail element to fix
|
|
|
|
* the merge seam. */
|
|
|
|
target = __ziplistCascadeUpdate(target, target+first_offset);
|
|
|
|
|
|
|
|
/* Now free and NULL out what we didn't realloc */
|
|
|
|
if (append) {
|
|
|
|
zfree(*second);
|
|
|
|
*second = NULL;
|
|
|
|
*first = target;
|
|
|
|
} else {
|
|
|
|
zfree(*first);
|
|
|
|
*first = NULL;
|
|
|
|
*second = target;
|
|
|
|
}
|
|
|
|
return target;
|
|
|
|
}
|
|
|
|
|
2010-05-31 21:44:12 +02:00
|
|
|
unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where) {
|
2010-05-29 18:52:49 +02:00
|
|
|
unsigned char *p;
|
2010-05-29 19:09:37 +02:00
|
|
|
p = (where == ZIPLIST_HEAD) ? ZIPLIST_ENTRY_HEAD(zl) : ZIPLIST_ENTRY_END(zl);
|
2010-05-29 18:52:49 +02:00
|
|
|
return __ziplistInsert(zl,p,s,slen);
|
|
|
|
}
|
|
|
|
|
2010-05-29 22:17:16 +02:00
|
|
|
/* Returns an offset to use for iterating with ziplistNext. When the given
|
|
|
|
* index is negative, the list is traversed back to front. When the list
|
|
|
|
* doesn't contain an element at the provided index, NULL is returned. */
|
|
|
|
unsigned char *ziplistIndex(unsigned char *zl, int index) {
|
|
|
|
unsigned char *p;
|
2014-01-22 21:23:54 +08:00
|
|
|
unsigned int prevlensize, prevlen = 0;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t zlbytes = intrev32ifbe(ZIPLIST_BYTES(zl));
|
2010-05-29 22:17:16 +02:00
|
|
|
if (index < 0) {
|
|
|
|
index = (-index)-1;
|
|
|
|
p = ZIPLIST_ENTRY_TAIL(zl);
|
|
|
|
if (p[0] != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* No need for "safe" check: when going backwards, we know the header
|
|
|
|
* we're parsing is in the range, we just need to assert (below) that
|
|
|
|
* the size we take doesn't cause p to go outside the allocation. */
|
2014-01-22 21:23:54 +08:00
|
|
|
ZIP_DECODE_PREVLEN(p, prevlensize, prevlen);
|
|
|
|
while (prevlen > 0 && index--) {
|
|
|
|
p -= prevlen;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(p >= zl + ZIPLIST_HEADER_SIZE && p < zl + zlbytes - ZIPLIST_END_SIZE);
|
2014-01-22 21:23:54 +08:00
|
|
|
ZIP_DECODE_PREVLEN(p, prevlensize, prevlen);
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
p = ZIPLIST_ENTRY_HEAD(zl);
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
while (index--) {
|
|
|
|
/* Use the "safe" length: When we go forward, we need to be careful
|
|
|
|
* not to decode an entry header if it's past the ziplist allocation. */
|
|
|
|
p += zipRawEntryLengthSafe(zl, zlbytes, p);
|
|
|
|
if (p[0] == ZIP_END)
|
|
|
|
break;
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
if (p[0] == ZIP_END || index > 0)
|
|
|
|
return NULL;
|
|
|
|
zipAssertValidEntry(zl, zlbytes, p);
|
|
|
|
return p;
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
|
2010-12-07 16:33:13 +01:00
|
|
|
/* Return pointer to next entry in ziplist.
|
|
|
|
*
|
|
|
|
* zl is the pointer to the ziplist
|
|
|
|
* p is the pointer to the current element
|
|
|
|
*
|
|
|
|
* The element after 'p' is returned, otherwise NULL if we are at the end. */
|
2010-05-31 20:17:21 +02:00
|
|
|
unsigned char *ziplistNext(unsigned char *zl, unsigned char *p) {
|
|
|
|
((void) zl);
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t zlbytes = intrev32ifbe(ZIPLIST_BYTES(zl));
|
2010-05-31 23:35:21 +02:00
|
|
|
|
|
|
|
/* "p" could be equal to ZIP_END, caused by ziplistDelete,
|
|
|
|
* and we should return NULL. Otherwise, we should return NULL
|
|
|
|
* when the *next* element is ZIP_END (there is no next entry). */
|
|
|
|
if (p[0] == ZIP_END) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-01-03 15:48:55 -08:00
|
|
|
|
|
|
|
p += zipRawEntryLength(p);
|
|
|
|
if (p[0] == ZIP_END) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zipAssertValidEntry(zl, zlbytes, p);
|
2012-01-03 15:48:55 -08:00
|
|
|
return p;
|
2010-05-22 15:48:27 +02:00
|
|
|
}
|
|
|
|
|
2010-05-30 01:38:56 +02:00
|
|
|
/* Return pointer to previous entry in ziplist. */
|
2010-05-31 20:17:21 +02:00
|
|
|
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p) {
|
2014-01-22 21:23:54 +08:00
|
|
|
unsigned int prevlensize, prevlen = 0;
|
2010-05-31 20:17:21 +02:00
|
|
|
|
|
|
|
/* Iterating backwards from ZIP_END should return the tail. When "p" is
|
|
|
|
* equal to the first element of the list, we're already at the head,
|
|
|
|
* and should return NULL. */
|
|
|
|
if (p[0] == ZIP_END) {
|
|
|
|
p = ZIPLIST_ENTRY_TAIL(zl);
|
|
|
|
return (p[0] == ZIP_END) ? NULL : p;
|
|
|
|
} else if (p == ZIPLIST_ENTRY_HEAD(zl)) {
|
|
|
|
return NULL;
|
|
|
|
} else {
|
2014-01-22 21:23:54 +08:00
|
|
|
ZIP_DECODE_PREVLEN(p, prevlensize, prevlen);
|
|
|
|
assert(prevlen > 0);
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
p-=prevlen;
|
|
|
|
size_t zlbytes = intrev32ifbe(ZIPLIST_BYTES(zl));
|
|
|
|
zipAssertValidEntry(zl, zlbytes, p);
|
|
|
|
return p;
|
2010-05-31 20:17:21 +02:00
|
|
|
}
|
2010-05-30 01:38:56 +02:00
|
|
|
}
|
|
|
|
|
2014-01-23 21:52:03 +08:00
|
|
|
/* Get entry pointed to by 'p' and store in either '*sstr' or 'sval' depending
|
|
|
|
* on the encoding of the entry. '*sstr' is always set to NULL to be able
|
2010-05-22 15:48:27 +02:00
|
|
|
* to find out whether the string pointer or the integer value was set.
|
2013-01-28 11:07:17 +01:00
|
|
|
* Return 0 if 'p' points to the end of the ziplist, 1 otherwise. */
|
2010-05-31 21:44:12 +02:00
|
|
|
unsigned int ziplistGet(unsigned char *p, unsigned char **sstr, unsigned int *slen, long long *sval) {
|
2010-05-29 16:20:01 +02:00
|
|
|
zlentry entry;
|
2010-05-29 22:17:16 +02:00
|
|
|
if (p == NULL || p[0] == ZIP_END) return 0;
|
2010-05-29 16:26:55 +02:00
|
|
|
if (sstr) *sstr = NULL;
|
2010-05-29 15:40:40 +02:00
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zipEntry(p, &entry); /* no need for "safe" variant since the input pointer was validated by the function that returned it. */
|
2010-08-13 19:28:49 +02:00
|
|
|
if (ZIP_IS_STR(entry.encoding)) {
|
2010-05-29 16:26:55 +02:00
|
|
|
if (sstr) {
|
|
|
|
*slen = entry.len;
|
2010-05-31 21:44:12 +02:00
|
|
|
*sstr = p+entry.headersize;
|
2010-05-22 15:48:27 +02:00
|
|
|
}
|
|
|
|
} else {
|
2010-05-29 16:26:55 +02:00
|
|
|
if (sval) {
|
|
|
|
*sval = zipLoadInteger(p+entry.headersize,entry.encoding);
|
2010-05-22 15:48:27 +02:00
|
|
|
}
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
2010-05-22 15:48:27 +02:00
|
|
|
return 1;
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
|
2010-05-30 01:38:56 +02:00
|
|
|
/* Insert an entry at "p". */
|
2010-05-31 21:44:12 +02:00
|
|
|
unsigned char *ziplistInsert(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen) {
|
2010-05-30 01:38:56 +02:00
|
|
|
return __ziplistInsert(zl,p,s,slen);
|
2010-05-21 14:11:29 +02:00
|
|
|
}
|
|
|
|
|
2010-05-21 15:46:00 +02:00
|
|
|
/* Delete a single entry from the ziplist, pointed to by *p.
|
|
|
|
* Also update *p in place, to be able to iterate over the
|
|
|
|
* ziplist, while deleting entries. */
|
2010-05-31 20:18:23 +02:00
|
|
|
unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p) {
|
2011-03-13 18:15:57 +01:00
|
|
|
size_t offset = *p-zl;
|
2010-05-29 17:38:23 +02:00
|
|
|
zl = __ziplistDelete(zl,*p,1);
|
2010-05-21 15:46:00 +02:00
|
|
|
|
2010-05-29 17:38:23 +02:00
|
|
|
/* Store pointer to current element in p, because ziplistDelete will
|
2010-05-30 01:39:41 +02:00
|
|
|
* do a realloc which might result in a different "zl"-pointer.
|
|
|
|
* When the delete direction is back to front, we might delete the last
|
|
|
|
* entry and end up with "p" pointing to ZIP_END, so check this. */
|
2010-05-31 20:18:23 +02:00
|
|
|
*p = zl+offset;
|
2010-05-21 15:46:00 +02:00
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2010-05-30 01:38:56 +02:00
|
|
|
/* Delete a range of entries from the ziplist. */
|
2014-11-13 16:12:09 -05:00
|
|
|
unsigned char *ziplistDeleteRange(unsigned char *zl, int index, unsigned int num) {
|
2010-05-30 01:38:56 +02:00
|
|
|
unsigned char *p = ziplistIndex(zl,index);
|
|
|
|
return (p == NULL) ? zl : __ziplistDelete(zl,p,num);
|
|
|
|
}
|
|
|
|
|
2021-02-12 18:03:10 +01:00
|
|
|
/* Replaces the entry at p. This is equivalent to a delete and an insert,
|
|
|
|
* but avoids some overhead when replacing a value of the same size. */
|
|
|
|
unsigned char *ziplistReplace(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen) {
|
|
|
|
|
|
|
|
/* get metadata of the current entry */
|
|
|
|
zlentry entry;
|
|
|
|
zipEntry(p, &entry);
|
|
|
|
|
|
|
|
/* compute length of entry to store, excluding prevlen */
|
|
|
|
unsigned int reqlen;
|
|
|
|
unsigned char encoding = 0;
|
|
|
|
long long value = 123456789; /* initialized to avoid warning. */
|
|
|
|
if (zipTryEncoding(s,slen,&value,&encoding)) {
|
|
|
|
reqlen = zipIntSize(encoding); /* encoding is set */
|
|
|
|
} else {
|
|
|
|
reqlen = slen; /* encoding == 0 */
|
|
|
|
}
|
|
|
|
reqlen += zipStoreEntryEncoding(NULL,encoding,slen);
|
|
|
|
|
|
|
|
if (reqlen == entry.lensize + entry.len) {
|
|
|
|
/* Simply overwrite the element. */
|
|
|
|
p += entry.prevrawlensize;
|
|
|
|
p += zipStoreEntryEncoding(p,encoding,slen);
|
|
|
|
if (ZIP_IS_STR(encoding)) {
|
|
|
|
memcpy(p,s,slen);
|
|
|
|
} else {
|
|
|
|
zipSaveInteger(p,value,encoding);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* Fallback. */
|
|
|
|
zl = ziplistDelete(zl,&p);
|
|
|
|
zl = ziplistInsert(zl,p,s,slen);
|
|
|
|
}
|
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2014-01-23 21:52:03 +08:00
|
|
|
/* Compare entry pointer to by 'p' with 'sstr' of length 'slen'. */
|
|
|
|
/* Return 1 if equal. */
|
2010-05-31 21:44:12 +02:00
|
|
|
unsigned int ziplistCompare(unsigned char *p, unsigned char *sstr, unsigned int slen) {
|
2010-05-29 16:20:01 +02:00
|
|
|
zlentry entry;
|
2010-05-31 21:44:12 +02:00
|
|
|
unsigned char sencoding;
|
|
|
|
long long zval, sval;
|
2010-05-30 01:37:03 +02:00
|
|
|
if (p[0] == ZIP_END) return 0;
|
2010-05-22 16:25:06 +02:00
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
zipEntry(p, &entry); /* no need for "safe" variant since the input pointer was validated by the function that returned it. */
|
2010-08-13 19:28:49 +02:00
|
|
|
if (ZIP_IS_STR(entry.encoding)) {
|
2010-05-22 16:25:06 +02:00
|
|
|
/* Raw compare */
|
2010-05-29 16:20:01 +02:00
|
|
|
if (entry.len == slen) {
|
2010-05-29 16:26:55 +02:00
|
|
|
return memcmp(p+entry.headersize,sstr,slen) == 0;
|
2010-05-22 16:25:06 +02:00
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
2010-05-22 21:49:36 +02:00
|
|
|
} else {
|
2012-05-04 17:26:24 -07:00
|
|
|
/* Try to compare encoded values. Don't compare encoding because
|
|
|
|
* different implementations may encoded integers differently. */
|
2010-07-27 15:26:08 +02:00
|
|
|
if (zipTryEncoding(sstr,slen,&sval,&sencoding)) {
|
2012-05-04 17:26:24 -07:00
|
|
|
zval = zipLoadInteger(p+entry.headersize,entry.encoding);
|
|
|
|
return zval == sval;
|
2010-05-22 21:49:36 +02:00
|
|
|
}
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
2010-05-22 21:49:36 +02:00
|
|
|
return 0;
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
|
|
|
|
2012-01-03 15:48:55 -08:00
|
|
|
/* Find pointer to the entry equal to the specified entry. Skip 'skip' entries
|
|
|
|
* between every comparison. Returns NULL when the field could not be found. */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
unsigned char *ziplistFind(unsigned char *zl, unsigned char *p, unsigned char *vstr, unsigned int vlen, unsigned int skip) {
|
2012-01-03 15:48:55 -08:00
|
|
|
int skipcnt = 0;
|
|
|
|
unsigned char vencoding = 0;
|
|
|
|
long long vll = 0;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t zlbytes = ziplistBlobLen(zl);
|
2012-01-03 15:48:55 -08:00
|
|
|
|
|
|
|
while (p[0] != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
struct zlentry e;
|
2012-01-03 15:48:55 -08:00
|
|
|
unsigned char *q;
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(zipEntrySafe(zl, zlbytes, p, &e, 1));
|
|
|
|
q = p + e.prevrawlensize + e.lensize;
|
2012-01-03 15:48:55 -08:00
|
|
|
|
|
|
|
if (skipcnt == 0) {
|
|
|
|
/* Compare current entry with specified entry */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
if (ZIP_IS_STR(e.encoding)) {
|
|
|
|
if (e.len == vlen && memcmp(q, vstr, vlen) == 0) {
|
2012-01-03 15:48:55 -08:00
|
|
|
return p;
|
|
|
|
}
|
|
|
|
} else {
|
2012-06-14 15:59:25 +02:00
|
|
|
/* Find out if the searched field can be encoded. Note that
|
|
|
|
* we do it only the first time, once done vencoding is set
|
|
|
|
* to non-zero and vll is set to the integer value. */
|
2012-01-03 15:48:55 -08:00
|
|
|
if (vencoding == 0) {
|
|
|
|
if (!zipTryEncoding(vstr, vlen, &vll, &vencoding)) {
|
2012-06-14 15:59:25 +02:00
|
|
|
/* If the entry can't be encoded we set it to
|
|
|
|
* UCHAR_MAX so that we don't retry again the next
|
|
|
|
* time. */
|
2012-01-03 15:48:55 -08:00
|
|
|
vencoding = UCHAR_MAX;
|
|
|
|
}
|
|
|
|
/* Must be non-zero by now */
|
|
|
|
assert(vencoding);
|
|
|
|
}
|
|
|
|
|
2012-06-14 15:59:25 +02:00
|
|
|
/* Compare current entry with specified entry, do it only
|
|
|
|
* if vencoding != UCHAR_MAX because if there is no encoding
|
|
|
|
* possible for the field it can't be a valid integer. */
|
|
|
|
if (vencoding != UCHAR_MAX) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
long long ll = zipLoadInteger(q, e.encoding);
|
2012-01-03 15:48:55 -08:00
|
|
|
if (ll == vll) {
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reset skip count */
|
|
|
|
skipcnt = skip;
|
|
|
|
} else {
|
|
|
|
/* Skip entry */
|
|
|
|
skipcnt--;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Move to next entry */
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
p = q + e.len;
|
2012-01-03 15:48:55 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2010-05-22 19:35:40 +02:00
|
|
|
/* Return length of ziplist. */
|
|
|
|
unsigned int ziplistLen(unsigned char *zl) {
|
|
|
|
unsigned int len = 0;
|
2012-02-08 22:59:35 +01:00
|
|
|
if (intrev16ifbe(ZIPLIST_LENGTH(zl)) < UINT16_MAX) {
|
|
|
|
len = intrev16ifbe(ZIPLIST_LENGTH(zl));
|
2010-05-22 19:35:40 +02:00
|
|
|
} else {
|
|
|
|
unsigned char *p = zl+ZIPLIST_HEADER_SIZE;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t zlbytes = intrev32ifbe(ZIPLIST_BYTES(zl));
|
2010-05-22 19:35:40 +02:00
|
|
|
while (*p != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
p += zipRawEntryLengthSafe(zl, zlbytes, p);
|
2010-05-22 19:35:40 +02:00
|
|
|
len++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Re-store length if small enough */
|
2012-02-08 22:59:35 +01:00
|
|
|
if (len < UINT16_MAX) ZIPLIST_LENGTH(zl) = intrev16ifbe(len);
|
2010-05-22 19:35:40 +02:00
|
|
|
}
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
2011-02-28 14:48:49 +01:00
|
|
|
/* Return ziplist blob size in bytes. */
|
|
|
|
size_t ziplistBlobLen(unsigned char *zl) {
|
2012-02-08 22:59:35 +01:00
|
|
|
return intrev32ifbe(ZIPLIST_BYTES(zl));
|
2010-05-29 11:33:38 +02:00
|
|
|
}
|
|
|
|
|
2010-05-21 12:54:01 +02:00
|
|
|
void ziplistRepr(unsigned char *zl) {
|
2010-05-29 16:25:05 +02:00
|
|
|
unsigned char *p;
|
2010-09-06 23:12:41 +02:00
|
|
|
int index = 0;
|
2010-05-29 16:25:05 +02:00
|
|
|
zlentry entry;
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
size_t zlbytes = ziplistBlobLen(zl);
|
2010-05-21 12:54:01 +02:00
|
|
|
|
2010-09-06 23:12:41 +02:00
|
|
|
printf(
|
2020-10-13 17:42:52 +08:00
|
|
|
"{total bytes %u} "
|
2016-12-16 09:02:50 +01:00
|
|
|
"{num entries %u}\n"
|
2010-09-06 23:12:41 +02:00
|
|
|
"{tail offset %u}\n",
|
2012-02-08 22:59:35 +01:00
|
|
|
intrev32ifbe(ZIPLIST_BYTES(zl)),
|
|
|
|
intrev16ifbe(ZIPLIST_LENGTH(zl)),
|
|
|
|
intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl)));
|
2010-05-29 19:09:37 +02:00
|
|
|
p = ZIPLIST_ENTRY_HEAD(zl);
|
2010-05-21 12:54:01 +02:00
|
|
|
while(*p != ZIP_END) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
assert(zipEntrySafe(zl, zlbytes, p, &entry, 1));
|
2010-09-06 23:12:41 +02:00
|
|
|
printf(
|
2016-12-16 09:02:50 +01:00
|
|
|
"{\n"
|
|
|
|
"\taddr 0x%08lx,\n"
|
|
|
|
"\tindex %2d,\n"
|
2020-10-13 17:42:52 +08:00
|
|
|
"\toffset %5lu,\n"
|
2016-12-16 09:02:50 +01:00
|
|
|
"\thdr+entry len: %5u,\n"
|
|
|
|
"\thdr len%2u,\n"
|
|
|
|
"\tprevrawlen: %5u,\n"
|
|
|
|
"\tprevrawlensize: %2u,\n"
|
|
|
|
"\tpayload %5u\n",
|
2010-11-02 11:15:09 +01:00
|
|
|
(long unsigned)p,
|
2010-09-06 23:12:41 +02:00
|
|
|
index,
|
2010-11-02 11:15:09 +01:00
|
|
|
(unsigned long) (p-zl),
|
2010-09-06 23:12:41 +02:00
|
|
|
entry.headersize+entry.len,
|
|
|
|
entry.headersize,
|
|
|
|
entry.prevrawlen,
|
|
|
|
entry.prevrawlensize,
|
|
|
|
entry.len);
|
2016-12-16 09:02:50 +01:00
|
|
|
printf("\tbytes: ");
|
|
|
|
for (unsigned int i = 0; i < entry.headersize+entry.len; i++) {
|
|
|
|
printf("%02x|",p[i]);
|
|
|
|
}
|
|
|
|
printf("\n");
|
2010-05-29 16:25:05 +02:00
|
|
|
p += entry.headersize;
|
2010-08-13 19:28:49 +02:00
|
|
|
if (ZIP_IS_STR(entry.encoding)) {
|
2016-12-16 09:02:50 +01:00
|
|
|
printf("\t[str]");
|
2010-09-06 23:12:41 +02:00
|
|
|
if (entry.len > 40) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (fwrite(p,40,1,stdout) == 0) perror("fwrite");
|
2010-09-06 23:12:41 +02:00
|
|
|
printf("...");
|
|
|
|
} else {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (entry.len &&
|
|
|
|
fwrite(p,entry.len,1,stdout) == 0) perror("fwrite");
|
2010-09-06 23:12:41 +02:00
|
|
|
}
|
2010-05-22 15:07:12 +02:00
|
|
|
} else {
|
2016-12-16 09:02:50 +01:00
|
|
|
printf("\t[int]%lld", (long long) zipLoadInteger(p,entry.encoding));
|
2010-05-22 15:07:12 +02:00
|
|
|
}
|
2016-12-16 09:02:50 +01:00
|
|
|
printf("\n}\n");
|
2010-05-29 16:25:05 +02:00
|
|
|
p += entry.len;
|
2010-09-06 23:12:41 +02:00
|
|
|
index++;
|
2010-05-21 12:54:01 +02:00
|
|
|
}
|
|
|
|
printf("{end}\n\n");
|
|
|
|
}
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* Validate the integrity of the data stracture.
|
|
|
|
* when `deep` is 0, only the integrity of the header is validated.
|
|
|
|
* when `deep` is 1, we scan all the entries one by one. */
|
2020-11-02 09:35:37 +02:00
|
|
|
int ziplistValidateIntegrity(unsigned char *zl, size_t size, int deep,
|
|
|
|
ziplistValidateEntryCB entry_cb, void *cb_userdata) {
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* check that we can actually read the header. (and ZIP_END) */
|
|
|
|
if (size < ZIPLIST_HEADER_SIZE + ZIPLIST_END_SIZE)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* check that the encoded size in the header must match the allocated size. */
|
|
|
|
size_t bytes = intrev32ifbe(ZIPLIST_BYTES(zl));
|
|
|
|
if (bytes != size)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* the last byte must be the terminator. */
|
|
|
|
if (zl[size - ZIPLIST_END_SIZE] != ZIP_END)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* make sure the tail offset isn't reaching outside the allocation. */
|
|
|
|
if (intrev32ifbe(ZIPLIST_TAIL_OFFSET(zl)) > size - ZIPLIST_END_SIZE)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (!deep)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
unsigned int count = 0;
|
|
|
|
unsigned char *p = ZIPLIST_ENTRY_HEAD(zl);
|
|
|
|
unsigned char *prev = NULL;
|
|
|
|
size_t prev_raw_size = 0;
|
|
|
|
while(*p != ZIP_END) {
|
|
|
|
struct zlentry e;
|
|
|
|
/* Decode the entry headers and fail if invalid or reaches outside the allocation */
|
|
|
|
if (!zipEntrySafe(zl, size, p, &e, 1))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Make sure the record stating the prev entry size is correct. */
|
|
|
|
if (e.prevrawlen != prev_raw_size)
|
|
|
|
return 0;
|
|
|
|
|
2020-11-02 09:35:37 +02:00
|
|
|
/* Optionally let the caller validate the entry too. */
|
|
|
|
if (entry_cb && !entry_cb(p, cb_userdata))
|
|
|
|
return 0;
|
|
|
|
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
/* Move to the next entry */
|
|
|
|
prev_raw_size = e.headersize + e.len;
|
|
|
|
prev = p;
|
|
|
|
p += e.headersize + e.len;
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Make sure the <zltail> entry really do point to the start of the last entry. */
|
|
|
|
if (prev != ZIPLIST_ENTRY_TAIL(zl))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Check that the count in the header is correct */
|
|
|
|
unsigned int header_count = intrev16ifbe(ZIPLIST_LENGTH(zl));
|
|
|
|
if (header_count != UINT16_MAX && count != header_count)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2021-01-29 16:47:28 +08:00
|
|
|
/* Randomly select a pair of key and value.
|
|
|
|
* total_count is a pre-computed length/2 of the ziplist (to avoid calls to ziplistLen)
|
|
|
|
* 'key' and 'val' are used to store the result key value pair.
|
|
|
|
* 'val' can be NULL if the value is not needed. */
|
|
|
|
void ziplistRandomPair(unsigned char *zl, unsigned long total_count, ziplistEntry *key, ziplistEntry *val) {
|
|
|
|
int ret;
|
|
|
|
unsigned char *p;
|
|
|
|
|
2021-01-31 12:13:45 +02:00
|
|
|
/* Avoid div by zero on corrupt ziplist */
|
|
|
|
assert(total_count);
|
|
|
|
|
2021-01-29 16:47:28 +08:00
|
|
|
/* Generate even numbers, because ziplist saved K-V pair */
|
|
|
|
int r = (rand() % total_count) * 2;
|
|
|
|
p = ziplistIndex(zl, r);
|
|
|
|
ret = ziplistGet(p, &key->sval, &key->slen, &key->lval);
|
|
|
|
assert(ret != 0);
|
|
|
|
|
|
|
|
if (!val)
|
|
|
|
return;
|
|
|
|
p = ziplistNext(zl, p);
|
|
|
|
ret = ziplistGet(p, &val->sval, &val->slen, &val->lval);
|
|
|
|
assert(ret != 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* int compare for qsort */
|
2021-02-07 16:55:11 +02:00
|
|
|
int uintCompare(const void *a, const void *b) {
|
|
|
|
return (*(unsigned int *) a - *(unsigned int *) b);
|
2021-01-29 16:47:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Helper method to store a string into from val or lval into dest */
|
|
|
|
static inline void ziplistSaveValue(unsigned char *val, unsigned int len, long long lval, ziplistEntry *dest) {
|
|
|
|
dest->sval = val;
|
|
|
|
dest->slen = len;
|
|
|
|
dest->lval = lval;
|
|
|
|
}
|
|
|
|
|
2021-02-07 16:55:11 +02:00
|
|
|
/* Randomly select count of key value pairs and store into 'keys' and
|
|
|
|
* 'vals' args. The order of the picked entries is random, and the selections
|
|
|
|
* are non-unique (repetitions are possible).
|
2021-01-29 16:47:28 +08:00
|
|
|
* The 'vals' arg can be NULL in which case we skip these. */
|
2021-02-07 16:55:11 +02:00
|
|
|
void ziplistRandomPairs(unsigned char *zl, unsigned int count, ziplistEntry *keys, ziplistEntry *vals) {
|
2021-01-29 16:47:28 +08:00
|
|
|
unsigned char *p, *key, *value;
|
2021-02-07 16:55:11 +02:00
|
|
|
unsigned int klen = 0, vlen = 0;
|
|
|
|
long long klval = 0, vlval = 0;
|
2021-02-05 21:56:20 +08:00
|
|
|
|
2021-02-07 16:55:11 +02:00
|
|
|
/* Notice: the index member must be first due to the use in uintCompare */
|
2021-01-29 16:47:28 +08:00
|
|
|
typedef struct {
|
2021-02-07 16:55:11 +02:00
|
|
|
unsigned int index;
|
|
|
|
unsigned int order;
|
2021-01-29 16:47:28 +08:00
|
|
|
} rand_pick;
|
|
|
|
rand_pick *picks = zmalloc(sizeof(rand_pick)*count);
|
2021-02-07 16:55:11 +02:00
|
|
|
unsigned int total_size = ziplistLen(zl)/2;
|
2021-01-29 16:47:28 +08:00
|
|
|
|
2021-01-31 12:13:45 +02:00
|
|
|
/* Avoid div by zero on corrupt ziplist */
|
|
|
|
assert(total_size);
|
|
|
|
|
2021-01-29 16:47:28 +08:00
|
|
|
/* create a pool of random indexes (some may be duplicate). */
|
2021-02-07 16:55:11 +02:00
|
|
|
for (unsigned int i = 0; i < count; i++) {
|
2021-01-29 16:47:28 +08:00
|
|
|
picks[i].index = (rand() % total_size) * 2; /* Generate even indexes */
|
|
|
|
/* keep track of the order we picked them */
|
|
|
|
picks[i].order = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* sort by indexes. */
|
2021-02-07 16:55:11 +02:00
|
|
|
qsort(picks, count, sizeof(rand_pick), uintCompare);
|
2021-01-29 16:47:28 +08:00
|
|
|
|
|
|
|
/* fetch the elements form the ziplist into a output array respecting the original order. */
|
2021-02-07 16:55:11 +02:00
|
|
|
unsigned int zipindex = 0, pickindex = 0;
|
2021-01-29 16:47:28 +08:00
|
|
|
p = ziplistIndex(zl, 0);
|
|
|
|
while (ziplistGet(p, &key, &klen, &klval) && pickindex < count) {
|
|
|
|
p = ziplistNext(zl, p);
|
2021-02-07 16:55:11 +02:00
|
|
|
assert(ziplistGet(p, &value, &vlen, &vlval));
|
2021-01-29 16:47:28 +08:00
|
|
|
while (pickindex < count && zipindex == picks[pickindex].index) {
|
|
|
|
int storeorder = picks[pickindex].order;
|
|
|
|
ziplistSaveValue(key, klen, klval, &keys[storeorder]);
|
|
|
|
if (vals)
|
|
|
|
ziplistSaveValue(value, vlen, vlval, &vals[storeorder]);
|
|
|
|
pickindex++;
|
|
|
|
}
|
|
|
|
zipindex += 2;
|
|
|
|
p = ziplistNext(zl, p);
|
|
|
|
}
|
|
|
|
|
|
|
|
zfree(picks);
|
|
|
|
}
|
|
|
|
|
2021-02-07 16:55:11 +02:00
|
|
|
/* Randomly select count of key value pairs and store into 'keys' and
|
|
|
|
* 'vals' args. The selections are unique (no repetitions), and the order of
|
|
|
|
* the picked entries is NOT-random.
|
|
|
|
* The 'vals' arg can be NULL in which case we skip these.
|
|
|
|
* The return value is the number of items picked which can be lower than the
|
|
|
|
* requested count if the ziplist doesn't hold enough pairs. */
|
|
|
|
unsigned int ziplistRandomPairsUnique(unsigned char *zl, unsigned int count, ziplistEntry *keys, ziplistEntry *vals) {
|
|
|
|
unsigned char *p, *key;
|
|
|
|
unsigned int klen = 0;
|
|
|
|
long long klval = 0;
|
|
|
|
unsigned int total_size = ziplistLen(zl)/2;
|
|
|
|
unsigned int index = 0;
|
|
|
|
if (count > total_size)
|
|
|
|
count = total_size;
|
|
|
|
|
|
|
|
/* To only iterate once, every time we try to pick a member, the probability
|
|
|
|
* we pick it is the quotient of the count left we want to pick and the
|
|
|
|
* count still we haven't visited in the dict, this way, we could make every
|
|
|
|
* member be equally picked.*/
|
|
|
|
p = ziplistIndex(zl, 0);
|
|
|
|
unsigned int picked = 0, remaining = count;
|
|
|
|
while (picked < count && p) {
|
|
|
|
double randomDouble = ((double)rand()) / RAND_MAX;
|
|
|
|
double threshold = ((double)remaining) / (total_size - index);
|
2021-02-08 18:41:16 +08:00
|
|
|
if (randomDouble <= threshold) {
|
2021-02-07 16:55:11 +02:00
|
|
|
assert(ziplistGet(p, &key, &klen, &klval));
|
|
|
|
ziplistSaveValue(key, klen, klval, &keys[picked]);
|
|
|
|
p = ziplistNext(zl, p);
|
|
|
|
assert(p);
|
|
|
|
if (vals) {
|
|
|
|
assert(ziplistGet(p, &key, &klen, &klval));
|
|
|
|
ziplistSaveValue(key, klen, klval, &vals[picked]);
|
|
|
|
}
|
|
|
|
remaining--;
|
|
|
|
picked++;
|
|
|
|
} else {
|
|
|
|
p = ziplistNext(zl, p);
|
|
|
|
assert(p);
|
|
|
|
}
|
|
|
|
p = ziplistNext(zl, p);
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
return picked;
|
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
#ifdef REDIS_TEST
|
2010-06-01 17:57:51 +02:00
|
|
|
#include <sys/time.h>
|
2010-10-14 21:11:42 +02:00
|
|
|
#include "adlist.h"
|
|
|
|
#include "sds.h"
|
|
|
|
|
|
|
|
#define debug(f, ...) { if (DEBUG) printf(f, __VA_ARGS__); }
|
2010-05-21 12:54:01 +02:00
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
static unsigned char *createList() {
|
2010-05-21 13:16:08 +02:00
|
|
|
unsigned char *zl = ziplistNew();
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)"foo", 3, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"quux", 4, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"hello", 5, ZIPLIST_HEAD);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"1024", 4, ZIPLIST_TAIL);
|
2010-05-21 13:16:08 +02:00
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
static unsigned char *createIntList() {
|
2010-05-22 15:07:12 +02:00
|
|
|
unsigned char *zl = ziplistNew();
|
|
|
|
char buf[32];
|
|
|
|
|
|
|
|
sprintf(buf, "100");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), ZIPLIST_TAIL);
|
2010-05-22 15:07:12 +02:00
|
|
|
sprintf(buf, "128000");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), ZIPLIST_TAIL);
|
2010-05-22 15:07:12 +02:00
|
|
|
sprintf(buf, "-100");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), ZIPLIST_HEAD);
|
2010-05-22 15:07:12 +02:00
|
|
|
sprintf(buf, "4294967296");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), ZIPLIST_HEAD);
|
2010-05-22 15:07:12 +02:00
|
|
|
sprintf(buf, "non integer");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), ZIPLIST_TAIL);
|
2010-05-22 15:07:12 +02:00
|
|
|
sprintf(buf, "much much longer non integer");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, strlen(buf), ZIPLIST_TAIL);
|
2010-05-22 15:07:12 +02:00
|
|
|
return zl;
|
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
static long long usec(void) {
|
2010-06-01 17:57:51 +02:00
|
|
|
struct timeval tv;
|
|
|
|
gettimeofday(&tv,NULL);
|
|
|
|
return (((long long)tv.tv_sec)*1000000)+tv.tv_usec;
|
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
static void stress(int pos, int num, int maxsize, int dnum) {
|
2010-06-01 17:57:51 +02:00
|
|
|
int i,j,k;
|
|
|
|
unsigned char *zl;
|
|
|
|
char posstr[2][5] = { "HEAD", "TAIL" };
|
|
|
|
long long start;
|
|
|
|
for (i = 0; i < maxsize; i+=dnum) {
|
|
|
|
zl = ziplistNew();
|
|
|
|
for (j = 0; j < i; j++) {
|
|
|
|
zl = ziplistPush(zl,(unsigned char*)"quux",4,ZIPLIST_TAIL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Do num times a push+pop from pos */
|
|
|
|
start = usec();
|
|
|
|
for (k = 0; k < num; k++) {
|
|
|
|
zl = ziplistPush(zl,(unsigned char*)"quux",4,pos);
|
|
|
|
zl = ziplistDeleteRange(zl,0,1);
|
|
|
|
}
|
|
|
|
printf("List size: %8d, bytes: %8d, %dx push+pop (%s): %6lld usec\n",
|
2012-02-08 22:59:35 +01:00
|
|
|
i,intrev32ifbe(ZIPLIST_BYTES(zl)),num,posstr[pos],usec()-start);
|
2010-06-01 17:57:51 +02:00
|
|
|
zfree(zl);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-13 16:12:44 -05:00
|
|
|
static unsigned char *pop(unsigned char *zl, int where) {
|
2010-06-09 11:36:58 +02:00
|
|
|
unsigned char *p, *vstr;
|
|
|
|
unsigned int vlen;
|
|
|
|
long long vlong;
|
|
|
|
|
|
|
|
p = ziplistIndex(zl,where == ZIPLIST_HEAD ? 0 : -1);
|
|
|
|
if (ziplistGet(p,&vstr,&vlen,&vlong)) {
|
|
|
|
if (where == ZIPLIST_HEAD)
|
|
|
|
printf("Pop head: ");
|
|
|
|
else
|
|
|
|
printf("Pop tail: ");
|
|
|
|
|
2014-11-08 10:16:54 -05:00
|
|
|
if (vstr) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (vlen && fwrite(vstr,vlen,1,stdout) == 0) perror("fwrite");
|
2014-11-08 10:16:54 -05:00
|
|
|
}
|
|
|
|
else {
|
2010-06-09 11:36:58 +02:00
|
|
|
printf("%lld", vlong);
|
2014-11-08 10:16:54 -05:00
|
|
|
}
|
2010-06-09 11:36:58 +02:00
|
|
|
|
|
|
|
printf("\n");
|
2014-11-13 16:12:44 -05:00
|
|
|
return ziplistDelete(zl,&p);
|
2010-06-09 11:36:58 +02:00
|
|
|
} else {
|
|
|
|
printf("ERROR: Could not pop\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
static int randstring(char *target, unsigned int min, unsigned int max) {
|
2012-11-20 02:50:31 +08:00
|
|
|
int p = 0;
|
|
|
|
int len = min+rand()%(max-min+1);
|
2010-10-14 21:11:42 +02:00
|
|
|
int minval, maxval;
|
|
|
|
switch(rand() % 3) {
|
|
|
|
case 0:
|
|
|
|
minval = 0;
|
|
|
|
maxval = 255;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
minval = 48;
|
|
|
|
maxval = 122;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
minval = 48;
|
|
|
|
maxval = 52;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
assert(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
while(p < len)
|
|
|
|
target[p++] = minval+rand()%(maxval-minval+1);
|
2011-05-05 14:55:51 +02:00
|
|
|
return len;
|
2010-10-14 21:11:42 +02:00
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
static void verify(unsigned char *zl, zlentry *e) {
|
2012-08-13 14:09:40 -07:00
|
|
|
int len = ziplistLen(zl);
|
|
|
|
zlentry _e;
|
|
|
|
|
2014-11-13 16:21:27 -05:00
|
|
|
ZIPLIST_ENTRY_ZERO(&_e);
|
|
|
|
|
|
|
|
for (int i = 0; i < len; i++) {
|
2012-08-13 14:09:40 -07:00
|
|
|
memset(&e[i], 0, sizeof(zlentry));
|
2014-11-13 22:17:57 -05:00
|
|
|
zipEntry(ziplistIndex(zl, i), &e[i]);
|
2012-08-13 14:09:40 -07:00
|
|
|
|
|
|
|
memset(&_e, 0, sizeof(zlentry));
|
2014-11-13 22:17:57 -05:00
|
|
|
zipEntry(ziplistIndex(zl, -len+i), &_e);
|
2012-08-13 14:09:40 -07:00
|
|
|
|
|
|
|
assert(memcmp(&e[i], &_e, sizeof(zlentry)) == 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-28 09:22:35 -05:00
|
|
|
static unsigned char *insertHelper(unsigned char *zl, char ch, size_t len, unsigned char *pos) {
|
|
|
|
assert(len <= ZIP_BIG_PREVLEN);
|
|
|
|
unsigned char data[ZIP_BIG_PREVLEN] = {0};
|
|
|
|
memset(data, ch, len);
|
|
|
|
return ziplistInsert(zl, pos, data, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int compareHelper(unsigned char *zl, char ch, size_t len, int index) {
|
|
|
|
assert(len <= ZIP_BIG_PREVLEN);
|
|
|
|
unsigned char data[ZIP_BIG_PREVLEN] = {0};
|
|
|
|
memset(data, ch, len);
|
|
|
|
unsigned char *p = ziplistIndex(zl, index);
|
|
|
|
assert(p != NULL);
|
|
|
|
return ziplistCompare(p, data, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t strEntryBytesSmall(size_t slen) {
|
|
|
|
return slen + zipStorePrevEntryLength(NULL, 0) + zipStoreEntryEncoding(NULL, 0, slen);
|
|
|
|
}
|
|
|
|
|
|
|
|
static size_t strEntryBytesLarge(size_t slen) {
|
|
|
|
return slen + zipStorePrevEntryLength(NULL, ZIP_BIG_PREVLEN) + zipStoreEntryEncoding(NULL, 0, slen);
|
|
|
|
}
|
|
|
|
|
2014-11-12 21:58:57 -05:00
|
|
|
int ziplistTest(int argc, char **argv) {
|
2010-05-29 19:34:14 +02:00
|
|
|
unsigned char *zl, *p;
|
2010-06-01 17:57:09 +02:00
|
|
|
unsigned char *entry;
|
2010-05-21 13:29:14 +02:00
|
|
|
unsigned int elen;
|
2010-05-22 15:48:27 +02:00
|
|
|
long long value;
|
2010-05-21 13:16:08 +02:00
|
|
|
|
2010-09-07 00:08:42 +02:00
|
|
|
/* If an argument is given, use it as the random seed. */
|
|
|
|
if (argc == 2)
|
|
|
|
srand(atoi(argv[1]));
|
|
|
|
|
2010-05-22 15:07:12 +02:00
|
|
|
zl = createIntList();
|
|
|
|
ziplistRepr(zl);
|
|
|
|
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
|
|
|
|
2010-05-21 13:16:08 +02:00
|
|
|
zl = createList();
|
2010-05-21 12:54:01 +02:00
|
|
|
ziplistRepr(zl);
|
|
|
|
|
2014-11-13 16:12:44 -05:00
|
|
|
zl = pop(zl,ZIPLIST_TAIL);
|
2010-05-21 12:54:01 +02:00
|
|
|
ziplistRepr(zl);
|
|
|
|
|
2014-11-13 16:12:44 -05:00
|
|
|
zl = pop(zl,ZIPLIST_HEAD);
|
2010-05-21 12:54:01 +02:00
|
|
|
ziplistRepr(zl);
|
|
|
|
|
2014-11-13 16:12:44 -05:00
|
|
|
zl = pop(zl,ZIPLIST_TAIL);
|
2010-05-29 15:40:40 +02:00
|
|
|
ziplistRepr(zl);
|
|
|
|
|
2014-11-13 16:12:44 -05:00
|
|
|
zl = pop(zl,ZIPLIST_TAIL);
|
2010-05-29 15:40:40 +02:00
|
|
|
ziplistRepr(zl);
|
|
|
|
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
|
|
|
|
2010-05-29 22:17:16 +02:00
|
|
|
printf("Get element at index 3:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, 3);
|
|
|
|
if (!ziplistGet(p, &entry, &elen, &value)) {
|
|
|
|
printf("ERROR: Could not access index 3\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-29 22:17:16 +02:00
|
|
|
printf("\n");
|
|
|
|
} else {
|
|
|
|
printf("%lld\n", value);
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Get element at index 4 (out of range):\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, 4);
|
|
|
|
if (p == NULL) {
|
|
|
|
printf("No entry\n");
|
|
|
|
} else {
|
2021-01-10 01:52:42 +08:00
|
|
|
printf("ERROR: Out of range index should return NULL, returned offset: %ld\n", (long)(p-zl));
|
2010-05-29 22:17:16 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Get element at index -1 (last element):\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, -1);
|
|
|
|
if (!ziplistGet(p, &entry, &elen, &value)) {
|
|
|
|
printf("ERROR: Could not access index -1\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-29 22:17:16 +02:00
|
|
|
printf("\n");
|
|
|
|
} else {
|
|
|
|
printf("%lld\n", value);
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Get element at index -4 (first element):\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, -4);
|
|
|
|
if (!ziplistGet(p, &entry, &elen, &value)) {
|
|
|
|
printf("ERROR: Could not access index -4\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-29 22:17:16 +02:00
|
|
|
printf("\n");
|
|
|
|
} else {
|
|
|
|
printf("%lld\n", value);
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Get element at index -5 (reverse out of range):\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, -5);
|
|
|
|
if (p == NULL) {
|
|
|
|
printf("No entry\n");
|
|
|
|
} else {
|
2021-01-10 01:52:42 +08:00
|
|
|
printf("ERROR: Out of range index should return NULL, returned offset: %ld\n", (long)(p-zl));
|
2010-05-29 22:17:16 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-29 22:17:16 +02:00
|
|
|
}
|
|
|
|
|
2010-05-21 13:16:08 +02:00
|
|
|
printf("Iterate list from 0 to end:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, 0);
|
2010-05-22 15:48:27 +02:00
|
|
|
while (ziplistGet(p, &entry, &elen, &value)) {
|
2010-05-21 13:29:14 +02:00
|
|
|
printf("Entry: ");
|
2010-05-22 15:48:27 +02:00
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-22 15:48:27 +02:00
|
|
|
} else {
|
|
|
|
printf("%lld", value);
|
|
|
|
}
|
2010-05-31 20:17:21 +02:00
|
|
|
p = ziplistNext(zl,p);
|
2010-05-22 15:48:27 +02:00
|
|
|
printf("\n");
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Iterate list from 1 to end:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, 1);
|
2010-05-22 15:48:27 +02:00
|
|
|
while (ziplistGet(p, &entry, &elen, &value)) {
|
2010-05-21 13:29:14 +02:00
|
|
|
printf("Entry: ");
|
2010-05-22 15:48:27 +02:00
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-22 15:48:27 +02:00
|
|
|
} else {
|
|
|
|
printf("%lld", value);
|
|
|
|
}
|
2010-05-31 20:17:21 +02:00
|
|
|
p = ziplistNext(zl,p);
|
2010-05-22 15:48:27 +02:00
|
|
|
printf("\n");
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Iterate list from 2 to end:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, 2);
|
2010-05-22 15:48:27 +02:00
|
|
|
while (ziplistGet(p, &entry, &elen, &value)) {
|
2010-05-21 13:29:14 +02:00
|
|
|
printf("Entry: ");
|
2010-05-22 15:48:27 +02:00
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-22 15:48:27 +02:00
|
|
|
} else {
|
|
|
|
printf("%lld", value);
|
|
|
|
}
|
2010-05-31 20:17:21 +02:00
|
|
|
p = ziplistNext(zl,p);
|
2010-05-22 15:48:27 +02:00
|
|
|
printf("\n");
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Iterate starting out of range:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-05-22 15:48:27 +02:00
|
|
|
p = ziplistIndex(zl, 4);
|
|
|
|
if (!ziplistGet(p, &entry, &elen, &value)) {
|
2010-05-21 13:16:08 +02:00
|
|
|
printf("No entry\n");
|
|
|
|
} else {
|
|
|
|
printf("ERROR\n");
|
|
|
|
}
|
2010-05-21 14:11:29 +02:00
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 14:11:29 +02:00
|
|
|
}
|
|
|
|
|
2010-05-30 01:39:41 +02:00
|
|
|
printf("Iterate from back to front:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, -1);
|
|
|
|
while (ziplistGet(p, &entry, &elen, &value)) {
|
|
|
|
printf("Entry: ");
|
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-30 01:39:41 +02:00
|
|
|
} else {
|
|
|
|
printf("%lld", value);
|
|
|
|
}
|
2010-05-31 20:17:21 +02:00
|
|
|
p = ziplistPrev(zl,p);
|
2010-05-30 01:39:41 +02:00
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-30 01:39:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Iterate from back to front, deleting all items:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
|
|
|
p = ziplistIndex(zl, -1);
|
|
|
|
while (ziplistGet(p, &entry, &elen, &value)) {
|
|
|
|
printf("Entry: ");
|
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0) perror("fwrite");
|
2010-05-30 01:39:41 +02:00
|
|
|
} else {
|
|
|
|
printf("%lld", value);
|
|
|
|
}
|
2010-05-31 20:17:21 +02:00
|
|
|
zl = ziplistDelete(zl,&p);
|
|
|
|
p = ziplistPrev(zl,p);
|
2010-05-30 01:39:41 +02:00
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
printf("\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-30 01:39:41 +02:00
|
|
|
}
|
|
|
|
|
2010-05-21 14:11:29 +02:00
|
|
|
printf("Delete inclusive range 0,0:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-05-21 15:44:47 +02:00
|
|
|
zl = ziplistDeleteRange(zl, 0, 1);
|
2010-05-21 14:11:29 +02:00
|
|
|
ziplistRepr(zl);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 14:11:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Delete inclusive range 0,1:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-05-21 15:44:47 +02:00
|
|
|
zl = ziplistDeleteRange(zl, 0, 2);
|
2010-05-21 14:11:29 +02:00
|
|
|
ziplistRepr(zl);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 14:11:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Delete inclusive range 1,2:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-05-21 15:44:47 +02:00
|
|
|
zl = ziplistDeleteRange(zl, 1, 2);
|
2010-05-21 14:11:29 +02:00
|
|
|
ziplistRepr(zl);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 14:11:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Delete with start index out of range:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-05-21 15:44:47 +02:00
|
|
|
zl = ziplistDeleteRange(zl, 5, 1);
|
2010-05-21 14:11:29 +02:00
|
|
|
ziplistRepr(zl);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 14:11:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Delete with num overflow:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-05-21 15:44:47 +02:00
|
|
|
zl = ziplistDeleteRange(zl, 1, 5);
|
2010-05-21 14:11:29 +02:00
|
|
|
ziplistRepr(zl);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-21 13:16:08 +02:00
|
|
|
}
|
|
|
|
|
2010-05-21 15:46:00 +02:00
|
|
|
printf("Delete foo while iterating:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-06-01 17:57:09 +02:00
|
|
|
p = ziplistIndex(zl,0);
|
|
|
|
while (ziplistGet(p,&entry,&elen,&value)) {
|
|
|
|
if (entry && strncmp("foo",(char*)entry,elen) == 0) {
|
2010-05-21 15:46:00 +02:00
|
|
|
printf("Delete foo\n");
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistDelete(zl,&p);
|
2010-05-21 15:46:00 +02:00
|
|
|
} else {
|
|
|
|
printf("Entry: ");
|
2010-05-22 15:48:27 +02:00
|
|
|
if (entry) {
|
2010-11-02 11:15:09 +01:00
|
|
|
if (elen && fwrite(entry,elen,1,stdout) == 0)
|
|
|
|
perror("fwrite");
|
2010-05-22 15:48:27 +02:00
|
|
|
} else {
|
2010-06-01 17:57:09 +02:00
|
|
|
printf("%lld",value);
|
2010-05-22 15:48:27 +02:00
|
|
|
}
|
2010-06-01 17:57:09 +02:00
|
|
|
p = ziplistNext(zl,p);
|
2010-05-22 15:48:27 +02:00
|
|
|
printf("\n");
|
2010-05-21 15:46:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
ziplistRepr(zl);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
|
|
|
|
2021-02-12 18:03:10 +01:00
|
|
|
printf("Replace with same size:\n");
|
|
|
|
{
|
|
|
|
zl = createList(); /* "hello", "foo", "quux", "1024" */
|
|
|
|
unsigned char *orig_zl = zl;
|
|
|
|
p = ziplistIndex(zl, 0);
|
|
|
|
zl = ziplistReplace(zl, p, (unsigned char*)"zoink", 5);
|
|
|
|
p = ziplistIndex(zl, 3);
|
|
|
|
zl = ziplistReplace(zl, p, (unsigned char*)"yy", 2);
|
|
|
|
p = ziplistIndex(zl, 1);
|
|
|
|
zl = ziplistReplace(zl, p, (unsigned char*)"65536", 5);
|
|
|
|
p = ziplistIndex(zl, 0);
|
|
|
|
assert(!memcmp((char*)p,
|
|
|
|
"\x00\x05zoink"
|
|
|
|
"\x07\xf0\x00\x00\x01" /* 65536 as int24 */
|
|
|
|
"\x05\x04quux" "\x06\x02yy" "\xff",
|
|
|
|
23));
|
|
|
|
assert(zl == orig_zl); /* no reallocations have happened */
|
|
|
|
zfree(zl);
|
|
|
|
printf("SUCCESS\n\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("Replace with different size:\n");
|
|
|
|
{
|
|
|
|
zl = createList(); /* "hello", "foo", "quux", "1024" */
|
|
|
|
p = ziplistIndex(zl, 1);
|
|
|
|
zl = ziplistReplace(zl, p, (unsigned char*)"squirrel", 8);
|
|
|
|
p = ziplistIndex(zl, 0);
|
|
|
|
assert(!strncmp((char*)p,
|
|
|
|
"\x00\x05hello" "\x07\x08squirrel" "\x0a\x04quux"
|
|
|
|
"\x06\xc0\x00\x04" "\xff",
|
|
|
|
28));
|
|
|
|
zfree(zl);
|
|
|
|
printf("SUCCESS\n\n");
|
|
|
|
}
|
|
|
|
|
2010-09-23 22:04:19 +02:00
|
|
|
printf("Regression test for >255 byte strings:\n");
|
|
|
|
{
|
2014-11-13 16:21:27 -05:00
|
|
|
char v1[257] = {0}, v2[257] = {0};
|
2010-09-23 22:04:19 +02:00
|
|
|
memset(v1,'x',256);
|
|
|
|
memset(v2,'y',256);
|
|
|
|
zl = ziplistNew();
|
|
|
|
zl = ziplistPush(zl,(unsigned char*)v1,strlen(v1),ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl,(unsigned char*)v2,strlen(v2),ZIPLIST_TAIL);
|
|
|
|
|
|
|
|
/* Pop values again and compare their value. */
|
|
|
|
p = ziplistIndex(zl,0);
|
|
|
|
assert(ziplistGet(p,&entry,&elen,&value));
|
2010-10-14 21:11:42 +02:00
|
|
|
assert(strncmp(v1,(char*)entry,elen) == 0);
|
2010-09-23 22:04:19 +02:00
|
|
|
p = ziplistIndex(zl,1);
|
|
|
|
assert(ziplistGet(p,&entry,&elen,&value));
|
2010-10-14 21:11:42 +02:00
|
|
|
assert(strncmp(v2,(char*)entry,elen) == 0);
|
2010-09-23 22:04:19 +02:00
|
|
|
printf("SUCCESS\n\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-09-23 22:04:19 +02:00
|
|
|
}
|
|
|
|
|
2012-08-13 14:09:40 -07:00
|
|
|
printf("Regression test deleting next to last entries:\n");
|
|
|
|
{
|
2014-11-13 16:21:27 -05:00
|
|
|
char v[3][257] = {{0}};
|
|
|
|
zlentry e[3] = {{.prevrawlensize = 0, .prevrawlen = 0, .lensize = 0,
|
|
|
|
.len = 0, .headersize = 0, .encoding = 0, .p = NULL}};
|
2014-11-08 10:16:54 -05:00
|
|
|
size_t i;
|
2012-08-13 14:09:40 -07:00
|
|
|
|
|
|
|
for (i = 0; i < (sizeof(v)/sizeof(v[0])); i++) {
|
|
|
|
memset(v[i], 'a' + i, sizeof(v[0]));
|
|
|
|
}
|
|
|
|
|
|
|
|
v[0][256] = '\0';
|
|
|
|
v[1][ 1] = '\0';
|
|
|
|
v[2][256] = '\0';
|
|
|
|
|
|
|
|
zl = ziplistNew();
|
|
|
|
for (i = 0; i < (sizeof(v)/sizeof(v[0])); i++) {
|
|
|
|
zl = ziplistPush(zl, (unsigned char *) v[i], strlen(v[i]), ZIPLIST_TAIL);
|
|
|
|
}
|
|
|
|
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1);
|
|
|
|
assert(e[1].prevrawlensize == 5);
|
|
|
|
assert(e[2].prevrawlensize == 1);
|
|
|
|
|
|
|
|
/* Deleting entry 1 will increase `prevrawlensize` for entry 2 */
|
|
|
|
unsigned char *p = e[1].p;
|
|
|
|
zl = ziplistDelete(zl, &p);
|
|
|
|
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1);
|
|
|
|
assert(e[1].prevrawlensize == 5);
|
|
|
|
|
|
|
|
printf("SUCCESS\n\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2012-08-13 14:09:40 -07:00
|
|
|
}
|
|
|
|
|
2010-05-30 03:06:12 +02:00
|
|
|
printf("Create long list and check indices:\n");
|
|
|
|
{
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
unsigned long long start = usec();
|
2010-05-30 03:06:12 +02:00
|
|
|
zl = ziplistNew();
|
|
|
|
char buf[32];
|
|
|
|
int i,len;
|
|
|
|
for (i = 0; i < 1000; i++) {
|
|
|
|
len = sprintf(buf,"%d",i);
|
2010-06-01 17:57:09 +02:00
|
|
|
zl = ziplistPush(zl,(unsigned char*)buf,len,ZIPLIST_TAIL);
|
2010-05-30 03:06:12 +02:00
|
|
|
}
|
|
|
|
for (i = 0; i < 1000; i++) {
|
|
|
|
p = ziplistIndex(zl,i);
|
|
|
|
assert(ziplistGet(p,NULL,NULL,&value));
|
|
|
|
assert(i == value);
|
|
|
|
|
|
|
|
p = ziplistIndex(zl,-i-1);
|
|
|
|
assert(ziplistGet(p,NULL,NULL,&value));
|
|
|
|
assert(999-i == value);
|
|
|
|
}
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
printf("SUCCESS. usec=%lld\n\n", usec()-start);
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-05-30 03:06:12 +02:00
|
|
|
}
|
|
|
|
|
2010-05-22 16:25:06 +02:00
|
|
|
printf("Compare strings with ziplist entries:\n");
|
|
|
|
{
|
|
|
|
zl = createList();
|
2010-06-01 17:57:09 +02:00
|
|
|
p = ziplistIndex(zl,0);
|
|
|
|
if (!ziplistCompare(p,(unsigned char*)"hello",5)) {
|
2010-05-29 15:40:40 +02:00
|
|
|
printf("ERROR: not \"hello\"\n");
|
2010-05-29 19:34:14 +02:00
|
|
|
return 1;
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
2010-06-01 17:57:09 +02:00
|
|
|
if (ziplistCompare(p,(unsigned char*)"hella",5)) {
|
2010-05-29 15:40:40 +02:00
|
|
|
printf("ERROR: \"hella\"\n");
|
2010-05-29 19:34:14 +02:00
|
|
|
return 1;
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
|
|
|
|
2010-06-01 17:57:09 +02:00
|
|
|
p = ziplistIndex(zl,3);
|
|
|
|
if (!ziplistCompare(p,(unsigned char*)"1024",4)) {
|
2014-11-21 14:52:10 -05:00
|
|
|
printf("ERROR: not \"1024\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (ziplistCompare(p,(unsigned char*)"1025",4)) {
|
|
|
|
printf("ERROR: \"1025\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("SUCCESS\n\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2014-11-21 14:52:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Merge test:\n");
|
|
|
|
{
|
|
|
|
/* create list gives us: [hello, foo, quux, 1024] */
|
|
|
|
zl = createList();
|
|
|
|
unsigned char *zl2 = createList();
|
|
|
|
|
|
|
|
unsigned char *zl3 = ziplistNew();
|
|
|
|
unsigned char *zl4 = ziplistNew();
|
|
|
|
|
|
|
|
if (ziplistMerge(&zl4, &zl4)) {
|
|
|
|
printf("ERROR: Allowed merging of one ziplist into itself.\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Merge two empty ziplists, get empty result back. */
|
|
|
|
zl4 = ziplistMerge(&zl3, &zl4);
|
|
|
|
ziplistRepr(zl4);
|
|
|
|
if (ziplistLen(zl4)) {
|
|
|
|
printf("ERROR: Merging two empty ziplists created entries.\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
zfree(zl4);
|
|
|
|
|
|
|
|
zl2 = ziplistMerge(&zl, &zl2);
|
|
|
|
/* merge gives us: [hello, foo, quux, 1024, hello, foo, quux, 1024] */
|
|
|
|
ziplistRepr(zl2);
|
|
|
|
|
|
|
|
if (ziplistLen(zl2) != 8) {
|
|
|
|
printf("ERROR: Merged length not 8, but: %u\n", ziplistLen(zl2));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
p = ziplistIndex(zl2,0);
|
|
|
|
if (!ziplistCompare(p,(unsigned char*)"hello",5)) {
|
|
|
|
printf("ERROR: not \"hello\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (ziplistCompare(p,(unsigned char*)"hella",5)) {
|
|
|
|
printf("ERROR: \"hella\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
p = ziplistIndex(zl2,3);
|
|
|
|
if (!ziplistCompare(p,(unsigned char*)"1024",4)) {
|
|
|
|
printf("ERROR: not \"1024\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (ziplistCompare(p,(unsigned char*)"1025",4)) {
|
|
|
|
printf("ERROR: \"1025\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
p = ziplistIndex(zl2,4);
|
|
|
|
if (!ziplistCompare(p,(unsigned char*)"hello",5)) {
|
|
|
|
printf("ERROR: not \"hello\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (ziplistCompare(p,(unsigned char*)"hella",5)) {
|
|
|
|
printf("ERROR: \"hella\"\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
p = ziplistIndex(zl2,7);
|
|
|
|
if (!ziplistCompare(p,(unsigned char*)"1024",4)) {
|
2010-05-29 15:40:40 +02:00
|
|
|
printf("ERROR: not \"1024\"\n");
|
2010-05-29 19:34:14 +02:00
|
|
|
return 1;
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
2010-06-01 17:57:09 +02:00
|
|
|
if (ziplistCompare(p,(unsigned char*)"1025",4)) {
|
2010-05-29 15:40:40 +02:00
|
|
|
printf("ERROR: \"1025\"\n");
|
2010-05-29 19:34:14 +02:00
|
|
|
return 1;
|
2010-05-22 16:25:06 +02:00
|
|
|
}
|
2010-09-06 23:12:41 +02:00
|
|
|
printf("SUCCESS\n\n");
|
2014-11-21 21:03:25 -05:00
|
|
|
zfree(zl);
|
2010-09-06 23:12:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Stress with random payloads of different encoding:\n");
|
|
|
|
{
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
unsigned long long start = usec();
|
2010-10-14 21:11:42 +02:00
|
|
|
int i,j,len,where;
|
2010-09-06 23:12:41 +02:00
|
|
|
unsigned char *p;
|
2010-10-14 21:11:42 +02:00
|
|
|
char buf[1024];
|
2011-05-05 14:55:51 +02:00
|
|
|
int buflen;
|
2010-10-14 21:11:42 +02:00
|
|
|
list *ref;
|
|
|
|
listNode *refnode;
|
|
|
|
|
|
|
|
/* Hold temp vars from ziplist */
|
|
|
|
unsigned char *sstr;
|
|
|
|
unsigned int slen;
|
|
|
|
long long sval;
|
|
|
|
|
|
|
|
for (i = 0; i < 20000; i++) {
|
|
|
|
zl = ziplistNew();
|
|
|
|
ref = listCreate();
|
2014-11-08 10:16:54 -05:00
|
|
|
listSetFreeMethod(ref,(void (*)(void*))sdsfree);
|
2010-10-14 21:11:42 +02:00
|
|
|
len = rand() % 256;
|
|
|
|
|
|
|
|
/* Create lists */
|
|
|
|
for (j = 0; j < len; j++) {
|
|
|
|
where = (rand() & 1) ? ZIPLIST_HEAD : ZIPLIST_TAIL;
|
2011-05-05 14:55:51 +02:00
|
|
|
if (rand() % 2) {
|
|
|
|
buflen = randstring(buf,1,sizeof(buf)-1);
|
|
|
|
} else {
|
|
|
|
switch(rand() % 3) {
|
|
|
|
case 0:
|
|
|
|
buflen = sprintf(buf,"%lld",(0LL + rand()) >> 20);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
buflen = sprintf(buf,"%lld",(0LL + rand()));
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
buflen = sprintf(buf,"%lld",(0LL + rand()) << 20);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
assert(NULL);
|
|
|
|
}
|
2010-10-14 21:11:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Add to ziplist */
|
2011-05-05 14:55:51 +02:00
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, buflen, where);
|
2010-09-06 23:12:41 +02:00
|
|
|
|
2010-10-14 21:11:42 +02:00
|
|
|
/* Add to reference list */
|
|
|
|
if (where == ZIPLIST_HEAD) {
|
2011-05-05 14:55:51 +02:00
|
|
|
listAddNodeHead(ref,sdsnewlen(buf, buflen));
|
2010-10-14 21:11:42 +02:00
|
|
|
} else if (where == ZIPLIST_TAIL) {
|
2011-05-05 14:55:51 +02:00
|
|
|
listAddNodeTail(ref,sdsnewlen(buf, buflen));
|
2010-10-14 21:11:42 +02:00
|
|
|
} else {
|
|
|
|
assert(NULL);
|
|
|
|
}
|
2010-09-06 23:12:41 +02:00
|
|
|
}
|
|
|
|
|
2010-10-14 21:11:42 +02:00
|
|
|
assert(listLength(ref) == ziplistLen(zl));
|
|
|
|
for (j = 0; j < len; j++) {
|
|
|
|
/* Naive way to get elements, but similar to the stresser
|
|
|
|
* executed from the Tcl test suite. */
|
|
|
|
p = ziplistIndex(zl,j);
|
|
|
|
refnode = listIndex(ref,j);
|
|
|
|
|
|
|
|
assert(ziplistGet(p,&sstr,&slen,&sval));
|
|
|
|
if (sstr == NULL) {
|
2011-05-05 14:55:51 +02:00
|
|
|
buflen = sprintf(buf,"%lld",sval);
|
2010-10-14 21:11:42 +02:00
|
|
|
} else {
|
2011-05-05 14:55:51 +02:00
|
|
|
buflen = slen;
|
|
|
|
memcpy(buf,sstr,buflen);
|
|
|
|
buf[buflen] = '\0';
|
2010-10-14 21:11:42 +02:00
|
|
|
}
|
2011-05-05 14:55:51 +02:00
|
|
|
assert(memcmp(buf,listNodeValue(refnode),buflen) == 0);
|
2010-10-14 21:11:42 +02:00
|
|
|
}
|
|
|
|
zfree(zl);
|
|
|
|
listRelease(ref);
|
2010-09-06 23:12:41 +02:00
|
|
|
}
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
printf("Done. usec=%lld\n\n", usec()-start);
|
2010-05-21 15:46:00 +02:00
|
|
|
}
|
|
|
|
|
2010-06-01 17:57:51 +02:00
|
|
|
printf("Stress with variable ziplist size:\n");
|
|
|
|
{
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
unsigned long long start = usec();
|
2010-06-01 17:57:51 +02:00
|
|
|
stress(ZIPLIST_HEAD,100000,16384,256);
|
|
|
|
stress(ZIPLIST_TAIL,100000,16384,256);
|
Sanitize dump payload: ziplist, listpack, zipmap, intset, stream
When loading an encoded payload we will at least do a shallow validation to
check that the size that's encoded in the payload matches the size of the
allocation.
This let's us later use this encoded size to make sure the various offsets
inside encoded payload don't reach outside the allocation, if they do, we'll
assert/panic, but at least we won't segfault or smear memory.
We can also do 'deep' validation which runs on all the records of the encoded
payload and validates that they don't contain invalid offsets. This lets us
detect corruptions early and reject a RESTORE command rather than accepting
it and asserting (crashing) later when accessing that payload via some command.
configuration:
- adding ACL flag skip-sanitize-payload
- adding config sanitize-dump-payload [yes/no/clients]
For now, we don't have a good way to ensure MIGRATE in cluster resharding isn't
being slowed down by these sanitation, so i'm setting the default value to `no`,
but later on it should be set to `clients` by default.
changes:
- changing rdbReportError not to `exit` in RESTORE command
- adding a new stat to be able to later check if cluster MIGRATE isn't being
slowed down by sanitation.
2020-08-13 16:41:05 +03:00
|
|
|
printf("Done. usec=%lld\n\n", usec()-start);
|
2010-06-01 17:57:51 +02:00
|
|
|
}
|
|
|
|
|
2020-09-08 15:51:20 +03:00
|
|
|
/* Benchmarks */
|
|
|
|
{
|
|
|
|
zl = ziplistNew();
|
|
|
|
for (int i=0; i<100000; i++) {
|
|
|
|
char buf[4096] = "asdf";
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, 4, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, 40, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, 400, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)buf, 4000, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"1", 1, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"10", 2, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"100", 3, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"1000", 4, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"10000", 5, ZIPLIST_TAIL);
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)"100000", 6, ZIPLIST_TAIL);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("Benchmark ziplistFind:\n");
|
|
|
|
{
|
|
|
|
unsigned long long start = usec();
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
|
|
unsigned char *fptr = ziplistIndex(zl, ZIPLIST_HEAD);
|
|
|
|
fptr = ziplistFind(zl, fptr, (unsigned char*)"nothing", 7, 1);
|
|
|
|
}
|
|
|
|
printf("%lld\n", usec()-start);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("Benchmark ziplistIndex:\n");
|
|
|
|
{
|
|
|
|
unsigned long long start = usec();
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
|
|
ziplistIndex(zl, 99999);
|
|
|
|
}
|
|
|
|
printf("%lld\n", usec()-start);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("Benchmark ziplistValidateIntegrity:\n");
|
|
|
|
{
|
|
|
|
unsigned long long start = usec();
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
|
|
ziplistValidateIntegrity(zl, ziplistBlobLen(zl), 1, NULL, NULL);
|
|
|
|
}
|
|
|
|
printf("%lld\n", usec()-start);
|
|
|
|
}
|
|
|
|
|
|
|
|
zfree(zl);
|
|
|
|
}
|
|
|
|
|
2020-08-28 09:22:35 -05:00
|
|
|
printf("Stress __ziplistCascadeUpdate:\n");
|
|
|
|
{
|
|
|
|
char data[ZIP_BIG_PREVLEN];
|
|
|
|
zl = ziplistNew();
|
|
|
|
for (int i = 0; i < 100000; i++) {
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)data, ZIP_BIG_PREVLEN-4, ZIPLIST_TAIL);
|
|
|
|
}
|
|
|
|
unsigned long long start = usec();
|
|
|
|
zl = ziplistPush(zl, (unsigned char*)data, ZIP_BIG_PREVLEN-3, ZIPLIST_HEAD);
|
|
|
|
printf("Done. usec=%lld\n\n", usec()-start);
|
|
|
|
zfree(zl);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("Edge cases of __ziplistCascadeUpdate:\n");
|
|
|
|
{
|
|
|
|
/* Inserting a entry with data length greater than ZIP_BIG_PREVLEN-4
|
|
|
|
* will leads to cascade update. */
|
|
|
|
size_t s1 = ZIP_BIG_PREVLEN-4, s2 = ZIP_BIG_PREVLEN-3;
|
|
|
|
zl = ziplistNew();
|
|
|
|
|
|
|
|
zlentry e[4] = {{.prevrawlensize = 0, .prevrawlen = 0, .lensize = 0,
|
|
|
|
.len = 0, .headersize = 0, .encoding = 0, .p = NULL}};
|
|
|
|
|
|
|
|
zl = insertHelper(zl, 'a', s1, ZIPLIST_ENTRY_HEAD(zl));
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1 && e[0].prevrawlen == 0);
|
|
|
|
assert(compareHelper(zl, 'a', s1, 0));
|
|
|
|
ziplistRepr(zl);
|
|
|
|
|
|
|
|
/* No expand. */
|
|
|
|
zl = insertHelper(zl, 'b', s1, ZIPLIST_ENTRY_HEAD(zl));
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1 && e[0].prevrawlen == 0);
|
|
|
|
assert(compareHelper(zl, 'b', s1, 0));
|
|
|
|
|
|
|
|
assert(e[1].prevrawlensize == 1 && e[1].prevrawlen == strEntryBytesSmall(s1));
|
|
|
|
assert(compareHelper(zl, 'a', s1, 1));
|
|
|
|
|
|
|
|
ziplistRepr(zl);
|
|
|
|
|
|
|
|
/* Expand(tail included). */
|
|
|
|
zl = insertHelper(zl, 'c', s2, ZIPLIST_ENTRY_HEAD(zl));
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1 && e[0].prevrawlen == 0);
|
|
|
|
assert(compareHelper(zl, 'c', s2, 0));
|
|
|
|
|
|
|
|
assert(e[1].prevrawlensize == 5 && e[1].prevrawlen == strEntryBytesSmall(s2));
|
|
|
|
assert(compareHelper(zl, 'b', s1, 1));
|
|
|
|
|
|
|
|
assert(e[2].prevrawlensize == 5 && e[2].prevrawlen == strEntryBytesLarge(s1));
|
|
|
|
assert(compareHelper(zl, 'a', s1, 2));
|
|
|
|
|
|
|
|
ziplistRepr(zl);
|
|
|
|
|
|
|
|
/* Expand(only previous head entry). */
|
|
|
|
zl = insertHelper(zl, 'd', s2, ZIPLIST_ENTRY_HEAD(zl));
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1 && e[0].prevrawlen == 0);
|
|
|
|
assert(compareHelper(zl, 'd', s2, 0));
|
|
|
|
|
|
|
|
assert(e[1].prevrawlensize == 5 && e[1].prevrawlen == strEntryBytesSmall(s2));
|
|
|
|
assert(compareHelper(zl, 'c', s2, 1));
|
|
|
|
|
|
|
|
assert(e[2].prevrawlensize == 5 && e[2].prevrawlen == strEntryBytesLarge(s2));
|
|
|
|
assert(compareHelper(zl, 'b', s1, 2));
|
|
|
|
|
|
|
|
assert(e[3].prevrawlensize == 5 && e[3].prevrawlen == strEntryBytesLarge(s1));
|
|
|
|
assert(compareHelper(zl, 'a', s1, 3));
|
|
|
|
|
|
|
|
ziplistRepr(zl);
|
|
|
|
|
|
|
|
/* Delete from mid. */
|
|
|
|
unsigned char *p = ziplistIndex(zl, 2);
|
|
|
|
zl = ziplistDelete(zl, &p);
|
|
|
|
verify(zl, e);
|
|
|
|
|
|
|
|
assert(e[0].prevrawlensize == 1 && e[0].prevrawlen == 0);
|
|
|
|
assert(compareHelper(zl, 'd', s2, 0));
|
|
|
|
|
|
|
|
assert(e[1].prevrawlensize == 5 && e[1].prevrawlen == strEntryBytesSmall(s2));
|
|
|
|
assert(compareHelper(zl, 'c', s2, 1));
|
|
|
|
|
|
|
|
assert(e[2].prevrawlensize == 5 && e[2].prevrawlen == strEntryBytesLarge(s2));
|
|
|
|
assert(compareHelper(zl, 'a', s1, 2));
|
|
|
|
|
|
|
|
ziplistRepr(zl);
|
|
|
|
|
|
|
|
zfree(zl);
|
|
|
|
}
|
|
|
|
|
2010-05-21 12:54:01 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|