[Bf-blender-cvs] [43d5e54] master: Fix for paste clamping the string length to UI_MAX_DRAW_STR

Campbell Barton noreply at git.blender.org
Fri May 2 22:07:33 CEST 2014


Commit: 43d5e54a799b6823bca31bde17606c591b81d8be
Author: Campbell Barton
Date:   Sat May 3 06:06:19 2014 +1000
https://developer.blender.org/rB43d5e54a799b6823bca31bde17606c591b81d8be

Fix for paste clamping the string length to UI_MAX_DRAW_STR

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

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 3e4a6c3..642ac0c 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1675,7 +1675,9 @@ static void ui_but_drop(bContext *C, const wmEvent *event, uiBut *but, uiHandleB
 /* c = copy, v = paste */
 static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, char mode)
 {
-	char buf[UI_MAX_DRAW_STR + 1] = {0};
+	int buf_paste_len = 0;
+	const char *buf_paste = "";
+	bool buf_paste_alloc = false;
 
 	if (mode == 'v' && but->lock  == true) {
 		return;
@@ -1690,14 +1692,18 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 
 	if (mode == 'v') {
 		/* extract first line from clipboard in case of multi-line copies */
-		int pbuf_len;
-		char *pbuf = WM_clipboard_text_get_firstline(false, &pbuf_len);
-		if (pbuf) {
-			BLI_strncpy(buf, pbuf, sizeof(buf));
-			MEM_freeN(pbuf);
+		const char *buf_paste_test;
+
+		buf_paste_test = WM_clipboard_text_get_firstline(false, &buf_paste_len);
+		if (buf_paste_test) {
+			buf_paste = buf_paste_test;
+			buf_paste_alloc = true;
 		}
 	}
-	
+
+	/* No return from here down */
+
+
 	/* numeric value */
 	if (ELEM(but->type, NUM, NUMSLI)) {
 		
@@ -1707,18 +1713,19 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 		else if (mode == 'c') {
 			/* Get many decimal places, then strip trailing zeros.
 			 * note: too high values start to give strange results (6 or so is ok) */
-			ui_get_but_string_ex(but, buf, sizeof(buf), 6);
-			BLI_str_rstrip_float_zero(buf, '\0');
+			char buf_copy[UI_MAX_DRAW_STR];
+			ui_get_but_string_ex(but, buf_copy, sizeof(buf_copy), 6);
+			BLI_str_rstrip_float_zero(buf_copy, '\0');
 
-			WM_clipboard_text_set(buf, 0);
+			WM_clipboard_text_set(buf_copy, 0);
 		}
 		else {
 			double val;
 
-			if (ui_set_but_string_eval_num(C, but, buf, &val)) {
+			if (ui_set_but_string_eval_num(C, but, buf_paste, &val)) {
 				button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
 				data->value = val;
-				ui_set_but_string(C, but, buf);
+				ui_set_but_string(C, but, buf_paste);
 				button_activate_state(C, but, BUTTON_STATE_EXIT);
 			}
 		}
@@ -1732,12 +1739,13 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 			/* pass */
 		}
 		else if (mode == 'c') {
+			char buf_copy[UI_MAX_DRAW_STR];
 			ui_get_but_vectorf(but, xyz);
-			BLI_snprintf(buf, sizeof(buf), "[%f, %f, %f]", xyz[0], xyz[1], xyz[2]);
-			WM_clipboard_text_set(buf, 0);
+			BLI_snprintf(buf_copy, sizeof(buf_copy), "[%f, %f, %f]", xyz[0], xyz[1], xyz[2]);
+			WM_clipboard_text_set(buf_copy, 0);
 		}
 		else {
-			if (sscanf(buf, "[%f, %f, %f]", &xyz[0], &xyz[1], &xyz[2]) == 3) {
+			if (sscanf(buf_paste, "[%f, %f, %f]", &xyz[0], &xyz[1], &xyz[2]) == 3) {
 				if (normalize_v3(xyz) == 0.0f) {
 					/* better set Z up then have a zero vector */
 					xyz[2] = 1.0;
@@ -1758,6 +1766,8 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 			/* pass */
 		}
 		else if (mode == 'c') {
+			char buf_copy[UI_MAX_DRAW_STR];
+
 			if (but->rnaprop && RNA_property_array_length(&but->rnapoin, but->rnaprop) == 4)
 				rgba[3] = RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3);
 			else
@@ -1768,12 +1778,12 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 			if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
 				srgb_to_linearrgb_v3_v3(rgba, rgba);
 
-			BLI_snprintf(buf, sizeof(buf), "[%f, %f, %f, %f]", rgba[0], rgba[1], rgba[2], rgba[3]);
-			WM_clipboard_text_set(buf, 0);
+			BLI_snprintf(buf_copy, sizeof(buf_copy), "[%f, %f, %f, %f]", rgba[0], rgba[1], rgba[2], rgba[3]);
+			WM_clipboard_text_set(buf_copy, 0);
 			
 		}
 		else {
-			if (sscanf(buf, "[%f, %f, %f, %f]", &rgba[0], &rgba[1], &rgba[2], &rgba[3]) == 4) {
+			if (sscanf(buf_paste, "[%f, %f, %f, %f]", &rgba[0], &rgba[1], &rgba[2], &rgba[3]) == 4) {
 				/* assume linear colors in buffer */
 				if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
 					linearrgb_to_srgb_v3_v3(rgba, rgba);
@@ -1797,7 +1807,6 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 		}
 		else if (mode == 'c') {
 			button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
-			BLI_strncpy(buf, active_data->str, UI_MAX_DRAW_STR);
 			WM_clipboard_text_set(active_data->str, 0);
 			active_data->cancel = true;
 			button_activate_state(C, but, BUTTON_STATE_EXIT);
@@ -1805,8 +1814,10 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 		else {
 			button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
 
-			if (ui_is_but_utf8(but)) BLI_strncpy_utf8(active_data->str, buf, active_data->maxlen);
-			else BLI_strncpy(active_data->str, buf, active_data->maxlen);
+			if (ui_is_but_utf8(but))
+				BLI_strncpy_utf8(active_data->str, buf_paste, active_data->maxlen);
+			else
+				BLI_strncpy(active_data->str, buf_paste, active_data->maxlen);
 
 			if (ELEM(but->type, SEARCH_MENU, SEARCH_MENU_UNLINK)) {
 				/* else uiSearchboxData.active member is not updated [#26856] */
@@ -1819,43 +1830,39 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 	/* colorband (not supported by system clipboard) */
 	else if (but->type == BUT_COLORBAND) {
 		if (mode == 'c') {
-			if (but->poin == NULL)
-				return;
-
-			memcpy(&but_copypaste_coba, but->poin, sizeof(ColorBand));
+			if (but->poin != NULL) {
+				memcpy(&but_copypaste_coba, but->poin, sizeof(ColorBand));
+			}
 		}
 		else {
-			if (but_copypaste_coba.tot == 0)
-				return;
-
-			if (!but->poin)
-				but->poin = MEM_callocN(sizeof(ColorBand), "colorband");
+			if (but_copypaste_coba.tot != 0) {
+				if (!but->poin)
+					but->poin = MEM_callocN(sizeof(ColorBand), "colorband");
 
-			button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
-			memcpy(data->coba, &but_copypaste_coba, sizeof(ColorBand));
-			button_activate_state(C, but, BUTTON_STATE_EXIT);
+				button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+				memcpy(data->coba, &but_copypaste_coba, sizeof(ColorBand));
+				button_activate_state(C, but, BUTTON_STATE_EXIT);
+			}
 		}
 	}
 	else if (but->type == BUT_CURVE) {
 		if (mode == 'c') {
-			if (but->poin == NULL)
-				return;
-
-			but_copypaste_curve_alive = true;
-			curvemapping_free_data(&but_copypaste_curve);
-			curvemapping_copy_data(&but_copypaste_curve, (CurveMapping *) but->poin);
+			if (but->poin != NULL) {
+				but_copypaste_curve_alive = true;
+				curvemapping_free_data(&but_copypaste_curve);
+				curvemapping_copy_data(&but_copypaste_curve, (CurveMapping *) but->poin);
+			}
 		}
 		else {
-			if (!but_copypaste_curve_alive)
-				return;
-
-			if (!but->poin)
-				but->poin = MEM_callocN(sizeof(CurveMapping), "curvemapping");
+			if (but_copypaste_curve_alive) {
+				if (!but->poin)
+					but->poin = MEM_callocN(sizeof(CurveMapping), "curvemapping");
 
-			button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
-			curvemapping_free_data((CurveMapping *) but->poin);
-			curvemapping_copy_data((CurveMapping *) but->poin, &but_copypaste_curve);
-			button_activate_state(C, but, BUTTON_STATE_EXIT);
+				button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+				curvemapping_free_data((CurveMapping *) but->poin);
+				curvemapping_copy_data((CurveMapping *) but->poin, &but_copypaste_curve);
+				button_activate_state(C, but, BUTTON_STATE_EXIT);
+			}
 		}
 	}
 	/* operator button (any type) */
@@ -1881,6 +1888,10 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 			WM_clipboard_text_set(str, 0);
 		}
 	}
+
+	if (buf_paste_alloc) {
+		MEM_freeN((void *)buf_paste);
+	}
 }
 
 /* ************************ password text ******************************




More information about the Bf-blender-cvs mailing list