浏览代码

Coverity fixes

13107,13108: Explicit null deferenced

Bug description: "Explicit null dereferenced" error was introduced
by commit 7f81635990fa340e2db5c1b14a8d1ba10fa53887
Trac Ticket #391 - Slapd crashes when deleting backends
while operations are still in progress

Fix description: Added codes to check if the inst variable is NULL
or not.  If NULL, skip accessing the instance variable and return
an error.
Noriko Hosoi 13 年之前
父节点
当前提交
e229bb45b4

+ 39 - 35
ldap/servers/slapd/back-ldbm/ldbm_add.c

@@ -78,7 +78,7 @@ ldbm_back_add( Slapi_PBlock *pb )
 {
 	backend *be;
 	struct ldbminfo *li;
-	ldbm_instance *inst;
+	ldbm_instance *inst = NULL;
 	const char *dn = NULL;
 	Slapi_Entry	*e = NULL;
 	struct backentry *tombstoneentry = NULL;
@@ -102,7 +102,7 @@ ldbm_back_add( Slapi_PBlock *pb )
 	modify_context ruv_c = {0};
 	int parent_found = 0;
 	int ruv_c_init = 0;
-	int rc;
+	int rc = 0;
 	int addingentry_id_assigned= 0;
 	int addingentry_in_cache= 0;
 	int tombstone_in_cache= 0;
@@ -132,12 +132,12 @@ ldbm_back_add( Slapi_PBlock *pb )
 	is_ruv = operation_is_flag_set(operation, OP_FLAG_REPL_RUV);
 
 	inst = (ldbm_instance *) be->be_instance_info;
-	if (inst->inst_ref_count) {
+	if (inst && inst->inst_ref_count) {
 		slapi_counter_increment(inst->inst_ref_count);
 	} else {
 		LDAPDebug1Arg(LDAP_DEBUG_ANY,
-		              "ldbm_add: instance %s does not exist.\n",
-		              inst->inst_name);
+		              "ldbm_add: instance \"%s\" does not exist.\n",
+		              inst ? inst->inst_name : "null instance");
 		goto error_return;
 	}
 
@@ -1060,13 +1060,15 @@ error_return:
 	{
 		if ( addingentry_in_cache )
 		{
-			CACHE_REMOVE(&inst->inst_cache, addingentry);
+			if (inst) {
+				CACHE_REMOVE(&inst->inst_cache, addingentry);
+			}
 			addingentry_in_cache = 0;
 		}
 		backentry_clear_entry(addingentry); /* e is released in the frontend */
 		backentry_free( &addingentry ); /* release the backend wrapper, here */
 	}
-	if(tombstone_in_cache)
+	if(tombstone_in_cache && inst)
 	{
 		CACHE_RETURN(&inst->inst_cache, &tombstoneentry);
 	}
@@ -1075,8 +1077,9 @@ error_return:
 		dblayer_remember_disk_filled(li);
 		ldbm_nasty("Add",80,rc);
 		disk_full = 1;
+	} else if (0 == rc) {
+		rc = SLAPI_FAIL_GENERAL;
 	}
-
 diskfull_return:
 	if (disk_full) {
 		rc= return_on_disk_full(li);
@@ -1121,33 +1124,34 @@ diskfull_return:
 	}
 	
 common_return:
