comparison gtk3/dw.c @ 2663:3b3be9f7f452

GTK3/4: Add some memory safety checks that were in GTK2 but missing from GTK 3/4. Noticed during a prior CID commit. Committing on Windows, so untested..
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 04 Oct 2021 19:26:08 +0000
parents 650f8b062317
children 608796a91527
comparison
equal deleted inserted replaced
2662:60df58233244 2663:3b3be9f7f452
1141 if(data) 1141 if(data)
1142 { 1142 {
1143 void **params = (void **)data; 1143 void **params = (void **)data;
1144 int counter = GPOINTER_TO_INT(params[0]); 1144 int counter = GPOINTER_TO_INT(params[0]);
1145 GtkWidget *widget = (GtkWidget *)params[2]; 1145 GtkWidget *widget = (GtkWidget *)params[2];
1146 char text[100]; 1146 char text[101] = {0};
1147 1147
1148 sprintf(text, "_dw_sigwindow%d", counter); 1148 snprintf(text, 100, "_dw_sigwindow%d", counter);
1149 sh.window = (HWND)g_object_get_data(G_OBJECT(widget), text); 1149 sh.window = (HWND)g_object_get_data(G_OBJECT(widget), text);
1150 sprintf(text, "_dw_sigfunc%d", counter); 1150 snprintf(text, 100, "_dw_sigfunc%d", counter);
1151 sh.func = (void *)g_object_get_data(G_OBJECT(widget), text); 1151 sh.func = (void *)g_object_get_data(G_OBJECT(widget), text);
1152 sprintf(text, "_dw_intfunc%d", counter); 1152 snprintf(text, 100, "_dw_intfunc%d", counter);
1153 sh.intfunc = (void *)g_object_get_data(G_OBJECT(widget), text); 1153 sh.intfunc = (void *)g_object_get_data(G_OBJECT(widget), text);
1154 sprintf(text, "_dw_sigdata%d", counter); 1154 snprintf(text, 100, "_dw_sigdata%d", counter);
1155 sh.data = g_object_get_data(G_OBJECT(widget), text); 1155 sh.data = g_object_get_data(G_OBJECT(widget), text);
1156 sprintf(text, "_dw_sigcid%d", counter); 1156 snprintf(text, 100, "_dw_sigcid%d", counter);
1157 sh.cid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), text)); 1157 sh.cid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), text));
1158 } 1158 }
1159 return sh; 1159 return sh;
1160 } 1160 }
1161 1161
1162 static void _dw_remove_signal_handler(GtkWidget *widget, int counter) 1162 static void _dw_remove_signal_handler(GtkWidget *widget, int counter)
1163 { 1163 {
1164 char text[100]; 1164 char text[101] = {0};
1165 gint cid; 1165 gint cid;
1166 1166
1167 sprintf(text, "_dw_sigcid%d", counter); 1167 snprintf(text, 100, "_dw_sigcid%d", counter);
1168 cid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), text)); 1168 cid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), text));
1169 if(cid > 0) 1169 if(cid > 0)
1170 g_signal_handler_disconnect(G_OBJECT(widget), cid); 1170 g_signal_handler_disconnect(G_OBJECT(widget), cid);
1171 g_object_set_data(G_OBJECT(widget), text, NULL); 1171 g_object_set_data(G_OBJECT(widget), text, NULL);
1172 sprintf(text, "_dw_sigwindow%d", counter); 1172 snprintf(text, 100, "_dw_sigwindow%d", counter);
1173 g_object_set_data(G_OBJECT(widget), text, NULL); 1173 g_object_set_data(G_OBJECT(widget), text, NULL);
1174 sprintf(text, "_dw_sigfunc%d", counter); 1174 snprintf(text, 100, "_dw_sigfunc%d", counter);
1175 g_object_set_data(G_OBJECT(widget), text, NULL); 1175 g_object_set_data(G_OBJECT(widget), text, NULL);
1176 sprintf(text, "_dw_intfunc%d", counter); 1176 snprintf(text, 100, "_dw_intfunc%d", counter);
1177 g_object_set_data(G_OBJECT(widget), text, NULL); 1177 g_object_set_data(G_OBJECT(widget), text, NULL);
1178 sprintf(text, "_dw_sigdata%d", counter); 1178 snprintf(text, 100, "_dw_sigdata%d", counter);
1179 g_object_set_data(G_OBJECT(widget), text, NULL); 1179 g_object_set_data(G_OBJECT(widget), text, NULL);
1180 } 1180 }
1181 1181
1182 static int _dw_set_signal_handler(GtkWidget *widget, HWND window, void *func, gpointer data, void *intfunc, void *discfunc) 1182 static int _dw_set_signal_handler(GtkWidget *widget, HWND window, void *func, gpointer data, void *intfunc, void *discfunc)
1183 { 1183 {
1184 int counter = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "_dw_sigcounter")); 1184 int counter = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "_dw_sigcounter"));
1185 char text[100]; 1185 char text[101] = {0};
1186 1186
1187 sprintf(text, "_dw_sigwindow%d", counter); 1187 snprintf(text, 100, "_dw_sigwindow%d", counter);
1188 g_object_set_data(G_OBJECT(widget), text, (gpointer)window); 1188 g_object_set_data(G_OBJECT(widget), text, (gpointer)window);
1189 sprintf(text, "_dw_sigfunc%d", counter); 1189 snprintf(text, 100, "_dw_sigfunc%d", counter);
1190 g_object_set_data(G_OBJECT(widget), text, (gpointer)func); 1190 g_object_set_data(G_OBJECT(widget), text, (gpointer)func);
1191 sprintf(text, "_dw_intfunc%d", counter); 1191 snprintf(text, 100, "_dw_intfunc%d", counter);
1192 g_object_set_data(G_OBJECT(widget), text, (gpointer)intfunc); 1192 g_object_set_data(G_OBJECT(widget), text, (gpointer)intfunc);
1193 sprintf(text, "_dw_discfunc%d", counter); 1193 snprintf(text, 100, "_dw_discfunc%d", counter);
1194 g_object_set_data(G_OBJECT(widget), text, (gpointer)discfunc); 1194 g_object_set_data(G_OBJECT(widget), text, (gpointer)discfunc);
1195 sprintf(text, "_dw_sigdata%d", counter); 1195 snprintf(text, 100, "_dw_sigdata%d", counter);
1196 g_object_set_data(G_OBJECT(widget), text, (gpointer)data); 1196 g_object_set_data(G_OBJECT(widget), text, (gpointer)data);
1197 1197
1198 counter++; 1198 counter++;
1199 g_object_set_data(G_OBJECT(widget), "_dw_sigcounter", GINT_TO_POINTER(counter)); 1199 g_object_set_data(G_OBJECT(widget), "_dw_sigcounter", GINT_TO_POINTER(counter));
1200 1200
1203 1203
1204 static void _dw_set_signal_handler_id(GtkWidget *widget, int counter, gint cid) 1204 static void _dw_set_signal_handler_id(GtkWidget *widget, int counter, gint cid)
1205 { 1205 {
1206 if(cid > 0) 1206 if(cid > 0)
1207 { 1207 {
1208 char text[100]; 1208 char text[101] = {0};
1209 1209
1210 sprintf(text, "_dw_sigcid%d", counter); 1210 snprintf(text, 100, "_dw_sigcid%d", counter);
1211 g_object_set_data(G_OBJECT(widget), text, GINT_TO_POINTER(cid)); 1211 g_object_set_data(G_OBJECT(widget), text, GINT_TO_POINTER(cid));
1212 } 1212 }
1213 else 1213 else
1214 dw_debug("WARNING: Dynamic Windows failed to connect signal.\n"); 1214 dw_debug("WARNING: Dynamic Windows failed to connect signal.\n");
1215 } 1215 }