David Powell wrote: > David Powell wrote: >> Tony Nguyen wrote: >>> Dave, >>> >>> See my responses inline and the updated webrev at: >>> >>> http://cr.opensolaris.org/~tonyn/firewall13Jan2009-inc/ >>> http://cr.opensolaris.org/~tonyn/firewall13Jan2009/ >> >> I'm still working through ipf_include.sh. > > ... and servinfo.c. Here's the rest: > > servinfo.c: > > uaddr2port: > > If there's only one dot in the provided address, you'll scan past > the beginning of your buffer (and could end up writing past the end > of 'port_str'). You need to ensure 'p' doesn't advance past > 'addr'. > Universal addresses should have the format
h1.h2.h3.h4.p1.p2 (IPv4) x1:x2:x3:x4:x5:x6:x7:x8.p1.p2 (IPv6) However, I agree that we should better handle bad input and will make the suggested change. > Since the string pointed to by 'p' is 'l' bytes long, after the > strncpy 'port_str' won't neccesarily be NUL terminated, which could > cause atol to fail. I thought the prior bzero call would prevent that problem, especially if we make sure 'p' doesn't advance past 'addr'. Or would you prefer should be replacing it with "strlcpy(port_str, p, l + 1)" ? > svc_getrpcinfo: > > I'm still wondering where the "12" in "buf[12]" comes from. It > should either be documented, or a constant (one hopefully derived > from whatever determines the length of the buffer). Yes, a constant would be more clear but I'm not sure what the optimal size should be. The buffer holds either port number (2^16 value) or a netid (currently limited to tcp, udp, tcp6, udp6) and an extra space. Does 12 seems reasonable? > You now silently exclude protocols or ports that don't fit on the > line. I suppose it is unlikely, but I'm wondering if that was a > concious choice. > Yes, it is a conscious choice. > printf("%s\n", str) is more simply written as puts(str); > will do All suggested changes to ipf_include.sh will be followed. Much appreciated, tony > ipf_include.sh: > > Don't use &&/|| with { }; use if/then instead. > > Instead of > > command && return 0 || return 1 > > when command returns 0 or 1, do > > command > return $? > > inst_ipf_file: > inst_nat_file: > > Instead of echoing the result of fmri_to_file to concatenate a > suffix, pass the suffix as an argument to fmri_to_file to append > for you. Then just call fmri_to_file. > > (On further inspection, inst_nat_file doesn't appear to be used, > and other uses of inst_ipf_file have been replaced per my previous > comments. They should just be removed.) > > service_check_state: > > Instead of > > while true > condition && break > sleep > > do > > while !condition > sleep > > file_get_ports: > get_active_ports: > > '/to.*port =/ s/\(.*to.* port =\) \([a-z0-9]*\).*/\2/p' > > can be simplified to > > 's/.*to.* port = \([a-z0-9]*\).*/\1/p' > > since 'p' will only print if a substitution is made, and the > pattern is more restrictive than the address. > > prepend_new_rules: > > I don't think it's necessary to escape '@'. > > tuple_get_port: > > There's no need to escape ':' in 's/.*\://'' > > tuple_get_proto: > > There's no need to escape ':' in 's/\:.*//'' > > Use if/then/else here; it will be clearer. > > ipf_remove_lock: > > Why do you remove the lock in two steps instead of just 'rm -r' as > you do in ipf_get_lock? > > Instead of 'while [ true ]' use 'while :'. > > replace_file: > > Why not always move? > > process_server_svc: > > All callers test for IPF_FMRI before calling this function. You > don't need to test it again. > > All callers test service_is_enabled before calling this function. > You don't need to test it again. > > process_nonsvc_progs: > > Instead of using port_is_range, just 'set -- $port' and test $#. > > create_services_rules: > > Instead of scraping the output of svcs, it is probably more stable > and more efficient to get the list of services using: > > svcprop -cf -p general/enabled -p general_ovr/enabled '*' > 2>/dev/null | > sed -n 's,^\(svc:.*\)/:properties/.* true$,\1,p' | sort -u > > Since your 'service_is_enabled' predicate determines if the service > is enabled *or* temporarily enabled, with the above you can get rid > of that test from your loop. > > service_update_rules: > > I missed that you don't install rules for services that are in > maintenance. If this is the case, the decision to install rules > for services that are temporarily disabled doesn't really make > sense. (I'd still replace the use of svcs, though.) > > service_update: > create_services_rules: > > Both test the result of ipf_get_lock, but afaikt it will always > succeed.