-    if (addingentry_in_cache && addingentry)
-	{
-        if (entryrdn_get_switch()) { /* subtree-rename: on */
-            /* since adding the entry to the entry cache was successful,
-             * let's add the dn to dncache, if not yet done. */
-            struct backdn *bdn = dncache_find_id(&inst->inst_dncache,
-                                                 addingentry->ep_id);
-            if (bdn) { /* already in the dncache */
-                CACHE_RETURN(&inst->inst_dncache, &bdn);
-            } else { /* not in the dncache yet */
-                Slapi_DN *addingsdn = 
-                      slapi_sdn_dup(slapi_entry_get_sdn(addingentry->ep_entry));
-                if (addingsdn) {
-                    bdn = backdn_init(addingsdn, addingentry->ep_id, 0);
-                    if (bdn) {
-                        CACHE_ADD( &inst->inst_dncache, bdn, NULL );
-                        CACHE_RETURN(&inst->inst_dncache, &bdn);
-                        slapi_log_error(SLAPI_LOG_CACHE, "ldbm_back_add",
-                                                    "set %s to dn cache\n", dn);
-                    }
-                }
-            }
-        }
-        CACHE_RETURN( &inst->inst_cache, &addingentry );
-    }
-	if (inst->inst_ref_count) {
-		slapi_counter_decrement(inst->inst_ref_count);
+	if (inst) {
+		if (addingentry_in_cache && addingentry) {
+			if (entryrdn_get_switch()) { /* subtree-rename: on */
+				/* since adding the entry to the entry cache was successful,
+				 * let's add the dn to dncache, if not yet done. */
+				struct backdn *bdn = dncache_find_id(&inst->inst_dncache,
+				                                     addingentry->ep_id);
+				if (bdn) { /* already in the dncache */
+					CACHE_RETURN(&inst->inst_dncache, &bdn);
+				} else { /* not in the dncache yet */
+					Slapi_DN *addingsdn = 
+					  slapi_sdn_dup(slapi_entry_get_sdn(addingentry->ep_entry));
+					if (addingsdn) {
+						bdn = backdn_init(addingsdn, addingentry->ep_id, 0);
+						if (bdn) {
+							CACHE_ADD( &inst->inst_dncache, bdn, NULL );
+							CACHE_RETURN(&inst->inst_dncache, &bdn);
+							slapi_log_error(SLAPI_LOG_CACHE, "ldbm_back_add",
+							                "set %s to dn cache\n", dn);
+						}
+					}
+				}
+			}
+			CACHE_RETURN( &inst->inst_cache, &addingentry );
+		}
+		if (inst->inst_ref_count) {
+			slapi_counter_decrement(inst->inst_ref_count);
+		}
 	}
 	/* bepost op needs to know this result */
 	slapi_pblock_set(pb, SLAPI_RESULT_CODE, &ldap_result_code);

+ 3 - 3
ldap/servers/slapd/back-ldbm/ldbm_compare.c

@@ -74,12 +74,12 @@ ldbm_back_compare( Slapi_PBlock *pb )
 	}
 
 	inst = (ldbm_instance *) be->be_instance_info;
-	if (inst->inst_ref_count) {
+	if (inst && inst->inst_ref_count) {
 		slapi_counter_increment(inst->inst_ref_count);
 	} else {
 		LDAPDebug1Arg(LDAP_DEBUG_ANY,
-		              "ldbm_compare: instance %s does not exist.\n",
-		              inst->inst_name);
+		              "ldbm_compare: instance \"%s\" does not exist.\n",
+		              inst ? inst->inst_name : "null instance");
 		return -1;
 	}
 	/* get the namespace dn */

+ 10 - 10
ldap/servers/slapd/back-ldbm/ldbm_delete.c

@@ -146,12 +146,12 @@ ldbm_back_delete( Slapi_PBlock *pb )
 	delete_tombstone_entry = operation_is_flag_set(operation, OP_FLAG_TOMBSTONE_ENTRY);
 	
 	inst = (ldbm_instance *) be->be_instance_info;
-	if (inst->inst_ref_count) {
+	if (inst && inst->inst_ref_count) {
 		slapi_counter_increment(inst->inst_ref_count);
 	} else {
 		LDAPDebug1Arg(LDAP_DEBUG_ANY,
-		              "ldbm_delete: instance %s does not exist.\n",
-		              inst->inst_name);
+		              "ldbm_delete: instance \"%s\" does not exist.\n",
+		              inst ? inst->inst_name : "null instance");
 		goto error_return;
 	}
 
@@ -1116,7 +1116,7 @@ ldbm_back_delete( Slapi_PBlock *pb )
 	goto common_return;
 
 error_return:
