|  | @@ -1871,22 +1871,34 @@ static cJSON_bool add_item_to_array(cJSON *array, cJSON *item)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      child = array->child;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +     * To find the last item int array quickly, we use prev in array
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |      if (child == NULL)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          /* list is empty, start new one */
 | 
	
		
			
				|  |  |          array->child = item;
 | 
	
		
			
				|  |  | +        item->prev = item;
 | 
	
		
			
				|  |  | +        item->next = NULL;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          /* append to the end */
 | 
	
		
			
				|  |  | -        while (child->next)
 | 
	
		
			
				|  |  | +        if (child->prev)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            child = child->next;
 | 
	
		
			
				|  |  | +            suffix_object(child->prev, item);
 | 
	
		
			
				|  |  | +            array->child->prev = item;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            while (child->next)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                child = child->next;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            suffix_object(child, item);
 | 
	
		
			
				|  |  | +            array->child->prev = item;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        suffix_object(child, item);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2206,14 +2218,21 @@ CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          replacement->next->prev = replacement;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (replacement->prev != NULL)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        replacement->prev->next = replacement;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      if (parent->child == item)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          parent->child = replacement;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    else
 | 
	
		
			
				|  |  | +    {   /*
 | 
	
		
			
				|  |  | +         * To find the last item int array quickly, we use prev in array.
 | 
	
		
			
				|  |  | +         * We can't modify the last item's next pointer where this item was the parent's child
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        if (replacement->prev != NULL)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            replacement->prev->next = replacement;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      item->next = NULL;
 | 
	
		
			
				|  |  |      item->prev = NULL;
 |