From 3c2165deb45571a0ff0547e5c8c2c970095cca04 Mon Sep 17 00:00:00 2001 From: Noriko Hosoi Date: Wed, 8 Jul 2015 10:19:15 -0700 Subject: [PATCH 11/20] Ticket #47799 - Any negative LDAP error code number reported as Illegal error by ldclt. Description: ldclt was implemented with mozldap, which did not expect negative erorr codes, but openldap does. E.g., LDAP_FILTER_ERROR (-7) This patch prepares a negativeError array for the negative error codes. Example: $ ldclt [...] -e esearch -e random -b "" -f "" -v Filter = "" ... ldclt[16030]: T000: Cannot ldap_search(), error=-7 (Bad search filter) -- NULL result ... ldclt[16030]: Global error -7 (Bad search filter) occurs 1001 times ldclt[16030]: Exit status 3 - Max errors reached. https://fedorahosted.org/389/ticket/47799 Reviewed by mreynolds@redhat.com (Thank you, Mark!!) (cherry picked from commit 71be5faaa478593bb056887410ca8e48e05b2fe4) (cherry picked from commit 0680a45773ab4b0e92ec26caa3acbb6bab379103) --- ldap/servers/slapd/tools/ldclt/ldapfct.c | 4 +++ ldap/servers/slapd/tools/ldclt/ldclt.c | 35 ++++++++++++++++----- ldap/servers/slapd/tools/ldclt/ldclt.h | 11 ++++++- ldap/servers/slapd/tools/ldclt/threadMain.c | 48 +++++++++++++++++++---------- 4 files changed, 73 insertions(+), 25 deletions(-) diff --git a/ldap/servers/slapd/tools/ldclt/ldapfct.c b/ldap/servers/slapd/tools/ldclt/ldapfct.c index f906c5a..13e66b8 100644 --- a/ldap/servers/slapd/tools/ldclt/ldapfct.c +++ b/ldap/servers/slapd/tools/ldclt/ldapfct.c @@ -1382,6 +1382,10 @@ printErrorFromLdap ( printf ("ldclt[%d]: T%03d: %s, error=%d (%s", mctx.pid, tttctx->thrdNum, errmsg, errcode, my_ldap_err2string (errcode)); + if (!res) { + printf (") -- NULL result\n"); + return -1; + } /* * See if there is an additional error message... diff --git a/ldap/servers/slapd/tools/ldclt/ldclt.c b/ldap/servers/slapd/tools/ldclt/ldclt.c index edb687f..9e573a5 100644 --- a/ldap/servers/slapd/tools/ldclt/ldclt.c +++ b/ldap/servers/slapd/tools/ldclt/ldclt.c @@ -716,19 +716,35 @@ printGlobalStatistics (void) * Note: Maybe implement a way to stop the running threads ? */ found = 0; - for (i=0 ; i 0) - { + for (i = 0; i < MAX_ERROR_NB; i++) { + if (mctx.errors[i] > 0) { found = 1; sprintf (buf, "(%s)", my_ldap_err2string (i)); printf ("ldclt[%d]: Global error %2d %s occurs %5d times\n", mctx.pid, i, buf, mctx.errors[i]); } + } +#if defined(USE_OPENLDAP) + for (i = 0; i < ABS(NEGATIVE_MAX_ERROR_NB); i++) { + if (mctx.negativeErrors[i] > 0) { + found = 1; + sprintf (buf, "(%s)", my_ldap_err2string (-i)); + printf ("ldclt[%d]: Global error %2d %s occurs %5d times\n", + mctx.pid, -i, buf, mctx.negativeErrors[i]); + } + } +#endif if (mctx.errorsBad > 0) { found = 1; - printf ("ldclt[%d]: Global illegal errors (codes not in [0, %d]) occurs %5d times\n", - mctx.pid, MAX_ERROR_NB-1, mctx.errorsBad); + printf("ldclt[%d]: Global illegal errors (codes not in [%d, %d]) occurs %5d times\n", + mctx.pid, +#if defined(USE_OPENLDAP) + NEGATIVE_MAX_ERROR_NB, +#else + 0, +#endif + MAX_ERROR_NB-1, mctx.errorsBad); } if (!found) printf ("ldclt[%d]: Global no error occurs during this session.\n", mctx.pid); @@ -1293,9 +1309,14 @@ basicInit (void) mctx.totNbOpers = 0; mctx.totNbSamples = 0; mctx.errorsBad = 0; - for (i=0 ; i 0) ? (x) : (-x)) +#endif /* * Misc constant definitions */ @@ -183,7 +186,10 @@ dd/mm/yy | Author | Comments #define DEF_PORT_CHECK 16000 /* Port used for check processing */ #define MAX_ATTRIBS 40 /* Max number of attributes */ /*JLS 28-03-01*/ #define MAX_DN_LENGTH 1024 /* Max length for a DN */ -#define MAX_ERROR_NB 0x62 /* Max ldap err number + 1 */ +#define MAX_ERROR_NB 0x7b /* Max ldap err number + 1 */ +#if defined(USE_OPENLDAP) +#define NEGATIVE_MAX_ERROR_NB (LDAP_X_CONNECTING - 1) /* Mininum ldap err number */ +#endif #define MAX_IGN_ERRORS 20 /* Max errors ignored */ #define MAX_FILTER 512 /* Max filters length */ #define MAX_THREADS 1000 /* Max number of threads */ /*JLS 21-11-00*/ @@ -504,6 +510,9 @@ typedef struct main_context { char *certfile; /* certificate file */ /* BK 11-10-00 */ char *cltcertname; /* client cert name */ /* BK 23 11-00 */ data_list_file *dlf; /* Data list files */ /*JLS 23-03-01*/ +#if defined(USE_OPENLDAP) + int negativeErrors[ABS(NEGATIVE_MAX_ERROR_NB)]; /* Err stats */ +#endif int errors[MAX_ERROR_NB]; /* Err stats */ int errorsBad; /* Bad errors */ ldclt_mutex_t errors_mutex; /* Protect errors */ /*JLS 28-11-00*/ diff --git a/ldap/servers/slapd/tools/ldclt/threadMain.c b/ldap/servers/slapd/tools/ldclt/threadMain.c index be41186..5d915fd 100644 --- a/ldap/servers/slapd/tools/ldclt/threadMain.c +++ b/ldap/servers/slapd/tools/ldclt/threadMain.c @@ -430,14 +430,26 @@ addErrorStat ( /* * Update the counters */ +#if defined(USE_OPENLDAP) + if ((err <= NEGATIVE_MAX_ERROR_NB) || (err >= MAX_ERROR_NB)) +#else if ((err <= 0) || (err >= MAX_ERROR_NB)) +#endif { fprintf (stderr, "ldclt[%d]: Illegal error number %d\n", mctx.pid, err); fflush (stderr); mctx.errorsBad++; } +#if defined(USE_OPENLDAP) + else if (err < 0) + { + mctx.negativeErrors[abs(err)]++; + } +#endif else + { mctx.errors[err]++; + } /* * Release the mutex @@ -460,26 +472,28 @@ addErrorStat ( * Ok, we should not ignore this error... * Maybe the limit is reached ? */ +#if defined(USE_OPENLDAP) + if ((err <= NEGATIVE_MAX_ERROR_NB) || (err >= MAX_ERROR_NB)) +#else if ((err <= 0) || (err >= MAX_ERROR_NB)) - { - if (mctx.errorsBad > mctx.maxErrors) - { - printf ("ldclt[%d]: Max error limit reached - exiting.\n", mctx.pid); - (void) printGlobalStatistics(); /*JLS 25-08-00*/ - fflush (stdout); - ldclt_sleep (5); - ldcltExit (EXIT_MAX_ERRORS); /*JLS 25-08-00*/ +#endif + { + if (mctx.errorsBad > mctx.maxErrors) { + printf ("ldclt[%d]: Max error limit reached - exiting.\n", mctx.pid); + (void) printGlobalStatistics(); /*JLS 25-08-00*/ + fflush (stdout); + ldclt_sleep (5); + ldcltExit (EXIT_MAX_ERRORS); /*JLS 25-08-00*/ } - } - else - if (mctx.errors[err] > mctx.maxErrors) - { - printf ("ldclt[%d]: Max error limit reached - exiting.\n", mctx.pid); - (void) printGlobalStatistics(); /*JLS 25-08-00*/ - fflush (stdout); - ldclt_sleep (5); - ldcltExit (EXIT_MAX_ERRORS); /*JLS 25-08-00*/ + } else { + if (mctx.errors[err] + mctx.negativeErrors[abs(err)] > mctx.maxErrors) { + printf ("ldclt[%d]: Max error limit reached - exiting.\n", mctx.pid); + (void) printGlobalStatistics(); /*JLS 25-08-00*/ + fflush (stdout); + ldclt_sleep (5); + ldcltExit (EXIT_MAX_ERRORS); /*JLS 25-08-00*/ } + } } /* -- 1.9.3