Commit c119b21be8d91747fa133874a666c24361b3b2a6
1 parent
5138be21
Exists in
master
and in
3 other branches
Fixing segfault on invalid clipboard contents.
Showing
2 changed files
with
27 additions
and
20 deletions
Show diff stats
src/core/paste.c
| @@ -371,39 +371,42 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str, | @@ -371,39 +371,42 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str, | ||
| 371 | return rc; | 371 | return rc; |
| 372 | } | 372 | } |
| 373 | 373 | ||
| 374 | -LIB3270_EXPORT int lib3270_paste_text(H3270 *h, const unsigned char *str) | 374 | +LIB3270_EXPORT int lib3270_paste_text(H3270 *hSession, const unsigned char *str) |
| 375 | { | 375 | { |
| 376 | - int sz; | ||
| 377 | - CHECK_SESSION_HANDLE(h); | 376 | + if(check_online_session(hSession)) |
| 377 | + return -errno; | ||
| 378 | 378 | ||
| 379 | - if(!lib3270_is_connected(h)) | 379 | + if(!str) |
| 380 | { | 380 | { |
| 381 | - lib3270_ring_bell(h); | ||
| 382 | - errno = ENOTCONN; | ||
| 383 | - return 0; | 381 | + lib3270_ring_bell(hSession); |
| 382 | + return -(errno = EINVAL); | ||
| 384 | } | 383 | } |
| 385 | 384 | ||
| 386 | - if(h->paste_buffer) | 385 | + if(hSession->paste_buffer) |
| 387 | { | 386 | { |
| 388 | - lib3270_free(h->paste_buffer); | ||
| 389 | - h->paste_buffer = NULL; | 387 | + lib3270_free(hSession->paste_buffer); |
| 388 | + hSession->paste_buffer = NULL; | ||
| 390 | } | 389 | } |
| 391 | 390 | ||
| 392 | - sz = lib3270_set_string(h,str,-1); | 391 | + int sz = lib3270_set_string(hSession,str,-1); |
| 393 | if(sz < 0) | 392 | if(sz < 0) |
| 394 | { | 393 | { |
| 395 | // Can´t paste | 394 | // Can´t paste |
| 396 | - lib3270_popup_dialog(h,LIB3270_NOTIFY_WARNING, | ||
| 397 | - _( "Action failed" ), | ||
| 398 | - _( "Unable to paste text" ), | ||
| 399 | - "%s", sz == -EPERM ? _( "Keyboard is locked" ) : _( "Unexpected error" ) ); | ||
| 400 | - return 0; | 395 | + lib3270_popup_dialog( |
| 396 | + hSession, | ||
| 397 | + LIB3270_NOTIFY_WARNING, | ||
| 398 | + _( "Action failed" ), | ||
| 399 | + _( "Unable to paste text" ), | ||
| 400 | + "%s", sz == -EPERM ? _( "Keyboard is locked" ) : _( "Unexpected error" ) | ||
| 401 | + ); | ||
| 402 | + | ||
| 403 | + return sz; | ||
| 401 | } | 404 | } |
| 402 | 405 | ||
| 403 | if((int) strlen((char *) str) > sz) | 406 | if((int) strlen((char *) str) > sz) |
| 404 | { | 407 | { |
| 405 | - h->paste_buffer = strdup((char *) (str+sz)); | ||
| 406 | - return 1; | 408 | + hSession->paste_buffer = strdup((char *) (str+sz)); |
| 409 | + return strlen(hSession->paste_buffer); | ||
| 407 | } | 410 | } |
| 408 | 411 | ||
| 409 | return 0; | 412 | return 0; |
src/include/lib3270/selection.h
| @@ -105,10 +105,14 @@ | @@ -105,10 +105,14 @@ | ||
| 105 | * | 105 | * |
| 106 | * @see lib3270_paste_next. | 106 | * @see lib3270_paste_next. |
| 107 | * | 107 | * |
| 108 | - * @return Non 0 if there's more to paste with lib3270_pastenext. | 108 | + * @return 0 if suceeded, negative if faile, > 0 if there's more data. |
| 109 | + * | ||
| 110 | + * @retval 0 The entire string was pasted. | ||
| 111 | + * @retval -EINVAL Invalid argument. | ||
| 112 | + * @retval -EPERM Keyboard is locked. | ||
| 109 | * | 113 | * |
| 110 | */ | 114 | */ |
| 111 | - LIB3270_EXPORT int lib3270_paste_text(H3270 *h, const unsigned char *str); | 115 | + LIB3270_EXPORT int lib3270_paste_text(H3270 *hSession, const unsigned char *str); |
| 112 | 116 | ||
| 113 | /** | 117 | /** |
| 114 | * @brief Paste remaining string. | 118 | * @brief Paste remaining string. |