Commit 0a9ac826f38e4d63c651fba939a54992d7fbfb5d
1 parent
ff433330
Exists in
master
and in
3 other branches
Fixing 'escape' problem in winldap query.
Showing
3 changed files
with
92 additions
and
1 deletions
Show diff stats
src/core/util.c
| @@ -714,3 +714,83 @@ LIB3270_EXPORT int lib3270_getsockname(H3270 *hSession, struct sockaddr *addr, s | @@ -714,3 +714,83 @@ LIB3270_EXPORT int lib3270_getsockname(H3270 *hSession, struct sockaddr *addr, s | ||
| 714 | 714 | ||
| 715 | return getsockname(hSession->sock, addr, addrlen); | 715 | return getsockname(hSession->sock, addr, addrlen); |
| 716 | } | 716 | } |
| 717 | + | ||
| 718 | +static int xdigit_value(const char scanner) | ||
| 719 | +{ | ||
| 720 | + | ||
| 721 | + if(scanner >= '0' && scanner <= '9') { | ||
| 722 | + return scanner - '0'; | ||
| 723 | + } | ||
| 724 | + | ||
| 725 | + if(scanner >= 'A' && scanner <= 'F') { | ||
| 726 | + return 10 + (scanner - 'A'); | ||
| 727 | + } | ||
| 728 | + | ||
| 729 | + if(scanner >= 'a' && scanner <= 'f') { | ||
| 730 | + return 10 + (scanner - 'a'); | ||
| 731 | + } | ||
| 732 | + | ||
| 733 | + return -1; | ||
| 734 | +} | ||
| 735 | + | ||
| 736 | +static int unescape_character(const char *scanner) | ||
| 737 | +{ | ||
| 738 | + | ||
| 739 | + int first_digit = xdigit_value(*scanner++); | ||
| 740 | + int second_digit = xdigit_value(*scanner++); | ||
| 741 | + | ||
| 742 | + if (first_digit < 0) | ||
| 743 | + return -1; | ||
| 744 | + | ||
| 745 | + if (second_digit < 0) | ||
| 746 | + return -1; | ||
| 747 | + | ||
| 748 | + return (first_digit << 4) | second_digit; | ||
| 749 | + | ||
| 750 | +} | ||
| 751 | + | ||
| 752 | +char * lib3270_unescape(const char *text) | ||
| 753 | +{ | ||
| 754 | + if(!text) | ||
| 755 | + return NULL; | ||
| 756 | + | ||
| 757 | + size_t sz = strlen(text); | ||
| 758 | + char * outString = lib3270_malloc(sz+1); | ||
| 759 | + char * dst = outString; | ||
| 760 | + const char * src = text; | ||
| 761 | + char * ptr = strchr(src,'%'); | ||
| 762 | + | ||
| 763 | + memset(outString,0,sz+1); | ||
| 764 | + | ||
| 765 | + while(ptr) | ||
| 766 | + { | ||
| 767 | + if(ptr[1] == '%') | ||
| 768 | + { | ||
| 769 | + src = ptr+2; | ||
| 770 | + } | ||
| 771 | + else | ||
| 772 | + { | ||
| 773 | + size_t sz = (ptr - src); | ||
| 774 | + memcpy(dst,src,sz); | ||
| 775 | + dst += sz; | ||
| 776 | + | ||
| 777 | + int chr = unescape_character(ptr+1); | ||
| 778 | + if(chr < 0) | ||
| 779 | + { | ||
| 780 | + *(dst++) = '?'; | ||
| 781 | + } | ||
| 782 | + else | ||
| 783 | + { | ||
| 784 | + *(dst++) = (char) chr; | ||
| 785 | + } | ||
| 786 | + | ||
| 787 | + src += (sz+3); | ||
| 788 | + } | ||
| 789 | + | ||
| 790 | + ptr = strchr(src,'%'); | ||
| 791 | + } | ||
| 792 | + | ||
| 793 | + strcpy(dst,src); | ||
| 794 | + | ||
| 795 | + return outString; | ||
| 796 | +} |
src/include/utilc.h
| @@ -59,3 +59,13 @@ LIB3270_INTERNAL void rpf_init(rpf_t *r); | @@ -59,3 +59,13 @@ LIB3270_INTERNAL void rpf_init(rpf_t *r); | ||
| 59 | LIB3270_INTERNAL void rpf_reset(rpf_t *r); | 59 | LIB3270_INTERNAL void rpf_reset(rpf_t *r); |
| 60 | LIB3270_INTERNAL void rpf(rpf_t *r, char *fmt, ...) LIB3270_GNUC_FORMAT(2, 3); | 60 | LIB3270_INTERNAL void rpf(rpf_t *r, char *fmt, ...) LIB3270_GNUC_FORMAT(2, 3); |
| 61 | LIB3270_INTERNAL void rpf_free(rpf_t *r); | 61 | LIB3270_INTERNAL void rpf_free(rpf_t *r); |
| 62 | + | ||
| 63 | +/** | ||
| 64 | + * @brief "unescape" text (Replaces %value for corresponding character). | ||
| 65 | + * | ||
| 66 | + * @param text Text to convert. | ||
| 67 | + * | ||
| 68 | + * @return Converted string (release it with g_free). | ||
| 69 | + * | ||
| 70 | + */ | ||
| 71 | +LIB3270_INTERNAL char * lib3270_unescape(const char *text); |
src/ssl/windows/ldap.c
| @@ -40,6 +40,7 @@ | @@ -40,6 +40,7 @@ | ||
| 40 | 40 | ||
| 41 | #include "private.h" | 41 | #include "private.h" |
| 42 | #include <winldap.h> | 42 | #include <winldap.h> |
| 43 | +#include <utilc.h> | ||
| 43 | 44 | ||
| 44 | # ifndef LDAP_VENDOR_NAME | 45 | # ifndef LDAP_VENDOR_NAME |
| 45 | # error Your Platform SDK is NOT sufficient for LDAP support! \ | 46 | # error Your Platform SDK is NOT sufficient for LDAP support! \ |
| @@ -94,7 +95,7 @@ X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, cons | @@ -94,7 +95,7 @@ X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, cons | ||
| 94 | 95 | ||
| 95 | // Strip query. | 96 | // Strip query. |
| 96 | 97 | ||
| 97 | - lib3270_autoptr(char) urldup = strdup(consturl); | 98 | + lib3270_autoptr(char) urldup = lib3270_unescape(consturl); |
| 98 | 99 | ||
| 99 | char * url = urldup+7; | 100 | char * url = urldup+7; |
| 100 | char * base = strchr(url,'/'); | 101 | char * base = strchr(url,'/'); |