Mercurial > dwindows
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 } |