| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
bugprone: parenthesize macro arguments/replacement lists The last of the three categories flatcap flagged as good candidates on #4970 -- bugprone-macro-parentheses. 28 sites across 13 files fixed; 7 confirmed as genuine false positives and deliberately left untouched (see below). Every site was checked against its actual call sites for a live bug, not just mechanically wrapped: - Simple negative-constant macros (COLOR_DEFAULT, MUTT_WIN_SIZE_UNLIMITED, OP_REPAINT/TIMEOUT/ABORT, IMAP_RES_NO/BAD, MUTT_MAXRANGE) get their replacement list wrapped. - Value-expression arguments used unparenthesized next to an operator (config/types.h's IS_MAILBOX/IS_COMMAND, mutt/array.h's ARRAY_GET, mutt/mbyte.h's IsWPrint/IsBOM, notmuch/private.h's LIBNOTMUCH_CHECK_VERSION) get the argument wrapped -- no live caller currently passes a compound expression, but this is exactly the class of bug that bites the next caller who does. - mutt/string2.h's SKIPWS and mutt/array.h's ARRAY_FOREACH_(REVERSE_)FROM_TO wrap the argument even though it's used as an assignment/increment target, since `(x)++`/`(x) = ...` are equivalent to the unparenthesized form for any valid lvalue -- harmless, satisfies the check. Three false-positive patterns confirmed and left alone, since parenthesizing would either not compile or change meaning: - mutt/atoi.h:39 and mutt/memory.h:57: the macro argument is a type name (a function parameter's type, and a _Generic type-association respectively), not a value expression -- wrapping a type name in parens isn't valid there. - mutt/array.h:52: same class -- `T` is the array element's type name in a struct member declaration. - mutt/queue.h:437/632/887/896 (all four remaining sites in that file): `field` is passed as a member-designator into `__containerof()` (built on `offsetof()`), not a value expression. Verified empirically with a standalone test file: parenthesizing a member-designator argument to `offsetof()` is a genuine compile error ("expected identifier"), not just a style question. Verification: `clang-tidy -p . <file> --checks='-*,bugprone-macro-parentheses' --header-filter='.*'` now reports only the 7 confirmed-false-positive sites above (was 28 fixable + 7 false positives = 35 total unique locations). Full clean build, `make test` passes (all suites), `clang-format --dry-run -Werror` shows no *new* violations in any changed file (checked differentially against each file's pre-existing state, since several of these headers already had unrelated formatting drift). AI assistance: the mechanical location of all sites, the call-site tracing to distinguish live risk from defensive-only fixes, and the identification + empirical verification of the false positives was done by Claude Code; I reviewed the reasoning and diff, including the compile-error test for the offsetof() case, before this went up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 1 个月前 | |
iwyu: tidy includes | 10 个月前 | |
doxy: comments lots of #defines | 7 个月前 | |
Make sure mutt_b64_encode null-terminates the output (#5036) * Make sure mutt_b64_encode null-terminates the output Co-authored-by: MaxHearnden <MaxHearnden@users.noreply.github.com> --------- Co-authored-by: MaxHearnden <MaxHearnden@users.noreply.github.com> | 6 天前 | |
doxy: comments lots of #defines | 7 个月前 | |
initialise things Ensure that pointers, structs and variables used as outparams are initialised. (some of variable types were obscured by typedefs) | 3 个月前 | |
Sort include <stddef.h> Semi-scripted change: $ find * -type f \ | grep '\.[ch]$' \ | xargs grep -l 'include.*stddef' \ | while read f; do clang-format -i "$f"; done; Plus manually removing unrelated changes. Fixes: ac6ef83f3229 ("fix: build of imap/auth_sasl.c") Closes: <https://github.com/neomutt/neomutt/issues/4284> Cc: Richard Russon <rich@flatcap.org> Signed-off-by: Alejandro Colomar <alx@kernel.org> | 2 年前 | |
build: fix includes for SIZE_MAX | 2 个月前 | |
refactor: upgrade macro flags to enum flags Turn #define'd flags into enums. Enums provide: - debugger visibility - compiler diagnostics - symbol scoping by convention - easier navigation/search - cleaner documentation generation - type grouping Naming: - enum has singular ending, e.g. Flag - typedef wrapper has plural ending, e.g. Flags Suffix `_NO_FLAGS` has been renamed to `_NONE` for consistency. | 4 个月前 | |
tidy source - whitespace - doxygen comments | 1 个月前 | |
tidy code - tidy include guards - drop unused menu refs | 1 个月前 | |
date: bound tm_mon in mutt_date_make_time | 2 个月前 | |
doxy: comments lots of #defines | 7 个月前 | |
envlist: fix silent truncation of long environment variables envlist_set() used a fixed char work[1024] buffer to format 'name=value' strings. Environment variables like PATH or LD_LIBRARY_PATH can easily exceed 1024 bytes, causing snprintf to silently truncate the value and store a corrupted entry. Replace with dynamic allocation sized exactly to fit the name, '=', and value. Also avoid the redundant mutt_str_dup/mutt_str_replace by directly assigning the allocated string to the environment array. | 6 个月前 | |
tidy code - tidy include guards - drop unused menu refs | 1 个月前 | |
split up variable definitions clang-tidy warns: 'warning: multiple declarations in a single statement reduces readability' | 3 个月前 | |
update copyright dates | 2 年前 | |
build: unify include guards | 3 年前 | |
split up variable definitions clang-tidy warns: 'warning: multiple declarations in a single statement reduces readability' | 3 个月前 | |
refactor: upgrade macro flags to enum flags Turn #define'd flags into enums. Enums provide: - debugger visibility - compiler diagnostics - symbol scoping by convention - easier navigation/search - cleaner documentation generation - type grouping Naming: - enum has singular ending, e.g. Flag - typedef wrapper has plural ending, e.g. Flags Suffix `_NO_FLAGS` has been renamed to `_NONE` for consistency. | 4 个月前 | |
initialise things Ensure that pointers, structs and variables used as outparams are initialised. (some of variable types were obscured by typedefs) | 3 个月前 | |
doxy: comments lots of #defines | 7 个月前 | |
split up variable definitions clang-tidy warns: 'warning: multiple declarations in a single statement reduces readability' | 3 个月前 | |
refactor: upgrade macro flags to enum flags Turn #define'd flags into enums. Enums provide: - debugger visibility - compiler diagnostics - symbol scoping by convention - easier navigation/search - cleaner documentation generation - type grouping Naming: - enum has singular ending, e.g. Flag - typedef wrapper has plural ending, e.g. Flags Suffix `_NO_FLAGS` has been renamed to `_NONE` for consistency. | 4 个月前 | |
merge protos.h into mutt.h | 8 个月前 | |
split up variable definitions clang-tidy warns: 'warning: multiple declarations in a single statement reduces readability' | 3 个月前 | |
move stailq functions | 8 个月前 | |
initialise things Ensure that pointers, structs and variables used as outparams are initialised. (some of variable types were obscured by typedefs) | 3 个月前 | |
build: move log_disp_null() log_disp_null() is used by the tests and the fuzzers. Move it into the libmutt to save duplication. | 7 个月前 | |
fix typos Char 0 is NUL. | 1 年前 | |
update copyright dates | 2 年前 | |
split up variable definitions clang-tidy warns: 'warning: multiple declarations in a single statement reduces readability' | 3 个月前 | |
bugprone: parenthesize macro arguments/replacement lists The last of the three categories flatcap flagged as good candidates on #4970 -- bugprone-macro-parentheses. 28 sites across 13 files fixed; 7 confirmed as genuine false positives and deliberately left untouched (see below). Every site was checked against its actual call sites for a live bug, not just mechanically wrapped: - Simple negative-constant macros (COLOR_DEFAULT, MUTT_WIN_SIZE_UNLIMITED, OP_REPAINT/TIMEOUT/ABORT, IMAP_RES_NO/BAD, MUTT_MAXRANGE) get their replacement list wrapped. - Value-expression arguments used unparenthesized next to an operator (config/types.h's IS_MAILBOX/IS_COMMAND, mutt/array.h's ARRAY_GET, mutt/mbyte.h's IsWPrint/IsBOM, notmuch/private.h's LIBNOTMUCH_CHECK_VERSION) get the argument wrapped -- no live caller currently passes a compound expression, but this is exactly the class of bug that bites the next caller who does. - mutt/string2.h's SKIPWS and mutt/array.h's ARRAY_FOREACH_(REVERSE_)FROM_TO wrap the argument even though it's used as an assignment/increment target, since `(x)++`/`(x) = ...` are equivalent to the unparenthesized form for any valid lvalue -- harmless, satisfies the check. Three false-positive patterns confirmed and left alone, since parenthesizing would either not compile or change meaning: - mutt/atoi.h:39 and mutt/memory.h:57: the macro argument is a type name (a function parameter's type, and a _Generic type-association respectively), not a value expression -- wrapping a type name in parens isn't valid there. - mutt/array.h:52: same class -- `T` is the array element's type name in a struct member declaration. - mutt/queue.h:437/632/887/896 (all four remaining sites in that file): `field` is passed as a member-designator into `__containerof()` (built on `offsetof()`), not a value expression. Verified empirically with a standalone test file: parenthesizing a member-designator argument to `offsetof()` is a genuine compile error ("expected identifier"), not just a style question. Verification: `clang-tidy -p . <file> --checks='-*,bugprone-macro-parentheses' --header-filter='.*'` now reports only the 7 confirmed-false-positive sites above (was 28 fixable + 7 false positives = 35 total unique locations). Full clean build, `make test` passes (all suites), `clang-format --dry-run -Werror` shows no *new* violations in any changed file (checked differentially against each file's pre-existing state, since several of these headers already had unrelated formatting drift). AI assistance: the mechanical location of all sites, the call-site tracing to distinguish live risk from defensive-only fixes, and the identification + empirical verification of the false positives was done by Claude Code; I reviewed the reasoning and diff, including the compile-error test for the offsetof() case, before this went up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 1 个月前 | |
initialise things Ensure that pointers, structs and variables used as outparams are initialised. (some of variable types were obscured by typedefs) | 3 个月前 | |
doxy: document struct members Assisted-by: GitHub Copilot | 8 个月前 | |
build: fix includes for SIZE_MAX | 2 个月前 | |
Add typeas() and RVALUE() to make macros more robust (#5032) * mutt/memory.h: MUTT_MEM_REALLOC(): Refactor for readability Use a dummy (void)0 expression in _Generic(3) to make it work, and move the actual mutt_mem_reallocarray() call to a separate line. This makes the call more readable. As a side effect, this is slightly more sobust syntactically. See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121691#c5>. As a reminder, here's how this macro works: _Generic(3) takes *(pptr) and checks its type. If its type matches T*, then the expression (void)0 is evaluated. Otherwise, the compilation fails with an error. This makes sure that the pointer that we pass is of the correct type, thus adding type safety. This prevents the accidents that can happen due to typos, since the first argument of mutt_mem_reallocarray() is a void*, which is very forgiving. The expression (void)0 is just a dummy expression to be able to use _Generic(3) on a separate line. The value is explicitly ignored, and further ignored by the comma operator. Signed-off-by: Alejandro Colomar <alx@kernel.org> * mutt/memory.h: typeas(): Add macro This macro is like typeof(), but guarantees that the argument is a type name. It rejects an expression as argument. A simpler implementation of typeas() would be: #define typeas(T) __typeof__((T){}) However, that implementation wouldn't work with function types or void. That's because you can't create a compound literal of type void or of function type (or of incomplete type). The implementation we've used supports more types, by creating a pointer compount literal instead. In this case, the way to verify that T is a type is by using it in a _Generic(3) selector, which is required to be a type. Below is a complete explanation of how this macro works, since it's quite non-trivial. Here's the definition, expanded in several lines: #define typeas(T) __typeof__ \ ( \ *(__typeof__(T) *){ \ _Generic(0, T: NULL, default: NULL) \ } \ ) Let's first analyze the inner-most expression; the _Generic(3) expression: _Generic(0, T: NULL, default: NULL) _Generic(3) requires that the things before ':' are either type names or the 'default' keyword, and requires that 'default' appears at most once. This is specified in C23 in 6.5.2.1p1: <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf#subsubsection.6.5.2.1>. It is also specified in C11; I just linked to the most recent standard. This requirement is used here to make sure that T is a type name, and not something else such as an expression. After enforcing those requirements, _Generic(3) evaluates to one of its branches. In this case, since both branches are NULL, it doesn't matter which is taken, and it is evaluated as NULL. Thus, after the enforcement of T being a type name, the macro replacement list is simplified to this: __typeof__ ( *(__typeof__(T) *){ NULL } ) Now, let's focus on the innermost expression, which is the compound literal: (__typeof__(T) *){NULL} This has two parts: the type, within (), and the initializer, within {}. Compound literals are specified in C23 in 6.5.3.6: <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf#subsubsection.6.5.3.6>. (But they are a C99 feature; I just linked to the most recent standard.) The initializer is clear: it's a null pointer constant. Let's focus on the type: (__typeof__(T) *) Since we've already guaranteed (with _Generic(3)) that T is a type name, we know that __typeof__(T) will be the same as T, so we can simplify a bit for readability: (T *) So, this produces a compound literal which is a pointer of type T*, and has value NULL (but the value is uninteresting). The reason why we use __typeof__(T) instead of T directly is to allow T to be a complex type such as an array type or a function type. For example, if T is int[4], then __typeof__(int[4])* does the right thing, but int[4]* wouldn't compile. Now, let's simplify this using T* (but knowing that the real implementation needs __typeof__) and look again at the entire macro replacement list: __typeof__ ( *(T *){ NULL } ) The compount literal (which we know to be of type T* and have a null pointer as value, is dereferenced. This would normally be bad, because we can't dereference null pointers, but let's assume it's fine for now. Once we dereference a pointer of type T*, we get an lvalue of type T, whatever T is. Then, __typeof__ takes its type, and returns it; discarding the value. __typeof__ makes sure that the null pointer dereference is fine, since it's not evaluated (unless T is a VLA, in which case it's theoretically evaluated, but in practice, compilers don't need to evaluate it, so they shouldn't, and it should still be fine; but it's one of the reasons this should be part of the compiler, and I'm trying to add this to ISO C as a keyword, and also in GCC). Link: <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3634.txt> Signed-off-by: Alejandro Colomar <alx@kernel.org> * mutt/memory.h: Use typeas() to make these macros more robust typeas() can be used to parenthesize types. This allows using complex types as arguments, such as 'int[42]' or 'void(*)(void)'. Consider what would happen if we pass int[42] as the type T. Before this patch, the macro would expand int[42]*, which is a syntax error. What we want is int(*)[42], but of course text-based macros can't do that. But by parenthesizing types, we can do it as typeof(int[42])*, or in this case typeas(int[42])*. The advantage of using typeas() instead of typeof() is that typeas() guarantees that the argument is a type. Consider the case where we pass '1' as the type T by accident. typeof(1) would "work", and interpret it as typeof(int), which would hide a bug. typeas(1) would result in a syntax error, enforcing type safety. Signed-off-by: Alejandro Colomar <alx@kernel.org> * mutt/memory.h: RVALUE(): Add macro for performing lvalue conversion This macro takes an lvalue, and performs lvalue conversion, resulting in an rvalue. Signed-off-by: Alejandro Colomar <alx@kernel.org> * mutt/memory.h: Use compound literals instead of casts The purpose of the cast is converting the return type of these functions from void* to T*. This is to make sure that the result of these APIs is assigned to the right pointer, as void* allows implicit conversion to almost anything, while T* is significantly restricted. Casts are dangerous, turning off many compiler diagnostics, though, so it's good to replace it with something else if possible. Compound literals can serve the same purpose as casts in reducing implicit conversions, without silencing compiler diagnostics. However, compound literals come with their own issues; they are lvalues, and as such, their address can be taken, and they can be assigned to. To use a compound literal safely, we must perform "lvalue conversion", to turn it into a simple expression. The way to do that is the RVALUE() macro, which uses the comma operator. Signed-off-by: Alejandro Colomar <alx@kernel.org> --------- Signed-off-by: Alejandro Colomar <alx@kernel.org> | 13 天前 | |
build: unify include guards | 3 年前 | |
iwyu: fix includes | 3 个月前 | |
module: add Notify object to each globals Add a 'struct Notify *notify' member to every ModuleData struct. Create it with notify_new() in each Module.init() function, set its parent to NeoMutt->notify, and free it in Module.cleanup(). For modules that previously had commented-out init/cleanup code, uncomment the mod_data allocation and deallocation. | 5 个月前 | |
key: add notifications to km_dokey() Add notificiations to km_dokey() so that partially typed keybindings can be observed. | 4 个月前 | |
update copyright dates | 2 年前 | |
key: add notifications to km_dokey() Add notificiations to km_dokey() so that partially typed keybindings can be observed. | 4 个月前 | |
update copyright dates | 2 年前 | |
Don't return the result of `realpath` on failure According to POSIX, the output argument of `realpath(3)` is undefined on failure. The Linux man page agrees, but apparently if the failure is caused by EACCESS or ENOENT, the resolved path is still provided as output. This is also the behaviour on FreeBSD, which specifically says that on failure the path that caused the issue is left in the output. Anyway, we should not rely on anything being in the output argument on failure, and we should leave the path argument alone. | 1 年前 | |
update copyright dates | 2 年前 | |
buffer: avoid immediate realloc | 3 个月前 | |
update copyright dates | 2 年前 | |
doxy: comments lots of #defines | 7 个月前 | |
tidy source - whitespace - doxygen comments | 1 个月前 | |
clang-format | 6 个月前 | |
update copyright dates | 2 年前 | |
Update mutt/queue.h Upstream: * https://cgit.freebsd.org/src/commit/sys/sys/queue.h?id=34740937f7a46c7475bb57e804701ba8830bf6ed * https://cgit.freebsd.org/src/commit/sys/sys/queue.h?id=da2c88dfcf4f425e6e0a58d6df3a7c8e88d8df92 | 1 年前 | |
bugprone: replace rewind()/setbuf() with checked equivalents rewind() and setbuf() give clang-tidy's bugprone-unsafe-functions check no way to detect failure. Replace with their exact behavioural equivalents that do: fseek()+clearerr() for rewind() (fseek alone doesn't clear the error indicator the way rewind() does), and setvbuf() for the one setbuf() call. Three sites (nntp.c, crypt_gpgme.c, smime.c) had the original rewind() as an unbraced single-statement if-body; braces added where the two-statement replacement needed them, since one would otherwise silently run unconditionally. Doesn't add explicit fseek()/setvbuf() return-value checking beyond what the codebase already does at nearby call sites -- that would be a separate, larger error-handling question, not addressed here. Confirmed via `clang-tidy -p . <file> --checks='-*,bugprone-unsafe-functions'` this clears all 76 warnings flatcap found on PR #4970 in this category. Full clean build and `make test` pass. AI assistance: written and verified by Claude Code (mechanical transform + manual review of all 76 sites for the brace hazard above), reviewed by chrisdebian before commit. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 1 个月前 | |
send: add $message_id_format This variable allows you to choose a custom format for the Message-Id when sending messages. | 9 个月前 | |
fix: null-pointer dereference in mutt_replacelist_match() | 1 个月前 | |
drop config.h from headers only need it where there's a #if dependency or where config.h defines something like OFF_T | 7 个月前 | |
initialise things Ensure that pointers, structs and variables used as outparams are initialised. (some of variable types were obscured by typedefs) | 3 个月前 | |
drop config.h from headers only need it where there's a #if dependency or where config.h defines something like OFF_T | 7 个月前 | |
config: tidy The caller of these API functions guarantees these parameters are NOT NULL. | 1 年前 | |
Sort include <stddef.h> Semi-scripted change: $ find * -type f \ | grep '\.[ch]$' \ | xargs grep -l 'include.*stddef' \ | while read f; do clang-format -i "$f"; done; Plus manually removing unrelated changes. Fixes: ac6ef83f3229 ("fix: build of imap/auth_sasl.c") Closes: <https://github.com/neomutt/neomutt/issues/4284> Cc: Richard Russon <rich@flatcap.org> Signed-off-by: Alejandro Colomar <alx@kernel.org> | 2 年前 | |
initialise things Ensure that pointers, structs and variables used as outparams are initialised. (some of variable types were obscured by typedefs) | 3 个月前 | |
refactor: upgrade macro flags to enum flags Turn #define'd flags into enums. Enums provide: - debugger visibility - compiler diagnostics - symbol scoping by convention - easier navigation/search - cleaner documentation generation - type grouping Naming: - enum has singular ending, e.g. Flag - typedef wrapper has plural ending, e.g. Flags Suffix `_NO_FLAGS` has been renamed to `_NONE` for consistency. | 4 个月前 | |
split up variable definitions clang-tidy warns: 'warning: multiple declarations in a single statement reduces readability' | 3 个月前 | |
bugprone: parenthesize macro arguments/replacement lists The last of the three categories flatcap flagged as good candidates on #4970 -- bugprone-macro-parentheses. 28 sites across 13 files fixed; 7 confirmed as genuine false positives and deliberately left untouched (see below). Every site was checked against its actual call sites for a live bug, not just mechanically wrapped: - Simple negative-constant macros (COLOR_DEFAULT, MUTT_WIN_SIZE_UNLIMITED, OP_REPAINT/TIMEOUT/ABORT, IMAP_RES_NO/BAD, MUTT_MAXRANGE) get their replacement list wrapped. - Value-expression arguments used unparenthesized next to an operator (config/types.h's IS_MAILBOX/IS_COMMAND, mutt/array.h's ARRAY_GET, mutt/mbyte.h's IsWPrint/IsBOM, notmuch/private.h's LIBNOTMUCH_CHECK_VERSION) get the argument wrapped -- no live caller currently passes a compound expression, but this is exactly the class of bug that bites the next caller who does. - mutt/string2.h's SKIPWS and mutt/array.h's ARRAY_FOREACH_(REVERSE_)FROM_TO wrap the argument even though it's used as an assignment/increment target, since `(x)++`/`(x) = ...` are equivalent to the unparenthesized form for any valid lvalue -- harmless, satisfies the check. Three false-positive patterns confirmed and left alone, since parenthesizing would either not compile or change meaning: - mutt/atoi.h:39 and mutt/memory.h:57: the macro argument is a type name (a function parameter's type, and a _Generic type-association respectively), not a value expression -- wrapping a type name in parens isn't valid there. - mutt/array.h:52: same class -- `T` is the array element's type name in a struct member declaration. - mutt/queue.h:437/632/887/896 (all four remaining sites in that file): `field` is passed as a member-designator into `__containerof()` (built on `offsetof()`), not a value expression. Verified empirically with a standalone test file: parenthesizing a member-designator argument to `offsetof()` is a genuine compile error ("expected identifier"), not just a style question. Verification: `clang-tidy -p . <file> --checks='-*,bugprone-macro-parentheses' --header-filter='.*'` now reports only the 7 confirmed-false-positive sites above (was 28 fixable + 7 false positives = 35 total unique locations). Full clean build, `make test` passes (all suites), `clang-format --dry-run -Werror` shows no *new* violations in any changed file (checked differentially against each file's pre-existing state, since several of these headers already had unrelated formatting drift). AI assistance: the mechanical location of all sites, the call-site tracing to distinguish live risk from defensive-only fixes, and the identification + empirical verification of the false positives was done by Claude Code; I reviewed the reasoning and diff, including the compile-error test for the offsetof() case, before this went up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> | 1 个月前 | |
move files into libmutt Move two files, with zero dependencies, into libmutt. Both are fallbacks for missing system functions. - timegm.c - wcscasecmp.c | 8 个月前 | |
move files into libmutt Move two files, with zero dependencies, into libmutt. Both are fallbacks for missing system functions. - timegm.c - wcscasecmp.c | 8 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 10 个月前 | ||
| 7 个月前 | ||
| 6 天前 | ||
| 7 个月前 | ||
| 3 个月前 | ||
| 2 年前 | ||
| 2 个月前 | ||
| 4 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 7 个月前 | ||
| 6 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 2 年前 | ||
| 3 年前 | ||
| 3 个月前 | ||
| 4 个月前 | ||
| 3 个月前 | ||
| 7 个月前 | ||
| 3 个月前 | ||
| 4 个月前 | ||
| 8 个月前 | ||
| 3 个月前 | ||
| 8 个月前 | ||
| 3 个月前 | ||
| 7 个月前 | ||
| 1 年前 | ||
| 2 年前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 8 个月前 | ||
| 2 个月前 | ||
| 13 天前 | ||
| 3 年前 | ||
| 3 个月前 | ||
| 5 个月前 | ||
| 4 个月前 | ||
| 2 年前 | ||
| 4 个月前 | ||
| 2 年前 | ||
| 1 年前 | ||
| 2 年前 | ||
| 3 个月前 | ||
| 2 年前 | ||
| 7 个月前 | ||
| 1 个月前 | ||
| 6 个月前 | ||
| 2 年前 | ||
| 1 年前 | ||
| 1 个月前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 7 个月前 | ||
| 3 个月前 | ||
| 7 个月前 | ||
| 1 年前 | ||
| 2 年前 | ||
| 3 个月前 | ||
| 4 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 8 个月前 | ||
| 8 个月前 |