Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

rn--first blood.

7 views
Skip to first unread message

Larry Wall

unread,
Sep 25, 1984, 7:55:08 PM9/25/84
to
Well, I've broken the pattern. I distributed rn last night, and I didn't find
a single bug. Nope, someone else found them, and there were two of them.
Oh well, c'est la vie. The first one is especially important because it
can mung the references line on posted articles.

I think nasty bugs must hide when they smell a distribution coming. The only
way to exterminate them is to distribute and then start stomping.

Larry Wall
{allegra,burdvax,cbosgd,hplabs,ihnp4,sdcsvax}!sdcrdcf!lwall
----------------------------------------------------------------------------
rn bug #1:

Subject: %i and %R use old Article-I.D. line
Index: intrp.c

Description:
Rn uses the old Article-I.D. line instead of the new Message-ID line
when interpolating %i or %R. I didn't notice this before because
we just now recompiled inews without the OLD header lines.

Repeat-By:
Just post a followup article on a system without OLD header lines.
The references line will be missing the current message id, and
the ATTRIBUTION line will start "In article <>..."

Fix: Install either intrp.cpat (-c form) by hand or intrp.epat (-e form)
using ed. These files are in the shar script below.

--------------------------------------------------------------------------
rn bug #2:

Subject: rn may get confused about minimum article numbers
Index: rcstuff.c

Description:
The relocate_newsgroup() routine did not correctly adjust the
abs1st array, which stores minimum article numbers. This can
manifest itself in several ways, such as spurious "Corrupt Xref"
messages, and newsgroups that seem to be missing their articles.
The problem does not show up unless you have CACHEFIRST defined,
and newsgroups are added or moved to or from the beginning of the
.newsrc.

Repeat-By:
Move or add some newsgroups to the front of your .newsrc, and then
read news for a while. Sooner or later, it'll get you.

Fix: Install either rcstuff.cpat (-c form) by hand or rcstuff.epat (-e form)
using ed. These files are in the shar script below.

--------------------------------------------------------------------------
#! /bin/sh
echo Extracting intrp.cpat
cat >intrp.cpat <<'!STUFFY!FUNK!'
*** /tmp/,RCSt1014172 Tue Sep 25 14:12:06 1984
--- /tmp/,RCSt2014172 Tue Sep 25 14:12:16 1984
***************
*** 1,4
! /* $Header: intrp.c,v 4.1 84/09/24 11:57:13 lwall Exp $
*
* $Log: intrp.c,v $
* Revision 4.1 84/09/24 11:57:13 lwall

--- 1,4 -----
! /* $Header: intrp.c,v 4.1.1.2 84/09/25 14:02:08 lwall Exp $
*
* $Log: intrp.c,v $
* Revision 4.1.1.2 84/09/25 14:02:08 lwall
***************
*** 1,6
/* $Header: intrp.c,v 4.1 84/09/24 11:57:13 lwall Exp $
*
* $Log: intrp.c,v $
* Revision 4.1 84/09/24 11:57:13 lwall
* Real baseline.
*

--- 1,12 -----
/* $Header: intrp.c,v 4.1.1.2 84/09/25 14:02:08 lwall Exp $
*
* $Log: intrp.c,v $
+ * Revision 4.1.1.2 84/09/25 14:02:08 lwall
+ * %i used ARTID_LINE, should be MESSID_LINE.
+ *
+ * Revision 4.1.1.1 84/09/25 13:22:59 lwall
+ * Branch for sdcrdcf changes.
+ *
* Revision 4.1 84/09/24 11:57:13 lwall
* Real baseline.
*
***************
*** 489,495
break;
case 'i':
if (!(s=artid_buf))
! s = artid_buf = fetchlines(art,ARTID_LINE);
if (*s != '<') {
sprintf(scrbuf,"<%s>",artid_buf);
s = scrbuf;

--- 495,501 -----
break;
case 'i':
if (!(s=artid_buf))
! s = artid_buf = fetchlines(art,MESSID_LINE);
if (*s != '<') {
sprintf(scrbuf,"<%s>",artid_buf);
s = scrbuf;
***************
*** 566,572
else
*scrbuf = '\0';
if (!artid_buf)
! artid_buf = fetchlines(art,ARTID_LINE);
if (artid_buf[0] == '<')
safecat(scrbuf,artid_buf,sizeof(scrbuf));
else {

--- 572,578 -----
else
*scrbuf = '\0';
if (!artid_buf)
! artid_buf = fetchlines(art,MESSID_LINE);
if (artid_buf[0] == '<')
safecat(scrbuf,artid_buf,sizeof(scrbuf));
else {
!STUFFY!FUNK!
echo Extracting intrp.epat
sed >intrp.epat <<'!STUFFY!FUNK!' -e 's/X//'
X569c
X artid_buf = fetchlines(art,MESSID_LINE);
X.
X492c
X s = artid_buf = fetchlines(art,MESSID_LINE);
X.
X3a
X * Revision 4.1.1.2 84/09/25 14:02:08 lwall
X * %i used ARTID_LINE, should be MESSID_LINE.
X *
X * Revision 4.1.1.1 84/09/25 13:22:59 lwall
X * Branch for sdcrdcf changes.
X *
X.
X1c
X/* $Header: intrp.c,v 4.1.1.2 84/09/25 14:02:08 lwall Exp $
X.
!STUFFY!FUNK!
echo Extracting rcstuff.cpat
cat >rcstuff.cpat <<'!STUFFY!FUNK!'
*** /tmp/,RCSt1014132 Tue Sep 25 14:10:40 1984
--- /tmp/,RCSt2014132 Tue Sep 25 14:11:02 1984
***************
*** 1,4
! /* $Header: rcstuff.c,v 4.1 84/09/24 12:05:08 lwall Exp $
*
* $Log: rcstuff.c,v $
* Revision 4.1 84/09/24 12:05:08 lwall

--- 1,4 -----
! /* $Header: rcstuff.c,v 4.1.1.2 84/09/25 13:58:26 lwall Exp $
*
* $Log: rcstuff.c,v $
* Revision 4.1.1.2 84/09/25 13:58:26 lwall
***************
*** 1,6
/* $Header: rcstuff.c,v 4.1 84/09/24 12:05:08 lwall Exp $
*
* $Log: rcstuff.c,v $
* Revision 4.1 84/09/24 12:05:08 lwall
* Real baseline.
*

--- 1,13 -----
/* $Header: rcstuff.c,v 4.1.1.2 84/09/25 13:58:26 lwall Exp $
*
* $Log: rcstuff.c,v $
+ * Revision 4.1.1.2 84/09/25 13:58:26 lwall
+ * Oops, relocate_newsgroup() didn't relocate abs1st[]. One of these years
+ * I'll make the newsgroup entry a struct...
+ *
+ * Revision 4.1.1.1 84/09/25 13:25:43 lwall
+ * Branch for sdcrdcf changes.
+ *
* Revision 4.1 84/09/24 12:05:08 lwall
* Real baseline.
*
***************
*** 389,394
#ifdef DEBUGGING
ART_NUM tmpngmax;
#endif

starthere = 0; /* Disable this optimization */
writesoft = TRUE; /* Update soft pointer file */

--- 396,404 -----
#ifdef DEBUGGING
ART_NUM tmpngmax;
#endif
+ #ifdef CACHEFIRST
+ ART_NUM tmpabs1st;
+ #endif

starthere = 0; /* Disable this optimization */
writesoft = TRUE; /* Update soft pointer file */
***************
*** 409,414
#ifdef DEBUGGING
tmpngmax = ngmax[ngx];
#endif
for (i=ngx+1; i<nextrcline; i++) {
rcline[i-1] = rcline[i];
toread[i-1] = toread[i];

--- 419,427 -----
#ifdef DEBUGGING
tmpngmax = ngmax[ngx];
#endif
+ #ifdef CACHEFIRST
+ tmpabs1st = abs1st[ngx];
+ #endif
for (i=ngx+1; i<nextrcline; i++) {
rcline[i-1] = rcline[i];
toread[i-1] = toread[i];
***************
*** 418,423
#ifdef DEBUGGING
ngmax[i-1] = ngmax[i];
#endif
}
rcline[nextrcline-1] = tmprcline;
toread[nextrcline-1] = tmptoread;

--- 431,439 -----
#ifdef DEBUGGING
ngmax[i-1] = ngmax[i];
#endif
+ #ifdef CACHEFIRST
+ abs1st[i-1] = abs1st[i];
+ #endif
}
rcline[nextrcline-1] = tmprcline;
toread[nextrcline-1] = tmptoread;
***************
*** 427,432
#ifdef DEBUGGING
ngmax[nextrcline-1] = tmpngmax;
#endif
}
if (current_ng > ngx)
current_ng--;

--- 443,451 -----
#ifdef DEBUGGING
ngmax[nextrcline-1] = tmpngmax;
#endif
+ #ifdef CACHEFIRST
+ abs1st[nextrcline-1] = tmpabs1st;
+ #endif
}
if (current_ng > ngx)
current_ng--;
***************
*** 545,550
#ifdef DEBUGGING
tmpngmax = ngmax[nextrcline-1];
#endif
for (i=nextrcline-2; i>=newng; i--) {
rcline[i+1] = rcline[i];
toread[i+1] = toread[i];

--- 564,572 -----
#ifdef DEBUGGING
tmpngmax = ngmax[nextrcline-1];
#endif
+ #ifdef CACHEFIRST
+ tmpabs1st = abs1st[nextrcline-1];
+ #endif
for (i=nextrcline-2; i>=newng; i--) {
rcline[i+1] = rcline[i];
toread[i+1] = toread[i];
***************
*** 554,559
#ifdef DEBUGGING
ngmax[i+1] = ngmax[i];
#endif
}
rcline[newng] = tmprcline;
toread[newng] = tmptoread;

--- 576,584 -----
#ifdef DEBUGGING
ngmax[i+1] = ngmax[i];
#endif
+ #ifdef CACHEFIRST
+ abs1st[i+1] = abs1st[i];
+ #endif
}
rcline[newng] = tmprcline;
toread[newng] = tmptoread;
***************
*** 562,567
softptr[newng] = tmpsoftptr;
#ifdef DEBUGGING
ngmax[newng] = tmpngmax;
#endif
}
if (current_ng >= newng)

--- 587,595 -----
softptr[newng] = tmpsoftptr;
#ifdef DEBUGGING
ngmax[newng] = tmpngmax;
+ #endif
+ #ifdef CACHEFIRST
+ abs1st[newng] = tmpabs1st;
#endif
}
if (current_ng >= newng)
!STUFFY!FUNK!
echo Extracting rcstuff.epat
sed >rcstuff.epat <<'!STUFFY!FUNK!' -e 's/X//'
X564a
X#endif
X#ifdef CACHEFIRST
X abs1st[newng] = tmpabs1st;
X.
X556a
X#ifdef CACHEFIRST
X abs1st[i+1] = abs1st[i];
X#endif
X.
X547a
X#ifdef CACHEFIRST
X tmpabs1st = abs1st[nextrcline-1];
X#endif
X.
X429a
X#ifdef CACHEFIRST
X abs1st[nextrcline-1] = tmpabs1st;
X#endif
X.
X420a
X#ifdef CACHEFIRST
X abs1st[i-1] = abs1st[i];
X#endif
X.
X411a
X#ifdef CACHEFIRST
X tmpabs1st = abs1st[ngx];
X#endif
X.
X391a
X#ifdef CACHEFIRST
X ART_NUM tmpabs1st;
X#endif
X.
X3a
X * Revision 4.1.1.2 84/09/25 13:58:26 lwall
X * Oops, relocate_newsgroup() didn't relocate abs1st[]. One of these years
X * I'll make the newsgroup entry a struct...
X *
X * Revision 4.1.1.1 84/09/25 13:25:43 lwall
X * Branch for sdcrdcf changes.
X *
X.
X1c
X/* $Header: rcstuff.c,v 4.1.1.2 84/09/25 13:58:26 lwall Exp $
X.
!STUFFY!FUNK!
echo ""
echo "End of patches"
: I do not append .signature, but someone might mail this.
exit

0 new messages