* Re: PATCH: _whois
@ 1999-11-09 11:01 Sven Wischnowsky
0 siblings, 0 replies; 6+ messages in thread
From: Sven Wischnowsky @ 1999-11-09 11:01 UTC (permalink / raw)
To: zsh-workers
Bart Schaefer wrote:
> On Nov 9, 9:58am, Sven Wischnowsky wrote:
> } Subject: Re: PATCH: _whois
> }
> } (patch-readers will notice that there even is some
> } redundancy in this patch, trying to avoid getting this bug again
> } later).
>
> I always experience some ambivalence about this sort of thing:
>
> ...
>
> So it would seem to me that there should at least be a DPUTS() in there,
> to mitigate the first couple of those effects.
I'm not really against this because, actually, I was thinking about
doing it myself. But then I decided that maybe it should be ok to call
these two functions with a NULL pointer in the same way as it is ok to
call functions like dupstring() with a NULL pointer.
Bye
Sven
--
Sven Wischnowsky wischnow@informatik.hu-berlin.de
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: PATCH: _whois
1999-11-09 8:58 Sven Wischnowsky
1999-11-09 9:09 ` Tanaka Akira
@ 1999-11-09 10:53 ` Bart Schaefer
1 sibling, 0 replies; 6+ messages in thread
From: Bart Schaefer @ 1999-11-09 10:53 UTC (permalink / raw)
To: zsh-workers
On Nov 9, 9:58am, Sven Wischnowsky wrote:
} Subject: Re: PATCH: _whois
}
} (patch-readers will notice that there even is some
} redundancy in this patch, trying to avoid getting this bug again
} later).
I always experience some ambivalence about this sort of thing:
} + if (s) {
} + char *os = s, *p = compqstack;
[...]
} + return (s == os ? dupstring(s) : s);
} }
} - return (s == os ? dupstring(s) : s);
} + return NULL;
} }
}
} /**/
} char *
} tildequote(char *s, int ign)
} {
} - int tilde;
} + if (s) {
} + int tilde;
[...]
} + return s;
} + }
} + return NULL;
} }
On the one hand, it's never good for the shell to crash.
On the other hand, too much of this kind of "defensive programming" can
conceal the actual source of the error, leading to other, more confusing
failures in other places; cause bugs to go unfixed; and slow down the
execution with redundant error checking.
So it would seem to me that there should at least be a DPUTS() in there,
to mitigate the first couple of those effects.
Index: compcore.c
===================================================================
RCS file: /extra/cvsroot/zsh/zsh-3.1/Src/Zle/compcore.c,v
retrieving revision 1.8
diff -c -r1.8 compcore.c
--- compcore.c 1999/11/09 10:48:22 1.8
+++ compcore.c 1999/11/09 10:51:14
@@ -938,6 +938,7 @@
}
return (s == os ? dupstring(s) : s);
}
+ DPUTS(1, "BUG: null pointer in multiquote()");
return NULL;
}
@@ -956,6 +957,7 @@
return s;
}
+ DPUTS(1, "BUG: null pointer in tildequote()");
return NULL;
}
--
Bart Schaefer Brass Lantern Enterprises
http://www.well.com/user/barts http://www.brasslantern.com
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: PATCH: _whois
1999-11-09 8:58 Sven Wischnowsky
@ 1999-11-09 9:09 ` Tanaka Akira
1999-11-09 10:53 ` Bart Schaefer
1 sibling, 0 replies; 6+ messages in thread
From: Tanaka Akira @ 1999-11-09 9:09 UTC (permalink / raw)
To: zsh-workers
In article <199911090858.JAA20837@beta.informatik.hu-berlin.de>,
Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:
> I couldn't reproduce it, but judging from the stack trace, the patch
> should fix this (patch-readers will notice that there even is some
> redundancy in this patch, trying to avoid getting this bug again
> later).
>
> So, does it fix it?
Yes. Thanks.
--
Tanaka Akira
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: PATCH: _whois
@ 1999-11-09 8:58 Sven Wischnowsky
1999-11-09 9:09 ` Tanaka Akira
1999-11-09 10:53 ` Bart Schaefer
0 siblings, 2 replies; 6+ messages in thread
From: Sven Wischnowsky @ 1999-11-09 8:58 UTC (permalink / raw)
To: zsh-workers
Tanaka Akira wrote:
> I modified _whois to complete arguments of fwhois.
>
> And I found a problem.
>
> Z:akr@is27e1u11% Src/zsh -f
> is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
> is27e1u11% compconf group_matches=yes message_format='%d' description_format='%d'
> is27e1u11% compconf describe_options=yes describe_values=yes option_prefix=yes
> is27e1u11% comptag argument='*=1' option='*=2[describe]' glob='*=1' path='*=2' file='*=3'
> is27e1u11% fwhois 'DOMAIN <TAB>
> zsh: segmentation fault (core dumped) Src/zsh -f
>
> (gdb) where
> #0 0xff136d84 in strlen ()
> #1 0xa15d0 in bslashquote (s=0x0, e=0x0, instring=1) at utils.c:3011
> #2 0xff06da80 in multiquote (s=0x0, ign=1) at compcore.c:933
> #3 0xff071348 in addmatches (dat=0xffbe7280, argv=0x1d2634) at compcore.c:1711
> #4 0xff068238 in bin_compadd (name=0x1d24f0 "compadd", argv=0x1d2634,
> ops=0xffbe7388 "", func=0) at complete.c:606
I couldn't reproduce it, but judging from the stack trace, the patch
should fix this (patch-readers will notice that there even is some
redundancy in this patch, trying to avoid getting this bug again
later).
So, does it fix it?
Bye
Sven
diff -u oldsrc/Zle/compcore.c Src/Zle/compcore.c
--- oldsrc/Zle/compcore.c Mon Nov 8 13:29:49 1999
+++ Src/Zle/compcore.c Tue Nov 9 09:11:12 1999
@@ -923,34 +923,40 @@
char *
multiquote(char *s, int ign)
{
- char *os = s, *p = compqstack;
+ if (s) {
+ char *os = s, *p = compqstack;
- if (p && *p && (ign < 1 || p[ign])) {
- if (ign > 0)
- p += ign;
- while (*p) {
- if (ign >= 0 || p[1])
- s = bslashquote(s, NULL,
- (*p == '\'' ? 1 : (*p == '"' ? 2 : 0)));
- p++;
+ if (p && *p && (ign < 1 || p[ign])) {
+ if (ign > 0)
+ p += ign;
+ while (*p) {
+ if (ign >= 0 || p[1])
+ s = bslashquote(s, NULL,
+ (*p == '\'' ? 1 : (*p == '"' ? 2 : 0)));
+ p++;
+ }
}
+ return (s == os ? dupstring(s) : s);
}
- return (s == os ? dupstring(s) : s);
+ return NULL;
}
/**/
char *
tildequote(char *s, int ign)
{
- int tilde;
+ if (s) {
+ int tilde;
- if ((tilde = (*s == '~')))
- *s = 'x';
- s = multiquote(s, ign);
- if (tilde)
- *s = '~';
+ if ((tilde = (*s == '~')))
+ *s = 'x';
+ s = multiquote(s, ign);
+ if (tilde)
+ *s = '~';
- return s;
+ return s;
+ }
+ return NULL;
}
/* Check if we have to complete a parameter name. */
@@ -1708,10 +1714,12 @@
} else if (dat->rems)
dat->rems = dupstring(dat->rems);
- lpre = ((!(dat->aflags & CAF_QUOTE) &&
- (!dat->ppre && (dat->flags & CMF_FILE))) ?
- tildequote(lpre, 1) : multiquote(lpre, 1));
- lsuf = multiquote(lsuf, 1);
+ if (lpre)
+ lpre = ((!(dat->aflags & CAF_QUOTE) &&
+ (!dat->ppre && (dat->flags & CMF_FILE))) ?
+ tildequote(lpre, 1) : multiquote(lpre, 1));
+ if (lsuf)
+ lsuf = multiquote(lsuf, 1);
}
/* Walk through the matches given. */
obpl = bpl;
--
Sven Wischnowsky wischnow@informatik.hu-berlin.de
^ permalink raw reply [flat|nested] 6+ messages in thread
* PATCH: _whois
@ 1999-11-08 22:09 Tanaka Akira
0 siblings, 0 replies; 6+ messages in thread
From: Tanaka Akira @ 1999-11-08 22:09 UTC (permalink / raw)
To: zsh-workers
I modified _whois to complete arguments of fwhois.
And I found a problem.
Z:akr@is27e1u11% Src/zsh -f
is27e1u11% bindkey -e; fpath=($PWD/Completion/*(/)); autoload -U compinit; compinit -D; compdef _tst tst
is27e1u11% compconf group_matches=yes message_format='%d' description_format='%d'
is27e1u11% compconf describe_options=yes describe_values=yes option_prefix=yes
is27e1u11% comptag argument='*=1' option='*=2[describe]' glob='*=1' path='*=2' file='*=3'
is27e1u11% fwhois 'DOMAIN <TAB>
zsh: segmentation fault (core dumped) Src/zsh -f
(gdb) where
#0 0xff136d84 in strlen ()
#1 0xa15d0 in bslashquote (s=0x0, e=0x0, instring=1) at utils.c:3011
#2 0xff06da80 in multiquote (s=0x0, ign=1) at compcore.c:933
#3 0xff071348 in addmatches (dat=0xffbe7280, argv=0x1d2634) at compcore.c:1711
#4 0xff068238 in bin_compadd (name=0x1d24f0 "compadd", argv=0x1d2634,
ops=0xffbe7388 "", func=0) at complete.c:606
...
This may relate to 8588 since _whois use `compset -q'.
Index: Completion/User/_whois
===================================================================
RCS file: /projects/zsh/zsh/Completion/User/_whois,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 _whois
--- Completion/User/_whois 1999/11/02 12:26:46 1.1.1.3
+++ Completion/User/_whois 1999/11/08 22:04:47
@@ -1,8 +1,11 @@
-#compdef whois
+#compdef whois fwhois
_whois () {
_whois_setup
- $_whois_comp
+ case "$0" in
+ fwhois) _whois_fwhois;;
+ *) $_whois_comp;;
+ esac
}
(( $+functions[_whois_setup] )) ||
--
Tanaka Akira
^ permalink raw reply [flat|nested] 6+ messages in thread
* PATCH: _whois
@ 1999-10-16 5:12 Tanaka Akira
0 siblings, 0 replies; 6+ messages in thread
From: Tanaka Akira @ 1999-10-16 5:12 UTC (permalink / raw)
To: zsh-workers
I wrote a completion function for whois.
Since whois has many variant (than telnet), it may not support some
variant. I saw FreeBSD, BSD/OS, SunOS, Slackware and Debian for
reference. At least it doesn't support ripe-whois enough yet.
--- /dev/null Sat Oct 16 12:11:10 1999
+++ Completion/User/_whois Sat Oct 16 14:05:29 1999
@@ -0,0 +1,211 @@
+#compdef whois
+
+_whois () {
+ setopt localoptions extendedglob
+ _whois_setup
+ $_whois_comp
+}
+
+builtin functions _whois_setup >&- ||
+_whois_setup () {
+ (( $+_whois_defaultserver )) ||
+ _whois_defaultserver='whois.internic.net'
+
+ (( $+_whois_servers )) || {
+ typeset -gUa _whois_servers
+ _whois_servers=(
+ $_whois_defaultserver
+ domain-registry.nl
+ is.nic.pw
+ whois.apnic.net:p
+ whois.arin.net:a
+ whois.aunic.net
+ whois.berkeley.edu
+ whois.cdnnet.ca
+ whois.dns.pt
+ whois.funet.fi
+ whois.gb.com
+ whois.gb.net
+ whois.internic.net
+ whois.jpl.nasa.gov
+ whois.nic-se.se
+ whois.nic.ad.jp
+ whois.nic.af
+ whois.nic.as
+ whois.nic.br
+ whois.nic.bt
+ whois.nic.ch
+ whois.nic.cx
+ whois.nic.fr
+ whois.nic.gov:g
+ whois.nic.hm
+ whois.nic.it
+ whois.nic.li
+ whois.nic.lk
+ whois.nic.mil:d
+ whois.nic.mx
+ whois.nic.nu
+ whois.nic.or.kr
+ whois.nic.sh
+ whois.nic.tj
+ whois.nic.tm
+ whois.nic.uk
+ whois.ripe.net:r
+ whois.ripn.net:R
+ whois.sics.se
+ whois.stanford.edu
+ whois.uk.com
+ www.nic.at
+ $(functions -m '_whois:*' |
+ awk '/^undefined _whois:/ {print substr($2,8,length($2)-7)}
+ /^_whois:/ {print substr($1,8,length($1)-7)}')
+ )
+ }
+
+ (( $+_whois_arguments )) || {
+ local help="$(whois </dev/null 2>&1)"
+ local tmp opt opts
+
+ if [[ $help = *"user[@<whois.server>]"* ]]; then
+ _whois_comp=_whois_fwhois
+ elif [[ $help = *(name\ ...|OBJECT...)* ]]; then
+ _whois_comp=_whois_multi
+ else
+ _whois_comp=_whois_single
+ fi
+
+ _whois_arguments=()
+
+ if [[ $help = *"-p PORT"* ]]; then
+ _whois_arguments=("$_whois_arguments[@]"
+ '-p[port]:port:_whois_ports'
+ )
+ fi
+
+ tmp="${(j::)${(@)${(@M)_whois_servers:#*:?}##*:}}"
+ if [[ $help = (#b)*\[-([$tmp]##)\]* ]]; then
+ tmp=(${(s::)match[1]})
+ else
+ tmp=()
+ fi
+
+ if [[ $help = *"-h host"* ]]; then
+ tmp=($tmp h)
+ fi
+
+ for opt in $tmp; do
+ opts=(-${^tmp:#$opt})
+ if (( $#opts )); then opts="($opts)"; else opts=; fi
+ _whois_arguments=("$_whois_arguments[@]"
+ "${opts}-${opt}[${${${(@M)_whois_servers:#*:$opt}%:?}:-specify host}]${(M)${(M)opt:#h}/h/:host:_whois_hosts}"
+ )
+ done
+ }
+}
+
+_whois_single () {
+ local state line expl
+ typeset -A opt_args
+ local tmp host
+
+ _arguments \
+ "$_whois_arguments[@]" \
+ ':identifier:->identifier'
+
+ case "$state" in
+ identifier)
+ if [[ -z "$QIPREFIX" ]]; then
+ compadd -QS '' \'
+ return
+ fi
+ compset -q
+ host="${opt_args[-h]:-$_whois_defaultserver}"
+ for tmp in $_whois_servers; do
+ if [[ $tmp = *:? && $+opt_args[-${tmp##*:}] -ne 0 ]]; then
+ host="${tmp%:?}"
+ break
+ fi
+ done
+ if builtin functions "_whois:$host" >&-; then
+ "_whois:$host" "$expl[@]"
+ else
+ _message "identifier"
+ fi
+ ;;
+ esac
+}
+
+_whois_multi () {
+ local state line expl
+ typeset -A opt_args
+ local tmp host
+
+ _arguments \
+ "$_whois_arguments[@]" \
+ '*::identifier:->identifier'
+
+ case "$state" in
+ identifier)
+ host="${opt_args[-h]:-$_whois_defaultserver}"
+ for tmp in $_whois_servers; do
+ if [[ $tmp = *:? && $+opt_args[-${tmp##*:}] -ne 0 ]]; then
+ host="${tmp%:?}"
+ break
+ fi
+ done
+ if builtin functions "_whois:$host" >&-; then
+ "_whois:$host" "$expl[@]"
+ else
+ _message "identifier"
+ fi
+ ;;
+ esac
+}
+
+_whois_fwhois () {
+ if compset -P '*@'; then
+ _whois_hosts "$@"
+ else
+ if [[ -z "$QIPREFIX" ]]; then
+ compadd -QS '' \'
+ return
+ fi
+ compset -q
+ host="$_whois_defaultserver"
+ if builtin functions "_whois:$host" >&-; then
+ "_whois:$host" "$@"
+ else
+ _message "identifier"
+ fi
+ fi
+}
+
+_whois_hosts () {
+ compadd "$@" \
+ -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' \
+ - ${_whois_servers%:?} || _hosts "$@"
+}
+
+_whois_ports () {
+ compadd "$@" - whois || _ports "$@"
+}
+
+builtin functions _whois:whois.internic.net >&- ||
+_whois:whois.internic.net () {
+ if (( CURRENT == 1 )); then
+ compadd HELP DOMAIN HOST
+ else
+ _message 'string'
+ fi
+}
+
+builtin functions _whois:whois.nic.ad.jp >&- ||
+_whois:whois.nic.ad.jp () {
+ if (( CURRENT == 1 )); then
+ compadd HELP DOM NET HOST PERSON CONN COM
+ else
+ _message 'string'
+ fi
+}
+
+_whois "$@"
--
Tanaka Akira
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~1999-11-09 11:01 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-11-09 11:01 PATCH: _whois Sven Wischnowsky
-- strict thread matches above, loose matches on Subject: below --
1999-11-09 8:58 Sven Wischnowsky
1999-11-09 9:09 ` Tanaka Akira
1999-11-09 10:53 ` Bart Schaefer
1999-11-08 22:09 Tanaka Akira
1999-10-16 5:12 Tanaka Akira
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).