struct str_locate_result str_locate_text_reverse(const struct mystr* p_str, const char* p_text) { struct str_locate_result retval; unsigned int i; unsigned int text_len = vsf_sysutil_strlen(p_text); retval.found = 0; retval.char_found = 0; retval.index = 0; if (text_len == 0 || text_len > p_str->len) { return retval; } i = p_str->len - text_len; /* Want to go through loop once even if i==0 */ while (1) { if (vsf_sysutil_memcmp(p_str->p_buf + i, p_text, text_len) == 0) { retval.found = 1; retval.index = i; return retval; } if (i == 0) { break; } i--; } /* Not found */ return retval; }
struct str_locate_result str_locate_text(const struct mystr* p_str, const char* p_text) { struct str_locate_result retval; unsigned int i; unsigned int text_len = vsf_sysutil_strlen(p_text); retval.found = 0; retval.char_found = 0; retval.index = 0; if (text_len == 0 || text_len > p_str->len) { /* Not found */ return retval; } for (i=0; i <= (p_str->len - text_len); i++) { if (vsf_sysutil_memcmp(p_str->p_buf + i, p_text, text_len) == 0) { retval.found = 1; retval.index = i; return retval; } } /* Not found */ return retval; }
struct hash_node* hash_get_node_by_key(struct hash* p_hash, void* p_key) { struct hash_node** p_bucket = hash_get_bucket(p_hash, p_key); struct hash_node* p_node = *p_bucket; if (!p_node) { return p_node; } while (p_node != 0 && vsf_sysutil_memcmp(p_key, p_node->p_key, p_hash->key_size) != 0) { p_node = p_node->p_next; } return p_node; }
static int str_equal_internal(const char* p_buf1, unsigned int buf1_len, const char* p_buf2, unsigned int buf2_len) { int retval; unsigned int minlen = buf1_len; if (buf2_len < minlen) { minlen = buf2_len; } retval = vsf_sysutil_memcmp(p_buf1, p_buf2, minlen); if (retval != 0 || buf1_len == buf2_len) { return retval; } /* Strings equal but lengths differ. The greater one, then, is the longer */ return (int) (buf1_len - buf2_len); }
static void handle_port(struct vsf_session* p_sess) { static struct mystr s_tmp_str; struct vsf_sysutil_ipv4addr the_addr; struct vsf_sysutil_ipv4port the_port; unsigned char vals[6]; int i; struct vsf_sysutil_ipv4addr remote_addr = vsf_sysutil_sockaddr_get_ipaddr(p_sess->p_remote_addr); pasv_cleanup(p_sess); port_cleanup(p_sess); str_copy(&s_tmp_str, &p_sess->ftp_arg_str); for (i=0; i<6; i++) { static struct mystr s_rhs_comma_str; int this_number; /* This puts a single , delimited field in tmp_str */ str_split_char(&s_tmp_str, &s_rhs_comma_str, ','); /* Sanity - check for too many or two few commas! */ if ( (i<5 && str_isempty(&s_rhs_comma_str)) || (i==5 && !str_isempty(&s_rhs_comma_str))) { vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal PORT command."); return; } this_number = str_atoi(&s_tmp_str); if (this_number < 0 || this_number > 255) { vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal PORT command."); return; } /* If this truncates from int to uchar, we don't care */ vals[i] = (unsigned char) this_number; /* The right hand side of the comma now becomes the new string to * breakdown */ str_copy(&s_tmp_str, &s_rhs_comma_str); } vsf_sysutil_memcpy(the_addr.data, vals, sizeof(the_addr.data)); vsf_sysutil_memcpy(the_port.data, &vals[4], sizeof(the_port.data)); /* SECURITY: * 1) Reject requests not connecting to the control socket IP * 2) Reject connects to privileged ports */ if (!tunable_port_promiscuous) { if (vsf_sysutil_memcmp(the_addr.data, remote_addr.data, sizeof(the_addr.data)) != 0 || vsf_sysutil_is_port_reserved(the_port)) { vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal PORT command."); port_cleanup(p_sess); return; } } vsf_sysutil_sockaddr_alloc_ipv4(&p_sess->p_port_sockaddr); vsf_sysutil_sockaddr_set_port(p_sess->p_port_sockaddr, the_port); vsf_sysutil_sockaddr_set_ipaddr(p_sess->p_port_sockaddr, the_addr); vsf_cmdio_write(p_sess, FTP_PORTOK, "PORT command successful. Consider using PASV."); }