فهرست منبع

- Indication of underflow/overflow in integer attributes (SER-403)
- Unsolicited messages and openldap library v2.3 issue workaround added

Gergely Kovacs 17 سال پیش
والد
کامیت
0e2aef7646
2فایلهای تغییر یافته به همراه25 افزوده شده و 4 حذف شده
  1. 11 2
      modules_s/ldap/ld_cmd.c
  2. 14 2
      modules_s/ldap/ld_fld.c

+ 11 - 2
modules_s/ldap/ld_cmd.c

@@ -166,6 +166,7 @@ int ld_cmd_exec(db_res_t* res, db_cmd_t* cmd)
 	int msgid;
 	char *oid;
 	struct berval *data;
+	struct timeval restimeout;
 
 
 	filter = NULL;
@@ -195,10 +196,18 @@ int ld_cmd_exec(db_res_t* res, db_cmd_t* cmd)
 				ERR("ldap: Error while searching: %s\n", ldap_err2string(ret));
 				goto error;
 			}
+
+			/*
+			 openldap v2.3 library workaround for unsolicited messages:
+			 if only unsolicited messages are available then ldap_result of
+			 v2.3 library waits forever
+			*/
+			memset(&restimeout, 0, sizeof(restimeout));
+			restimeout.tv_sec = 5;
 			ret = ldap_result(lcon->con,
 							  LDAP_RES_ANY,
 							  LDAP_MSG_ALL,
-							  NULL,
+							  &restimeout,
 							  &resmsg);
 		} else {
 			/* force it to reconnect */
@@ -206,7 +215,7 @@ int ld_cmd_exec(db_res_t* res, db_cmd_t* cmd)
 		}
 
 		if (ret <= 0) {
-			ERR("ldap: Error in ldap_search: %s\n", ldap_err2string(ret));
+			ERR("ldap: Error in ldap_search: %s\n", ret < 0 ? ldap_err2string(ret) : "timeout");
 			if (ret == LDAP_SERVER_DOWN) {
 				lcon->flags &= ~LD_CONNECTED;
 				do {

+ 14 - 2
modules_s/ldap/ld_fld.c

@@ -539,8 +539,20 @@ static inline int db_uint2ldap_int(struct sbuf* buf, db_fld_t* fld)
 	v = fld->v.int4;
 	switch(fld->op) {
 	case DB_EQ:  rv |= sb_add(buf, "=", 1); break;
-	case DB_LT:  rv |= sb_add(buf, "<=", 2); v--; break;
-	case DB_GT:  rv |= sb_add(buf, ">=", 2); v++; break;
+	case DB_LT:
+		rv |= sb_add(buf, "<=", 2);
+		if (v == INT_MIN)
+			WARN("ldap: parameter with 'less than' comparison would overflow\n");
+		else
+			v--;
+		break;
+	case DB_GT:
+		rv |= sb_add(buf, ">=", 2);
+		if (v == INT_MAX)
+			WARN("ldap: parameter with 'greater than' comparison would overflow\n");
+		else
+			v++;
+		break;
 	case DB_LEQ: rv |= sb_add(buf, "<=", 2); break;
 	case DB_GEQ: rv |= sb_add(buf, ">=", 2); break;
 	default: