]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/string/strspn/, lib/, src/: stprspn(), strrspn_(): Split API into function and...
authorAlejandro Colomar <alx@kernel.org>
Sat, 16 Nov 2024 14:15:32 +0000 (15:15 +0100)
committerSerge Hallyn <serge@hallyn.com>
Sun, 16 Feb 2025 19:22:51 +0000 (13:22 -0600)
This provides a safer and more consistent API.

We had the strrspn(3) function as it was for compatibility with Oracle
Solaris, but let's not repeat their mistake.  Nevertheless, name our
function strrspn_() with a trailing underscore, to differentiate it from
the one in Solaris, since it's slightly different.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/Makefile.am
lib/fields.c
lib/getdef.c
lib/string/strspn/stprspn.c [new file with mode: 0644]
lib/string/strspn/stprspn.h [new file with mode: 0644]
lib/string/strspn/strrspn.c
lib/string/strspn/strrspn.h
src/login_nopam.c
src/suauth.c

index 4bf5982959140a8f04120287a4619159f5cfa75b..fc39e01791abae4ebd8bbd8cee8a83c13ba2dd31 100644 (file)
@@ -224,6 +224,8 @@ libshadow_la_SOURCES = \
        string/strspn/stpspn.h \
        string/strspn/stprcspn.c \
        string/strspn/stprcspn.h \
+       string/strspn/stprspn.c \
+       string/strspn/stprspn.h \
        string/strspn/strrcspn.c \
        string/strspn/strrcspn.h \
        string/strspn/strrspn.c \
index 37e9af5f4d7d3d09b3c1e6fc4e643a5697a5f6f7..9e08adadff3b02515d99946fbec217738dad7abe 100644 (file)
@@ -18,7 +18,7 @@
 #include "prototypes.h"
 #include "string/strcmp/streq.h"
 #include "string/strspn/stpspn.h"
-#include "string/strspn/strrspn.h"
+#include "string/strspn/stprspn.h"
 #include "string/strtok/stpsep.h"
 
 
@@ -93,7 +93,7 @@ change_field(char *buf, size_t maxsize, const char *prompt)
                 * makes it possible to change the field to empty, by
                 * entering a space.  --marekm
                 */
-               stpcpy(strrspn(newf, " \t"), "");
+               stpcpy(stprspn(newf, " \t"), "");
                cp = stpspn(newf, " \t");
                strcpy (buf, cp);
        }
index 5f470861177daab0e5f1c0c15139ef699b98ccf6..e354d8976064ba21d18570064e9e87f2d2cd8d2f 100644 (file)
@@ -33,7 +33,7 @@
 #include "string/strcmp/strcaseeq.h"
 #include "string/strcmp/streq.h"
 #include "string/strspn/stpspn.h"
-#include "string/strspn/strrspn.h"
+#include "string/strspn/stprspn.h"
 #include "string/strtok/stpsep.h"
 
 
@@ -562,7 +562,7 @@ static void def_load (void)
                /*
                 * Trim trailing whitespace.
                 */
