static void filter_request(char *buf) { int msg_type = CVAL(buf,0); int type = CVAL(buf,smb_com); pstring name1,name2; unsigned x; if (msg_type) { /* it's a netbios special */ switch (msg_type) { case 0x81: /* session request */ name_extract(buf,4,name1); name_extract(buf,4 + name_len(buf + 4),name2); DEBUG(0,("sesion_request: %s -> %s\n", name1, name2)); if (netbiosname) { /* replace the destination netbios name */ name_mangle(netbiosname, buf+4, 0x20); } } return; } /* it's an ordinary SMB request */ switch (type) { case SMBsesssetupX: /* force the client capabilities */ x = IVAL(buf,smb_vwv11); x = (x | CLI_CAPABILITY_SET) & ~CLI_CAPABILITY_MASK; SIVAL(buf, smb_vwv11, x); break; } }
SCOPE2 int search_wid(int adr, int len, int wid, int up) { // The first character in the string is the Forth count field. int str, ptr; int length; int dictp; for ( dictp = TOKEN(up + DATA(voc_unum + wid)); dictp != 0; dictp = TOKEN(to_link(dictp)) ) { length = name_len(dictp); if (len != length) { continue; } str = to_name_adr(dictp); ptr = adr; for ( ; length != 0; --length ) { if ( CHARS(str++) != CHARS(ptr++) ) break; } if (length == 0) return dictp; } return (0); // Not found }
static void filter_request(char *buf) { int msg_type = CVAL(buf,0); int type = CVAL(buf,smb_com); pstring name1,name2; unsigned x; if (msg_type) { /* it's a netbios special */ switch (msg_type) { case 0x81: /* session request */ name_extract(buf,4,name1); name_extract(buf,4 + name_len(buf + 4),name2); d_printf("sesion_request: %s -> %s\n", name1, name2); if (netbiosname) { /* replace the destination netbios name */ name_mangle(netbiosname, buf+4, 0x20); } } return; } /* it's an ordinary SMB request */ switch (type) { case SMBsesssetupX: /* force the client capabilities */ x = IVAL(buf,smb_vwv11); d_printf("SMBsesssetupX cap=0x%08x\n", x); d_printf("pwlen=%d/%d\n", SVAL(buf, smb_vwv7), SVAL(buf, smb_vwv8)); system("mv sessionsetup.dat sessionsetup1.dat"); save_file("sessionsetup.dat", smb_buf(buf), SVAL(buf, smb_vwv7)); x = (x | CLI_CAPABILITY_SET) & ~CLI_CAPABILITY_MASK; SIVAL(buf, smb_vwv11, x); break; } }
static void filter_request(char *buf, size_t buf_len) { int msg_type = CVAL(buf,0); int type = CVAL(buf,smb_com); unsigned x; fstring name1,name2; int name_len1, name_len2; int name_type1, name_type2; if (msg_type) { /* it's a netbios special */ switch (msg_type) case 0x81: /* session request */ /* inbuf_size is guaranteed to be at least 4. */ name_len1 = name_len((unsigned char *)(buf+4), buf_len - 4); if (name_len1 <= 0 || name_len1 > buf_len - 4) { DEBUG(0,("Invalid name length in session request\n")); return; } name_len2 = name_len((unsigned char *)(buf+4+name_len1), buf_len - 4 - name_len1); if (name_len2 <= 0 || name_len2 > buf_len - 4 - name_len1) { DEBUG(0,("Invalid name length in session request\n")); return; } name_type1 = name_extract((unsigned char *)buf, buf_len,(unsigned int)4,name1); name_type2 = name_extract((unsigned char *)buf, buf_len,(unsigned int)(4 + name_len1),name2); if (name_type1 == -1 || name_type2 == -1) { DEBUG(0,("Invalid name type in session request\n")); return; } d_printf("sesion_request: %s -> %s\n", name1, name2); if (netbiosname) { char *mangled = name_mangle( talloc_tos(), netbiosname, 0x20); if (mangled != NULL) { /* replace the destination netbios * name */ memcpy(buf+4, mangled, name_len((unsigned char *)mangled, talloc_get_size(mangled))); TALLOC_FREE(mangled); } } return; } /* it's an ordinary SMB request */ switch (type) { case SMBsesssetupX: /* force the client capabilities */ x = IVAL(buf,smb_vwv11); d_printf("SMBsesssetupX cap=0x%08x\n", x); d_printf("pwlen=%d/%d\n", SVAL(buf, smb_vwv7), SVAL(buf, smb_vwv8)); system("mv sessionsetup.dat sessionsetup1.dat"); save_file("sessionsetup.dat", smb_buf(buf), SVAL(buf, smb_vwv7)); x = (x | CLI_CAPABILITY_SET) & ~CLI_CAPABILITY_MASK; SIVAL(buf, smb_vwv11, x); break; } }
/**************************************************************************** send a session request. see rfc1002.txt 4.3 and 4.3.2 ****************************************************************************/ BOOL cli_session_request(struct cli_state *cli, const struct nmb_name *calling, const struct nmb_name *called) { char *p; int len = 4; extern pstring user_socket_options; io_struct ps; uchar nb_type; ZERO_STRUCT(ps); io_init(&ps, 4096, MARSHALL); /* send a session request (RFC 1002) */ smb_set_nbnames(cli->hnd, calling, called); /* put in the destination name */ p = ps.data_p; name_mangle(called->name, p, called->name_type); len += name_len(p); /* and my name */ p = ps.data_p + len-4; name_mangle(calling->name, p, calling->name_type); len += name_len(p); ps.data_offset = len; smb_send_smb(cli->hnd, &ps, 0x81); io_free(&ps); DEBUG(5, ("Sent session request: %s to %s\n", nmb_namestr(calling), nmb_namestr(called))); if (!smb_receive_smb(cli->hnd, &ps, &nb_type)) return False; if (nb_type == 0x84) { int fd; /* C. Hoch 9/14/95 Start */ /* For information, here is the response structure. * We do the byte-twiddling to for portability. struct RetargetResponse{ unsigned char type; unsigned char flags; int16 length; int32 ip_addr; int16 port; }; */ int port = (CVAL(ps.data_p, 4) << 8) + CVAL(ps.data_p, 5); /* SESSION RETARGET */ putip((char *)&cli->dest_ip, ps.data_p); fd = open_socket_out(SOCK_STREAM, &cli->dest_ip, port, LONG_CONNECT_TIMEOUT); if (fd == -1 || !smb_set_fd(cli->hnd, fd)) return False; cli->dbg(3, "Retargeted\n"); set_socket_options(fd, user_socket_options); /* Try again */ { static int depth; BOOL ret; if (depth > 4) { cli->dbg( 0, "Retarget recursion - failing\n"); return False; } depth++; ret = cli_session_request(cli, calling, called); depth--; return ret; } } /* C. Hoch 9/14/95 End */ if (nb_type != 0x82) { /* This is the wrong place to put the error... JRA. */ cli->rap_error = CVAL(ps.data_p, 0); return False; } return (True); }
BOOL cli_session_request(struct cli_state *cli, struct nmb_name *calling, struct nmb_name *called) { char *p; int len = 4; extern pstring user_socket_options; /* 445 doesn't have session request */ if (cli->port == 445) return True; /* send a session request (RFC 1002) */ memcpy(&(cli->calling), calling, sizeof(*calling)); memcpy(&(cli->called ), called , sizeof(*called )); /* put in the destination name */ p = cli->outbuf+len; name_mangle(cli->called .name, p, cli->called .name_type); len += name_len(p); /* and my name */ p = cli->outbuf+len; name_mangle(cli->calling.name, p, cli->calling.name_type); len += name_len(p); /* setup the packet length * Remove four bytes from the length count, since the length * field in the NBT Session Service header counts the number * of bytes which follow. The cli_send_smb() function knows * about this and accounts for those four bytes. * CRH. */ len -= 4; _smb_setlen(cli->outbuf,len); SCVAL(cli->outbuf,0,0x81); #ifdef WITH_SSL retry: #endif /* WITH_SSL */ cli_send_smb(cli); DEBUG(5,("Sent session request\n")); if (!cli_receive_smb(cli)) return False; if (CVAL(cli->inbuf,0) == 0x84) { /* C. Hoch 9/14/95 Start */ /* For information, here is the response structure. * We do the byte-twiddling to for portability. struct RetargetResponse{ unsigned char type; unsigned char flags; int16 length; int32 ip_addr; int16 port; }; */ int port = (CVAL(cli->inbuf,8)<<8)+CVAL(cli->inbuf,9); /* SESSION RETARGET */ putip((char *)&cli->dest_ip,cli->inbuf+4); cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip, port, LONG_CONNECT_TIMEOUT); if (cli->fd == -1) return False; DEBUG(3,("Retargeted\n")); set_socket_options(cli->fd,user_socket_options); /* Try again */ { static int depth; BOOL ret; if (depth > 4) { DEBUG(0,("Retarget recursion - failing\n")); return False; } depth++; ret = cli_session_request(cli, calling, called); depth--; return ret; } } /* C. Hoch 9/14/95 End */ #ifdef WITH_SSL if (CVAL(cli->inbuf,0) == 0x83 && CVAL(cli->inbuf,4) == 0x8e){ /* use ssl */ if (!sslutil_fd_is_ssl(cli->fd)){ if (sslutil_connect(cli->fd) == 0) goto retry; } } #endif /* WITH_SSL */ if (CVAL(cli->inbuf,0) != 0x82) { /* This is the wrong place to put the error... JRA. */ cli->rap_error = CVAL(cli->inbuf,4); return False; } return(True); }
size_t zmq::mechanism_t::property_len (const char *name, size_t value_len) { return ::property_len (name_len (name), value_len); }