Bug 215097 - Example in getpwnam_r man page compares size_t variable to -1
Summary: Example in getpwnam_r man page compares size_t variable to -1
Status: NEW
Alias: None
Product: Documentation
Classification: Unclassified
Component: man-pages (show other bugs)
Hardware: All Linux
: P1 low
Assignee: documentation_man-pages@kernel-bugs.osdl.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-11-22 10:24 UTC by Fabian
Modified: 2021-11-23 11:46 UTC (History)
1 user (show)

See Also:
Kernel Version:
Subsystem:
Regression: No
Bisected commit-id:


Attachments

Description Fabian 2021-11-22 10:24:15 UTC
The getpwnam_r man page (https://man7.org/linux/man-pages/man3/getpwnam_r.3.html) has this in the example code:

           size_t bufsize;
           ...

           bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
           if (bufsize == -1)          /* Value was indeterminate */
               bufsize = 16384;        /* Should be more than enough */

bufsize is a variable with unsigned type, so this results in:

mantest.c: In function 'main':
mantest.c:14:20: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   14 |         if(bufsize == -1)
Comment 1 Alejandro Colomar 2021-11-22 12:21:11 UTC
Yes, long (sysconf(3) uses that) or ssize_t (to indicate a size) seem better types.  Which one do you prefer?

Also I noticed that sysconf(3) doesn't document _SC_GETPW_R_SIZE_MAX.
Comment 2 Fabian 2021-11-22 13:22:27 UTC
(In reply to Alejandro Colomar (man-pages) from comment #1)
> Yes, long (sysconf(3) uses that) or ssize_t (to indicate a size) seem better
> types.  Which one do you prefer?

IMO using "long" makes the most sense. It's already used as the return value of sysconf, while ssize_t has no direct relevance to the code.

> Also I noticed that sysconf(3) doesn't document _SC_GETPW_R_SIZE_MAX.

Oh, indeed!
Comment 3 Alejandro Colomar 2021-11-23 11:46:53 UTC
Makes sense.  Fixed.
I'll keep the bug open until I fix sysconf(3) too.

Thanks!
Alex

    getpwnam.3: EXAMPLES: Fix signedness
    
    sysconf(3) returns a long.  Since it can return -1 (and we're
    making use of that value), we can't use size_t for bufsize.
    Use long.
    
    Link: <https://bugzilla.kernel.org/show_bug.cgi?id=215097>
    Reported-by: Fabian <fabian@ritter-vogt.de>
    Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>

diff --git a/man3/getpwnam.3 b/man3/getpwnam.3
index 71457a916..8ca13f1a2 100644
--- a/man3/getpwnam.3
+++ b/man3/getpwnam.3
@@ -304,7 +304,7 @@ main(int argc, char *argv[])
     struct passwd pwd;
     struct passwd *result;
     char *buf;
-    size_t bufsize;
+    long bufsize;
     int s;
 
     if (argc != 2) {

Note You need to log in before you can comment on or make changes to this bug.