-               stpcpy(strrspn(buf, " \t\n"), "");
+               stpcpy(stprspn(buf, " \t\n"), "");
 
                /*
                 * Break the line into two fields.
diff --git a/lib/string/strspn/stprspn.c b/lib/string/strspn/stprspn.c
new file mode 100644 (file)
index 0000000..c7450e1
--- /dev/null
@@ -0,0 +1,7 @@
+// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
+// SPDX-License-Identifier: BSD-3-Clause
+
+
+#include <config.h>
+
+#include "string/strspn/stprspn.h"
diff --git a/lib/string/strspn/stprspn.h b/lib/string/strspn/stprspn.h
new file mode 100644 (file)
index 0000000..0cdce63
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-FileCopyrightText: 2024, Alejandro Colomar <alx@kernel.org>
+// SPDX-License-Identifier: BSD-3-Clause
+
+
+#ifndef SHADOW_INCLUDE_LIB_STRING_STRSPN_STPRSPN_H_
+#define SHADOW_INCLUDE_LIB_STRING_STRSPN_STPRSPN_H_
+
+
+#include <config.h>
+
+#include <string.h>
+
+#include "string/strspn/strrspn.h"
+
+
+// Available in Oracle Solaris as strrspn(3GEN).
+// <https://docs.oracle.com/cd/E36784_01/html/E36877/strrspn-3gen.html>
+#define stprspn(s, accept)                                                    \
+({                                                                            \
+       __auto_type  s_ = (s);                                                \
+                                                                              \
+       s_ + strrspn_(s_, accept);                                            \
+})
+
+
+#endif  // include guard
index e7cfca002d58fd001a82059ccbb1a7e477d2164a..a8fbeff1c467efbfdfb3e3f3a44a0248d48cb951 100644 (file)
@@ -6,5 +6,7 @@
 
 #include "string/strspn/strrspn.h"
 
+#include <stddef.h>
 
-extern inline char *strrspn(char *restrict s, const char *restrict accept);
+
+extern inline size_t strrspn_(const char *s, const char *accept);
index b75818b02499c4dc38eb250711d18a8a4a1045d7..ea703ff44bf3734341f3c8df115c3fdf13e371ce 100644 (file)
@@ -8,20 +8,20 @@
 
 #include <config.h>
 
+#include <stddef.h>
 #include <string.h>
 
 #include "attr.h"
 #include "string/strchr/strnul.h"
 
 
+ATTR_STRING(1)
 ATTR_STRING(2)
-inline char *strrspn(char *restrict s, const char *restrict accept);
+inline size_t strrspn_(const char *s, const char *accept);
 
 
-// Available in Oracle Solaris: strrspn(3GEN).
-// <https://docs.oracle.com/cd/E36784_01/html/E36877/strrspn-3gen.html>
-inline char *
-strrspn(char *restrict s, const char *restrict accept)
+inline size_t
+strrspn_(const char *s, const char *accept)
 {
        char  *p;
 
@@ -29,9 +29,9 @@ strrspn(char *restrict s, const char *restrict accept)
        while (p > s) {
                p--;
                if (strchr(accept, *p) == NULL)
-                       return p + 1;
+                       return p + 1 - s;
        }
-       return s;
+       return 0;
 }
 
 
index bc77525d9f4616c8bb0108856302f7447fdbbae3..b4f637baf728148cfdc72cfd860e053e28a30a6c 100644 (file)
@@ -61,7 +61,7 @@
 #include "sizeof.h"
 #include "string/strcmp/strcaseeq.h"
 #include "string/strcmp/streq.h"
-#include "string/strspn/strrspn.h"
+#include "string/strspn/stprspn.h"
 #include "string/strtok/stpsep.h"
 
 
@@ -112,7 +112,7 @@ login_access(const char *user, const char *from)
                        if (line[0] == '#') {
                                continue;       /* comment line */
                        }
-                       stpcpy(strrspn(line, " \t"), "");
+                       stpcpy(stprspn(line, " \t"), "");
                        if (streq(line, "")) {  /* skip blank lines */
                                continue;
                        }
index 9b539ceb1beb6d95cd53ee78acb2e6905ff73475..cd2f87b657e9212d78986dd37f3a211dc45b4335 100644 (file)
@@ -21,7 +21,7 @@
 #include "prototypes.h"
 #include "string/strcmp/streq.h"
 #include "string/strspn/stpspn.h"
-#include "string/strspn/strrspn.h"
+#include "string/strspn/stprspn.h"
 #include "string/strtok/stpsep.h"
 
 
@@ -84,7 +84,7 @@ check_su_auth(const char *actual_id, const char *wanted_id, bool su_to_root)
                        continue;
                }
 
-               stpcpy(strrspn(temp, " \t"), "");
+               stpcpy(stprspn(temp, " \t"), "");
 
                p = stpspn(temp, " \t");
                if (*p == '#' || streq(p, ""))