-	if (tombstone_in_cache)
+	if (inst && tombstone_in_cache)
 	{
 		CACHE_REMOVE( &inst->inst_cache, tombstone );
 		CACHE_RETURN( &inst->inst_cache, &tombstone );
@@ -1186,7 +1186,7 @@ common_return:
 		   for the post op plugins */
 		slapi_pblock_set( pb, SLAPI_DELETE_BEPREOP_ENTRY, orig_entry );
 	}
-	if (tombstone_in_cache)
+	if (inst && tombstone_in_cache)
 	{
 		CACHE_RETURN( &inst->inst_cache, &tombstone );
 		tombstone = NULL;
@@ -1208,14 +1208,14 @@ common_return:
 	}
 
 	/* Need to return to cache after post op plugins are called */
-	if (retval) { /* error case */
-		if (e) {
+	if (inst) {
+		if (retval && e) { /* error case */
 			cache_unlock_entry( &inst->inst_cache, e );
 			CACHE_RETURN( &inst->inst_cache, &e );
 		}
-	}
-	if (inst->inst_ref_count) {
-		slapi_counter_decrement(inst->inst_ref_count);
+		if (inst->inst_ref_count) {
+			slapi_counter_decrement(inst->inst_ref_count);
+		}
 	}
 	
 	if (ruv_c_init) {

+ 13 - 11
ldap/servers/slapd/back-ldbm/ldbm_modify.c

@@ -368,12 +368,12 @@ ldbm_back_modify( Slapi_PBlock *pb )
 	{
 		goto error_return;
 	}
-	if (inst->inst_ref_count) {
+	if (inst && inst->inst_ref_count) {
 		slapi_counter_increment(inst->inst_ref_count);
 	} else {
 		LDAPDebug1Arg(LDAP_DEBUG_ANY,
-		              "ldbm_modify: instance %s does not exist.\n",
-		              inst->inst_name);
+		              "ldbm_modify: instance \"%s\" does not exist.\n",
+		              inst ? inst->inst_name : "null instance");
 		goto error_return;
 	}
 
@@ -795,7 +795,7 @@ error_return:
 	}
 
 	/* if ec is in cache, remove it, then add back e if we still have it */
-	if (ec_in_cache) {
+	if (inst && ec_in_cache) {
 		CACHE_REMOVE( &inst->inst_cache, ec );
 		/* if ec was in cache, e was not - add back e */
 		if (e) {
@@ -807,7 +807,7 @@ error_return:
 common_return:
 	slapi_mods_done(&smods);
 	
-	if (ec_in_cache)
+	if (inst && ec_in_cache)
 	{
 		cache_unlock_entry( &inst->inst_cache, ec);
 		CACHE_RETURN( &inst->inst_cache, &ec );
@@ -817,12 +817,14 @@ common_return:
 		backentry_free(&ec);
 	}
 	
-	if (e!=NULL) {
-		cache_unlock_entry( &inst->inst_cache, e);
-		CACHE_RETURN( &inst->inst_cache, &e);
-	}
-	if (inst->inst_ref_count) {
-		slapi_counter_decrement(inst->inst_ref_count);
+	if (inst) {
+		if (e) {
+			cache_unlock_entry( &inst->inst_cache, e);
+			CACHE_RETURN( &inst->inst_cache, &e);
+		}
+		if (inst->inst_ref_count) {
+			slapi_counter_decrement(inst->inst_ref_count);
+		}
 	}
 
 	/* result code could be used in the bepost plugin functions. */

+ 13 - 13
ldap/servers/slapd/back-ldbm/ldbm_modrdn.c

@@ -63,7 +63,7 @@ int
 ldbm_back_modrdn( Slapi_PBlock *pb )
 {
     backend *be;
-    ldbm_instance *inst;
+    ldbm_instance *inst = NULL;
     struct ldbminfo  *li;
     struct backentry *e= NULL;
     struct backentry *ec= NULL;
@@ -191,12 +191,12 @@ ldbm_back_modrdn( Slapi_PBlock *pb )
         return( -1 );
     } 
 
-    if (inst->inst_ref_count) {
+    if (inst && inst->inst_ref_count) {
         slapi_counter_increment(inst->inst_ref_count);
     } else {
         LDAPDebug1Arg(LDAP_DEBUG_ANY,
-                      "ldbm_modrdn: instance %s does not exist.\n",
-                      inst->inst_name);
+                      "ldbm_modrdn: instance \"%s\" does not exist.\n",
+                      inst ? inst->inst_name : "null instance");
         return( -1 );
     }
 
@@ -1177,7 +1177,7 @@ error_return:
         /* make sure caller doesn't attempt to free this */
         slapi_pblock_set( pb, SLAPI_ENTRY_POST_OP, postentry );
     }
-    if (e && entryrdn_get_switch())
+    if (e && entryrdn_get_switch() && inst)
     {
         struct backdn *bdn = dncache_find_id(&inst->inst_dncache, e->ep_id);
         CACHE_REMOVE(&inst->inst_dncache, bdn);
@@ -1186,7 +1186,7 @@ error_return:
     if(children)
     {
         int i = 0;
-        if (child_entries && *child_entries)
+        if (child_entries && *child_entries && inst)
         {
             if (entryrdn_get_switch()) /* subtree-rename: on */
             {
@@ -1208,7 +1208,7 @@ error_return:
                 }
             }
         }
-        if (entryrdn_get_switch() && child_dns && *child_dns)
+        if (entryrdn_get_switch() && child_dns && *child_dns && inst)
         {
             for (i = 0; child_dns[i] != NULL; i++) {
                 CACHE_REMOVE( &inst->inst_dncache, child_dns[i] );
@@ -1282,10 +1282,10 @@ common_return:
     if (ec) {
         /* remove the new entry from the cache if the op failed -
            otherwise, leave it in */
-        if (ec_in_cache && retval) {
-            CACHE_REMOVE( &inst->inst_cache, ec );
-        }
-        if (ec_in_cache) {
+        if (ec_in_cache && inst) {
+            if (retval) {
+                CACHE_REMOVE( &inst->inst_cache, ec );
+            }
             CACHE_RETURN( &inst->inst_cache, &ec );
         } else {
             backentry_free( &ec );
@@ -1296,12 +1296,12 @@ common_return:
 
     /* put e back in the cache if the modrdn failed */
     if (e) {
-        if (!e_in_cache && retval) {
+        if (!e_in_cache && retval && inst) {
             CACHE_ADD(&inst->inst_cache, e, NULL);
             e_in_cache = 1;
         }
     }
-    if (inst->inst_ref_count) {
+    if (inst && inst->inst_ref_count) {
         slapi_counter_decrement(inst->inst_ref_count);
     }
 

+ 4 - 5
ldap/servers/slapd/back-ldbm/ldbm_search.c

@@ -363,19 +363,18 @@ ldbm_back_search( Slapi_PBlock *pb )
         slapi_pblock_set( pb, SLAPI_TXN, txn.back_txn_txn );
     }
 
-    inst = (ldbm_instance *) be->be_instance_info;
-
     if (NULL == basesdn) {
         slapi_send_ldap_result( pb, LDAP_INVALID_DN_SYNTAX, NULL,
                                "Null target DN", 0, NULL );
         return( -1 );
     }
-    if (inst->inst_ref_count) {
+    inst = (ldbm_instance *) be->be_instance_info;
+    if (inst && inst->inst_ref_count) {
         slapi_counter_increment(inst->inst_ref_count);
     } else {
         LDAPDebug1Arg(LDAP_DEBUG_ANY,
-                      "ldbm_search: instance %s does not exist.\n",
-                      inst->inst_name);
+                      "ldbm_search: instance \"%s\" does not exist.\n",
+                      inst ? inst->inst_name : "null instance");
         return( -1 );
     }
     base = slapi_sdn_get_dn(basesdn);