Commit e77787adef5cb688c86252a92d4bf34948fa131a
1 parent
b88b5d23
Exists in
master
and in
3 other branches
Fixing linked list management error when removing st callbacks.
Showing
3 changed files
with
30 additions
and
3 deletions
Show diff stats
src/include/lib3270.h
| ... | ... | @@ -473,7 +473,7 @@ |
| 473 | 473 | * @return 0 if suceeds, non zero if fails (sets errno). |
| 474 | 474 | * |
| 475 | 475 | */ |
| 476 | - LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, void * id); | |
| 476 | + LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, const void * id); | |
| 477 | 477 | |
| 478 | 478 | LIB3270_EXPORT void lib3270_reset_callbacks(H3270 *hSession); |
| 479 | 479 | ... | ... |
src/lib3270/connect.c
src/lib3270/host.c
| ... | ... | @@ -197,11 +197,22 @@ LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_ST |
| 197 | 197 | |
| 198 | 198 | } |
| 199 | 199 | |
| 200 | -LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, void * id) | |
| 200 | +LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, const void * id) | |
| 201 | 201 | { |
| 202 | 202 | struct lib3270_state_callback *st; |
| 203 | 203 | struct lib3270_state_callback *prev = (struct lib3270_state_callback *) NULL; |
| 204 | 204 | |
| 205 | +#ifdef DEBUG | |
| 206 | + { | |
| 207 | + debug("Before remove of %p (last=%p):",id,hSession->st.last[tx]); | |
| 208 | + | |
| 209 | + for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) | |
| 210 | + { | |
| 211 | + debug("%p",st); | |
| 212 | + } | |
| 213 | + } | |
| 214 | +#endif // DEBUG | |
| 215 | + | |
| 205 | 216 | for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) |
| 206 | 217 | { |
| 207 | 218 | if (st == (struct lib3270_state_callback *)id) |
| ... | ... | @@ -221,7 +232,21 @@ LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, |
| 221 | 232 | else |
| 222 | 233 | hSession->st.callbacks[tx] = (struct lib3270_state_callback *) st->next; |
| 223 | 234 | |
| 224 | - lib3270_free(id); | |
| 235 | + for(st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) | |
| 236 | + hSession->st.last[tx] = st; | |
| 237 | + | |
| 238 | + lib3270_free((void *) id); | |
| 239 | + | |
| 240 | +#ifdef DEBUG | |
| 241 | + { | |
| 242 | + debug("After Remove of %p (last=%p):",id,hSession->st.last[tx]); | |
| 243 | + | |
| 244 | + for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) | |
| 245 | + { | |
| 246 | + debug("%p",st); | |
| 247 | + } | |
| 248 | + } | |
| 249 | +#endif // DEBUG | |
| 225 | 250 | |
| 226 | 251 | return 0; |
| 227 | 252 | } | ... | ... |