From: akr@... Date: 2014-03-06T10:43:08+00:00 Subject: [ruby-core:61330] [ruby-trunk - Bug #9600] sysconf(_SC_GETGR_R_SIZE_MAX) is just a hint for getgrnam_r() Issue #9600 has been updated by Akira Tanaka. Off topic. Yui NARUSE wrote: > > SuSv7 changes it. > > * http://pubs.opengroup.org/onlinepubs/009695399/functions/getgrnam.html v6's getgrnam_r > * http://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrnam.html v7's getgrnam_r > * http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html v7's sysconf There is no Single Unix Specification version 7 (yet). The issue number is not the version number. SUSv3: | The Single UNIX Specification, Version 3 is made up of the Base Specifications, Issue 6 and | X/Open Curses, Issue 4, Version 2. http://www.unix.org/version3/sus_contents.html SUSv4: | The Single UNIX Specification uses The Open Group Base Specifications, Issue 7 documentation as its core. | The documentation is structured as follows: | * The Base Specifications, Issue 7, composed of: | - Base Definitions, Issue 7 (XBD7) | - System Interfaces, Issue 7 (XSH7) | - Shell and Utilities, Issue 7 (XCU7) | - Rationale, Issue 7, (XRAT7) (Informative) | * X/Open Curses, Issue 7 http://www.unix.org/version4/overview.html ---------------------------------------- Bug #9600: sysconf(_SC_GETGR_R_SIZE_MAX) is just a hint for getgrnam_r() https://bugs.ruby-lang.org/issues/9600#change-45654 * Author: Rei Odaira * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: ruby 2.2.0dev (2014-03-05) [powerpc64-linux] * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- When there is a group that has a lot of members, TestProcess#test_execopts_gid fails. Following is a more simple example: $ ruby -e 'system("true", gid: "largegroup")' -e:1:in `system': Numerical result out of range - getgrnam_r (Errno::ERANGE) from -e:1:in `
' This wrong exception happens because obj2gid() in process.c calls getgrnam_r() with a buffer that was allocated based on the size returned by sysconf(_SC_GETGR_R_SIZE_MAX). In Linux, sysconf(_SC_GETGR_R_SIZE_MAX) returns 1024, but actually this value is just a hint, so obj2gid() should gradually extend the buffer until getgrnam_r() no longer throws ERANGE. The same issue was reported in the following page: http://tomlee.co/2012/10/problems-with-large-linux-unix-groups-and-getgrgid_r-getgrnam_r/ -- http://bugs.ruby-lang.org/