]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib:ldb-samba: Improve calculate_popt_array_length()
authorAndreas Schneider <asn@samba.org>
Thu, 17 Dec 2020 18:16:13 +0000 (19:16 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 2 Nov 2021 21:52:16 +0000 (21:52 +0000)
Note that memcmp() doesn't work well with padding bytes. So avoid it!

(gdb) ptype/o struct poptOption
/* offset    |  size */  type = struct poptOption {
/*    0      |     8 */    const char *longName;
/*    8      |     1 */    char shortName;
/* XXX  3-byte hole  */
/*   12      |     4 */    unsigned int argInfo;
/*   16      |     8 */    void *arg;
/*   24      |     4 */    int val;
/* XXX  4-byte hole  */
/*   32      |     8 */    const char *descrip;
/*   40      |     8 */    const char *argDescrip;

                           /* total size (bytes):   48 */

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
(cherry picked from commit c2c7c1f50a8acb3169e19ba4329aa78839b66def)

lib/ldb-samba/samba_extensions.c
lib/ldb/tools/cmdline.c

index 65a4079ec97e1030baaaa2a9105c5dce398c3509..60aa1a332b5a015e965548c735bf342b5cb40fce 100644 (file)
 #include "popt.h"
 
 
+static bool is_popt_table_end(const struct poptOption *o)
+{
+       if (o->longName == NULL &&
+           o->shortName =='\0' &&
+           o->arg == NULL) {
+               return true;
+       }
+
+       return false;
+}
 
 /*
   work out the length of a popt array
  */
-static unsigned calculate_popt_array_length(struct poptOption *opts)
+static size_t calculate_popt_array_length(struct poptOption *opts)
 {
-       unsigned i;
-       struct poptOption zero_opt = { 0 };
-       for (i=0; memcmp(&zero_opt, &opts[i], sizeof(zero_opt)) != 0; i++) ;
+       size_t i = 0;
+
+       for (i = 0; i < UINT32_MAX; i++) {
+               struct poptOption *o = &(opts[i]);
+
+               if (is_popt_table_end(o)) {
+                       break;
+               }
+       }
+
        return i;
 }
 
@@ -61,7 +78,7 @@ static int extensions_hook(struct ldb_context *ldb, enum ldb_module_hook_type t)
 {
        switch (t) {
        case LDB_MODULE_HOOK_CMDLINE_OPTIONS: {
-               unsigned len1, len2;
+               size_t len1, len2;
                struct poptOption **popt_options = ldb_module_popt_options(ldb);
                struct poptOption *new_array;
 
index affce47ac84dfbc07f5a3c0a6e8d19d54ff6279a..ff25fe05ec7cd5ef59a8138fc7de11908f4d4fb5 100644 (file)
@@ -259,7 +259,7 @@ static struct poptOption builtin_popt_options[] = {
                .descrip    = "show extended DNs",
                .argDescrip = NULL
        },
-       {0}
+       POPT_TABLEEND
 };
 
 void ldb_cmdline_help(struct ldb_context *ldb, const char *cmdname, FILE *f)