smb_ucs2_t *strstr_wa(const smb_ucs2_t *s, const char *ins) { smb_ucs2_t *r; size_t slen, inslen; if (!s || !*s || !ins || !*ins) return NULL; slen = strlen_w(s); inslen = strlen(ins); r = (smb_ucs2_t *)s; while ((r = strchr_w(r, UCS2_CHAR(*ins)))) { if (strncmp_wa(r, ins, inslen) == 0) return r; r++; } return NULL; }
smb_ucs2_t *strstr_w(const smb_ucs2_t *s, const smb_ucs2_t *ins) { smb_ucs2_t *r; size_t inslen; if (!s || !*s || !ins || !*ins) { return NULL; } inslen = strlen_w(ins); r = (smb_ucs2_t *)s; while ((r = strchr_w(r, *ins))) { if (strncmp_w(r, ins, inslen) == 0) { return r; } r++; } return NULL; }
static NTSTATUS is_valid_name(const smb_ucs2_t *fname, bool allow_wildcards, bool only_8_3) { smb_ucs2_t *str, *p; size_t num_ucs2_chars; NTSTATUS ret = NT_STATUS_OK; if (!fname || !*fname) return NT_STATUS_INVALID_PARAMETER; /* . and .. are valid names. */ if (strcmp_wa(fname, ".")==0 || strcmp_wa(fname, "..")==0) return NT_STATUS_OK; if (only_8_3) { ret = has_valid_83_chars(fname, allow_wildcards); if (!NT_STATUS_IS_OK(ret)) return ret; } ret = has_illegal_chars(fname, allow_wildcards); if (!NT_STATUS_IS_OK(ret)) return ret; /* Name can't end in '.' or ' ' */ num_ucs2_chars = strlen_w(fname); if (fname[num_ucs2_chars-1] == UCS2_CHAR('.') || fname[num_ucs2_chars-1] == UCS2_CHAR(' ')) { return NT_STATUS_UNSUCCESSFUL; } str = strdup_w(fname); /* Truncate copy after the first dot. */ p = strchr_w(str, UCS2_CHAR('.')); if (p) { *p = 0; } strupper_w(str); p = &str[1]; switch(str[0]) { case UCS2_CHAR('A'): if(strcmp_wa(p, "UX") == 0) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('C'): if((strcmp_wa(p, "LOCK$") == 0) || (strcmp_wa(p, "ON") == 0) || (strcmp_wa(p, "OM1") == 0) || (strcmp_wa(p, "OM2") == 0) || (strcmp_wa(p, "OM3") == 0) || (strcmp_wa(p, "OM4") == 0) ) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('L'): if((strcmp_wa(p, "PT1") == 0) || (strcmp_wa(p, "PT2") == 0) || (strcmp_wa(p, "PT3") == 0) ) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('N'): if(strcmp_wa(p, "UL") == 0) ret = NT_STATUS_UNSUCCESSFUL; break; case UCS2_CHAR('P'): if(strcmp_wa(p, "RN") == 0) ret = NT_STATUS_UNSUCCESSFUL; break; default: break; } SAFE_FREE(str); return ret; }
smb_ucs2_t *strchr_wa(const smb_ucs2_t *s, char c) { return strchr_w(s, UCS2_CHAR(c)); }
/* * inet_pton: This function takes string format IPv4 or IPv6 address and * converts it to binary form. The format of this function corresponds to * inet_pton() in the socket library. * * Return values: * 0 invalid IPv4 or IPv6 address * 1 successful conversion * -1 af is not AF_INET or AF_INET6 */ int __inet_pton(int af, char *inp, void *outp, int compat) { int i; long byte; char *end; switch (af) { case AF_INET: if (str2inet_addr(inp, (ipaddr_t *)outp) != 0) { if (!compat) *(uint32_t *)outp = htonl(*(uint32_t *)outp); return (1); } else { return (0); } case AF_INET6: { union v6buf_u { uint16_t v6words_u[8]; in6_addr_t v6addr_u; } v6buf, *v6outp; uint16_t *dbl_col = NULL; char lastbyte = NULL; v6outp = (union v6buf_u *)outp; if (strchr_w(inp, '.') != NULL) { /* v4 mapped or v4 compatable */ if (strncmp(inp, "::ffff:", 7) == 0) { ipaddr_t ipv4_all_zeroes = 0; /* mapped - first init prefix and then fill */ IN6_IPADDR_TO_V4MAPPED(ipv4_all_zeroes, &v6outp->v6addr_u); return (str2inet_addr(inp + 7, &(v6outp->v6addr_u.s6_addr32[3]))); } else if (strncmp(inp, "::", 2) == 0) { /* v4 compatable - prefix all zeroes */ bzero(&v6outp->v6addr_u, sizeof (in6_addr_t)); return (str2inet_addr(inp + 2, &(v6outp->v6addr_u.s6_addr32[3]))); } return (0); } for (i = 0; i < 8; i++) { int error; /* * if ddi_strtol() fails it could be because * the string is "::". That is valid and * checked for below so just set the value to * 0 and continue. */ if ((error = ddi_strtol(inp, &end, 16, &byte)) != 0) { if (error == ERANGE) return (0); byte = 0; } if (byte < 0 || byte > 0x0ffff) { return (0); } if (compat) { v6buf.v6words_u[i] = (uint16_t)byte; } else { v6buf.v6words_u[i] = htons((uint16_t)byte); } if (*end == NULL || i == 7) { inp = end; break; } if (inp == end) { /* not a number must be */ if (*inp == ':' && ((i == 0 && *(inp + 1) == ':') || lastbyte == ':')) { if (dbl_col) { return (0); } if (byte != 0) i++; dbl_col = &v6buf.v6words_u[i]; if (i == 0) inp++; } else if (*inp == NULL || *inp == ' ' || *inp == '\t') { break; } else { return (0); } } else { inp = end; } if (*inp != ':') { return (0); } inp++; if (*inp == NULL || *inp == ' ' || *inp == '\t') { break; } lastbyte = *inp; } if (*inp != NULL && *inp != ' ' && *inp != '\t') { return (0); } /* * v6words now contains the bytes we could translate * dbl_col points to the word (should be 0) where * a double colon was found */ if (i == 7) { v6outp->v6addr_u = v6buf.v6addr_u; } else { int rem; int word; int next; if (dbl_col == NULL) { return (0); } bzero(&v6outp->v6addr_u, sizeof (in6_addr_t)); rem = dbl_col - &v6buf.v6words_u[0]; for (next = 0; next < rem; next++) { v6outp->v6words_u[next] = v6buf.v6words_u[next]; } next++; /* skip dbl_col 0 */ rem = i - rem; word = 8 - rem; while (rem > 0) { v6outp->v6words_u[word] = v6buf.v6words_u[next]; word++; rem--; next++; } } return (1); /* Success */ } } /* switch */ return (-1); /* return -1 for default case */ }