39 #include "../misc/openvas_logging.h" 42 #define SMB_STRDUP(s) strdup(s) 50 #define uint16 uint16_t 61 static uint8 *valid_table_ntlmssp;
62 static bool valid_table_use_unmap_ntlmssp;
64 void const *src,
size_t srclen,
65 void *dest,
size_t destlen,
bool allow_badcharcnv);
66 static int check_dos_char_slowly_ntlmssp(
uint16 c)
106 static bool conv_silent_ntlmssp;
110 static int mapped_file;
112 const char *allowed =
".!#$%&'()_-@^`~";
126 valid_table_use_unmap_ntlmssp =
False;
128 valid_table_ntlmssp = (
uint8 *)SMB_MALLOC(0x10000);
129 for (i=0;i<128;i++) {
130 valid_table_ntlmssp[i] = isalnum(i) || strchr(allowed,i);
135 for (;i<0x10000;i++) {
138 valid_table_ntlmssp[i] = check_dos_char_slowly_ntlmssp(c);
162 static const char *charset_name_ntlmssp(
charset_t ch)
164 const char *ret = NULL;
168 else if (ch ==
CH_UTF8) ret =
"UTF8";
170 #if defined(HAVE_NL_LANGINFO) && defined(CODESET) 171 if (ret && !strcmp(ret,
"LOCALE")) {
172 const char *ln = NULL;
174 #ifdef HAVE_SETLOCALE 175 setlocale(LC_ALL,
"");
177 ln = nl_langinfo(CODESET);
192 if (!ret || !*ret) ret =
"ASCII";
198 static int initialized =
False;
217 bool did_reload =
False;
229 const char *n1 = charset_name_ntlmssp((
charset_t)c1);
230 const char *n2 = charset_name_ntlmssp((
charset_t)c2);
231 if (conv_handles_ntlmssp[c1][c2] &&
232 strcmp(n1, conv_handles_ntlmssp[c1][c2]->from_name) == 0 &&
233 strcmp(n2, conv_handles_ntlmssp[c1][c2]->to_name) == 0)
238 if (conv_handles_ntlmssp[c1][c2])
242 if (conv_handles_ntlmssp[c1][c2] == (
smb_iconv_t)-1) {
250 if (!conv_handles_ntlmssp[c1][c2]) {
252 " initialization failed");
262 conv_silent_ntlmssp =
True;
264 conv_silent_ntlmssp =
False;
285 void const *src,
size_t srclen,
286 void *dest,
size_t destlen,
bool allow_bad_conv)
290 const char* inbuf = (
const char*)src;
291 char* outbuf = (
char*)dest;
296 descriptor = conv_handles_ntlmssp[from][to];
298 if (srclen == (
size_t)-1) {
302 srclen = strlen((
const char *)src)+1;
308 if (!conv_silent_ntlmssp)
318 if(retval==(
size_t)-1) {
322 if (!conv_silent_ntlmssp)
340 return destlen-o_len;
351 if (o_len == 0 || i_len == 0)
352 return destlen - o_len;
360 return destlen - o_len;
371 if (o_len == 0 || i_len == 0)
372 return destlen - o_len;
382 return destlen - o_len;
393 if (o_len == 0 || i_len == 0)
394 return destlen - o_len;
411 if (o_len == 0 || i_len == 0)
412 return destlen - o_len;
419 return destlen - o_len;
442 void const *src,
size_t srclen,
443 void *dest,
size_t destlen,
bool allow_bad_conv)
455 const unsigned char *p = (
const unsigned char *)src;
456 unsigned char *q = (
unsigned char *)dest;
457 size_t slen = srclen;
458 size_t dlen = destlen;
459 unsigned char lastp =
'\0';
463 while (slen && dlen) {
464 if ((lastp = *p) <= 0x7f) {
466 if (slen != (
size_t)-1) {
474 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS 477 size_t ret = convert_string_internal_ntlmssp(from, to, p, slen, q, dlen, allow_bad_conv);
478 if (ret == (
size_t)-1) {
487 if (((slen != (
size_t)-1) && slen) ||
488 ((slen == (
size_t)-1) && lastp)) {
494 const unsigned char *p = (
const unsigned char *)src;
495 unsigned char *q = (
unsigned char *)dest;
497 size_t slen = srclen;
498 size_t dlen = destlen;
499 unsigned char lastp =
'\0';
502 while (((slen == (
size_t)-1) || (slen >= 2)) && dlen) {
503 if (((lastp = *p) <= 0x7f) && (p[1] == 0)) {
505 if (slen != (
size_t)-1) {
514 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS 517 return retval + convert_string_internal_ntlmssp(from, to, p, slen, q, dlen, allow_bad_conv);
523 if (((slen != (
size_t)-1) && slen) ||
524 ((slen == (
size_t)-1) && lastp)) {
530 const unsigned char *p = (
const unsigned char *)src;
531 unsigned char *q = (
unsigned char *)dest;
533 size_t slen = srclen;
534 size_t dlen = destlen;
535 unsigned char lastp =
'\0';
538 while (slen && (dlen >= 2)) {
539 if ((lastp = *p) <= 0x7F) {
542 if (slen != (
size_t)-1) {
550 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS 553 return retval + convert_string_internal_ntlmssp(from, to, p, slen, q, dlen, allow_bad_conv);
559 if (((slen != (
size_t)-1) && slen) ||
560 ((slen == (
size_t)-1) && lastp)) {
567 #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS 570 return convert_string_internal_ntlmssp(from, to, src, srclen, dest, destlen, allow_bad_conv);
void init_valid_table_ntlmssp(void)
#define SSVAL(buf, pos, val)
char lp_failed_convert_char_ntlmssp(void)
size_t convert_string_ntlmssp(charset_t from, charset_t to, void const *src, size_t srclen, void *dest, size_t destlen, bool allow_badcharcnv)
void init_iconv_ntlmssp(void)
void log_legacy_write(const char *format,...)
Legacy function to write a log message.
smb_iconv_t smb_iconv_open_ntlmssp(const char *tocode, const char *fromcode)
size_t smb_iconv_ntlmssp(smb_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
#define COPY_UCS2_CHAR(dest, src)
int smb_iconv_close_ntlmssp(smb_iconv_t cd)
void lazy_initialize_conv_ntlmssp(void)
size_t strlen_w_ntlmssp(const uint16 *src)