lkml.org 
[lkml]   [2023]   [Jul]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 08/14] sysctl: Add size to register_net_sysctl function
    Date
    This commit adds size to the register_net_sysctl indirection function to
    facilitate the removal of the sentinel elements (last empty markers)
    from the ctl_table arrays. Though we don't actually remove any sentinels
    in this commit, register_net_sysctl* now has the capability of
    forwarding table_size for when that happens.

    We create a new function register_net_sysctl_sz with an extra size
    argument. A macro replaces the existing register_net_sysctl. The size in
    the macro is SIZE_MAX instead of ARRAY_SIZE to avoid compilation errors
    while we systematically migrate to register_net_sysctl_sz. Will change
    to ARRAY_SIZE in subsequent commits.

    Care is taken to add table_size to the stopping criteria in such a way
    that when we remove the empty sentinel element, it will continue
    stopping in the last element of the ctl_table array.

    Signed-off-by: Joel Granados <j.granados@samsung.com>
    Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/net/net_namespace.h | 10 ++++++----
    net/sysctl_net.c | 22 +++++++++++++---------
    2 files changed, 19 insertions(+), 13 deletions(-)

    diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
    index 78beaa765c73..e4e5fe75a281 100644
    --- a/include/net/net_namespace.h
    +++ b/include/net/net_namespace.h
    @@ -469,15 +469,17 @@ void unregister_pernet_device(struct pernet_operations *);

    struct ctl_table;

    +#define register_net_sysctl(net, path, table) \
    + register_net_sysctl_sz(net, path, table, SIZE_MAX)
    #ifdef CONFIG_SYSCTL
    int net_sysctl_init(void);
    -struct ctl_table_header *register_net_sysctl(struct net *net, const char *path,
    - struct ctl_table *table);
    +struct ctl_table_header *register_net_sysctl_sz(struct net *net, const char *path,
    + struct ctl_table *table, size_t table_size);
    void unregister_net_sysctl_table(struct ctl_table_header *header);
    #else
    static inline int net_sysctl_init(void) { return 0; }
    -static inline struct ctl_table_header *register_net_sysctl(struct net *net,
    - const char *path, struct ctl_table *table)
    +static inline struct ctl_table_header *register_net_sysctl_sz(struct net *net,
    + const char *path, struct ctl_table *table, size_t table_size)
    {
    return NULL;
    }
    diff --git a/net/sysctl_net.c b/net/sysctl_net.c
    index d9cbbb51b143..051ed5f6fc93 100644
    --- a/net/sysctl_net.c
    +++ b/net/sysctl_net.c
    @@ -122,12 +122,13 @@ __init int net_sysctl_init(void)
    * allocated.
    */
    static void ensure_safe_net_sysctl(struct net *net, const char *path,
    - struct ctl_table *table)
    + struct ctl_table *table, size_t table_size)
    {
    struct ctl_table *ent;

    pr_debug("Registering net sysctl (net %p): %s\n", net, path);
    - for (ent = table; ent->procname; ent++) {
    + ent = table;
    + for (size_t i = 0; i < table_size && ent->procname; ent++, i++) {
    unsigned long addr;
    const char *where;

    @@ -160,21 +161,24 @@ static void ensure_safe_net_sysctl(struct net *net, const char *path,
    }
    }

    -struct ctl_table_header *register_net_sysctl(struct net *net,
    - const char *path, struct ctl_table *table)
    +struct ctl_table_header *register_net_sysctl_sz(struct net *net,
    + const char *path,
    + struct ctl_table *table,
    + size_t table_size)
    {
    - int count = 0;
    + int count;
    struct ctl_table *entry;

    if (!net_eq(net, &init_net))
    - ensure_safe_net_sysctl(net, path, table);
    + ensure_safe_net_sysctl(net, path, table, table_size);

    - for (entry = table; entry->procname; entry++)
    - count++;
    + entry = table;
    + for (count = 0 ; count < table_size && entry->procname; entry++, count++)
    + ;

    return __register_sysctl_table(&net->sysctls, path, table, count);
    }
    -EXPORT_SYMBOL_GPL(register_net_sysctl);
    +EXPORT_SYMBOL_GPL(register_net_sysctl_sz);

    void unregister_net_sysctl_table(struct ctl_table_header *header)
    {
    --
    2.30.2
    \
     
     \ /
      Last update: 2023-07-31 09:22    [W:3.113 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site