RFR: 8289778: ZGC: incorrect use of os::free() for mountpoint string handling after JDK-8289633 [v3]
Thomas Stuefe
stuefe at openjdk.org
Thu Jul 7 13:03:01 UTC 2022
On Thu, 7 Jul 2022 09:29:12 GMT, Jie Fu <jiefu at openjdk.org> wrote:
>> Hi all,
>>
>> ZGC crashes were observed by us after JDK-8289633 due to incorrect use of `os::free()` for mountpoint string handling.
>>
>> For example, `line_mountpoint` and `line_filesystem` will be allocated by `sscanf` @line60.
>> And `line` will be allocated by `getline` @line84.
>>
>>
>> 53 char* ZMountPoint::get_mountpoint(const char* line, const char* filesystem) const {
>> 54 char* line_mountpoint = NULL;
>> 55 char* line_filesystem = NULL;
>> 56
>> 57 // Parse line and return a newly allocated string containing the mount point if
>> 58 // the line contains a matching filesystem and the mount point is accessible by
>> 59 // the current user.
>> 60 if (sscanf(line, "%*u %*u %*u:%*u %*s %ms %*[^-]- %ms", &line_mountpoint, &line_filesystem) != 2 ||
>> 61 strcmp(line_filesystem, filesystem) != 0 ||
>> 62 access(line_mountpoint, R_OK|W_OK|X_OK) != 0) {
>> 63 // Not a matching or accessible filesystem
>> 64 os::free(line_mountpoint);
>> 65 line_mountpoint = NULL;
>> 66 }
>> 67
>> 68 os::free(line_filesystem);
>> 69
>> 70 return line_mountpoint;
>> 71 }
>> 72
>> 73 void ZMountPoint::get_mountpoints(const char* filesystem, ZArray<char*>* mountpoints) const {
>> 74 FILE* fd = os::fopen(PROC_SELF_MOUNTINFO, "r");
>> 75 if (fd == NULL) {
>> 76 ZErrno err;
>> 77 log_error_p(gc)("Failed to open %s: %s", PROC_SELF_MOUNTINFO, err.to_string());
>> 78 return;
>> 79 }
>> 80
>> 81 char* line = NULL;
>> 82 size_t length = 0;
>> 83
>> 84 while (getline(&line, &length, fd) != -1) {
>> 85 char* const mountpoint = get_mountpoint(line, filesystem);
>> 86 if (mountpoint != NULL) {
>> 87 mountpoints->append(mountpoint);
>> 88 }
>> 89 }
>> 90
>> 91 os::free(line);
>> 92 fclose(fd);
>> 93 }
>>
>>
>> See the anaylis of the crash reason in https://bugs.openjdk.org/browse/JDK-8289477
>>
>> That means we have raw `::malloc() -> os::free()`, which is unbalanced.
>> Raw `::malloc()` does not write the header `os::free()` expects.
>> If NMT is on, we assert now, because NMT does not find its header in os::free().
>>
>>
>> The fix just reverts `os::free()` to `::free()`.
>>
>> Testing:
>> - hotspot/jtreg/gc/z on Linux/x64, all passed
>>
>> Thanks.
>> Best regards,
>> Jie
>
> Jie Fu has updated the pull request incrementally with one additional commit since the last revision:
>
> Address review comment
Thanks!
-------------
PR: https://git.openjdk.org/jdk/pull/9387
More information about the hotspot-dev
mailing list