[Bf-blender-cvs] [926b9ae80aa] blender2.8: UI: copy-buffer was cleared w/ non-text buttons

Campbell Barton noreply at git.blender.org
Thu Oct 11 01:06:13 CEST 2018


Commit: 926b9ae80aac11d4d451ce40b38b858dab7f4452
Author: Campbell Barton
Date:   Thu Oct 11 10:04:11 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB926b9ae80aac11d4d451ce40b38b858dab7f4452

UI: copy-buffer was cleared w/ non-text buttons

Also correct invalid strncpy use.

===================================================================

M	source/blender/editors/interface/interface_handlers.c

===================================================================

diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 1891687b28b..a3d6c4d8cf8 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -2076,22 +2076,22 @@ static void ui_but_set_float_array(bContext *C, uiBut *but, uiHandleButtonData *
 	button_activate_state(C, but, BUTTON_STATE_EXIT);
 }
 
-static void float_array_to_string(float *values, int array_length, char *output, int max_output_len)
+static void float_array_to_string(float *values, int array_length, char *output, int output_len_max)
 {
 	/* to avoid buffer overflow attacks; numbers are quite arbitrary */
-	BLI_assert(max_output_len > 15);
-	max_output_len -= 10;
+	BLI_assert(output_len_max > 15);
+	output_len_max -= 10;
 
 	int current_index = 0;
 	output[current_index] = '[';
 	current_index++;
 
 	for (int i = 0; i < array_length; i++) {
-		int length = BLI_snprintf(output + current_index, max_output_len - current_index, "%f", values[i]);
+		int length = BLI_snprintf(output + current_index, output_len_max - current_index, "%f", values[i]);
 		current_index += length;
 
 		if (i < array_length - 1) {
-			if (current_index < max_output_len) {
+			if (current_index < output_len_max) {
 				output[current_index + 0] = ',';
 				output[current_index + 1] = ' ';
 				current_index += 2;
@@ -2103,12 +2103,12 @@ static void float_array_to_string(float *values, int array_length, char *output,
 	output[current_index + 1] = '\0';
 }
 
-static void ui_but_copy_numeric_array(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_numeric_array(uiBut *but, char *output, int output_len_max)
 {
 	int array_length = get_but_property_array_length(but);
 	float *values = alloca(array_length * sizeof(float));
 	RNA_property_float_get_array(&but->rnapoin, but->rnaprop, values);
-	float_array_to_string(values, array_length, output, max_output_len);
+	float_array_to_string(values, array_length, output, output_len_max);
 }
 
 static bool parse_float_array(char *text, float *values, int expected_length)
@@ -2146,11 +2146,11 @@ static void ui_but_paste_numeric_array(bContext *C, uiBut *but, uiHandleButtonDa
 	}
 }
 
-static void ui_but_copy_numeric_value(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_numeric_value(uiBut *but, char *output, int output_len_max)
 {
 	/* Get many decimal places, then strip trailing zeros.
 	 * note: too high values start to give strange results */
-	ui_but_string_get_ex(but, output, max_output_len, UI_PRECISION_FLOAT_MAX, false, NULL);
+	ui_but_string_get_ex(but, output, output_len_max, UI_PRECISION_FLOAT_MAX, false, NULL);
 	BLI_str_rstrip_float_zero(output, '\0');
 }
 
@@ -2192,7 +2192,7 @@ static void ui_but_paste_normalized_vector(bContext *C, uiBut *but, char *buf_pa
 	}
 }
 
-static void ui_but_copy_color(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_color(uiBut *but, char *output, int output_len_max)
 {
 	float rgba[4];
 
@@ -2207,7 +2207,7 @@ static void ui_but_copy_color(uiBut *but, char *output, int max_output_len)
 	if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
 		srgb_to_linearrgb_v3_v3(rgba, rgba);
 
-	float_array_to_string(rgba, 4, output, max_output_len);
+	float_array_to_string(rgba, 4, output, output_len_max);
 }
 
 static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste)
@@ -2225,9 +2225,9 @@ static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste)
 	}
 }
 
-static void ui_but_copy_text(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_text(uiBut *but, char *output, int output_len_max)
 {
-	ui_but_string_get(but, output, max_output_len);
+	ui_but_string_get(but, output, output_len_max);
 }
 
 static void ui_but_paste_text(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
@@ -2284,22 +2284,22 @@ static void ui_but_paste_curvemapping(bContext *C, uiBut *but)
 	}
 }
 
-static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int output_len_max)
 {
 	PointerRNA *opptr;
 	opptr = UI_but_operator_ptr_get(but);
 
 	char *str;
 	str = WM_operator_pystring_ex(C, NULL, false, true, but->optype, opptr);
-	strncpy(output, str, max_output_len);
+	BLI_strncpy(output, str, output_len_max);
 	MEM_freeN(str);
 }
 
-static void ui_but_copy_menu(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_menu(uiBut *but, char *output, int output_len_max)
 {
 	MenuType *mt = UI_but_menutype_get(but);
 	if (mt) {
-		BLI_snprintf(output, max_output_len, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname);
+		BLI_snprintf(output, output_len_max, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname);
 	}
 }
 
@@ -2309,8 +2309,11 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
 		return;
 	}
 
-	static const int max_copy_length = UI_MAX_DRAW_STR;
-	char buffer_to_copy[UI_MAX_DRAW_STR] = { 0 };
+	char buf[UI_MAX_DRAW_STR] = {0};
+	const int buf_max_len = sizeof(buf);
+
+	/* Left false for copying internal data (color-band for eg). */
+	bool is_buf_set = false;
 
 	bool has_required_data = !(but->poin == NULL && but->rnapoin.data == NULL);
 
@@ -2319,27 +2322,31 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
 		case UI_BTYPE_NUM_SLIDER:
 			if (!has_required_data) break;
 			if (copy_array && ui_but_has_array_value(but)) {
-				ui_but_copy_numeric_array(but, buffer_to_copy, max_copy_length);
+				ui_but_copy_numeric_array(but, buf, buf_max_len);
 			}
 			else {
-				ui_but_copy_numeric_value(but, buffer_to_copy, max_copy_length);
+				ui_but_copy_numeric_value(but, buf, buf_max_len);
 			}
+			is_buf_set = true;
 			break;
 
 		case UI_BTYPE_UNITVEC:
 			if (!has_required_data) break;
-			ui_but_copy_numeric_array(but, buffer_to_copy, max_copy_length);
+			ui_but_copy_numeric_array(but, buf, buf_max_len);
+			is_buf_set = true;
 			break;
 
 		case UI_BTYPE_COLOR:
 			if (!has_required_data) break;
-			ui_but_copy_color(but, buffer_to_copy, max_copy_length);
+			ui_but_copy_color(but, buf, buf_max_len);
+			is_buf_set = true;
 			break;
 
 		case UI_BTYPE_TEXT:
 		case UI_BTYPE_SEARCH_MENU:
 			if (!has_required_data) break;
-			ui_but_copy_text(but, buffer_to_copy, max_copy_length);
+			ui_but_copy_text(but, buf, buf_max_len);
+			is_buf_set = true;
 			break;
 
 		case UI_BTYPE_COLORBAND:
@@ -2351,19 +2358,23 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
 			break;
 
 		case UI_BTYPE_BUT:
-			ui_but_copy_operator(C, but, buffer_to_copy, max_copy_length);
+			ui_but_copy_operator(C, but, buf, buf_max_len);
+			is_buf_set = true;
 			break;
 
 		case UI_BTYPE_MENU:
 		case UI_BTYPE_PULLDOWN:
-			ui_but_copy_menu(but, buffer_to_copy, max_copy_length);
+			ui_but_copy_menu(but, buf, buf_max_len);
+			is_buf_set = true;
 			break;
 
 		default:
 			break;
 	}
 
-	WM_clipboard_text_set(buffer_to_copy, 0);
+	if (is_buf_set) {
+		WM_clipboard_text_set(buf, 0);
+	}
 }
 
 static void ui_but_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const bool paste_array)



More information about the Bf-blender-cvs mailing list