From owner-freebsd-bugs Sun Jan 19 18:23:24 1997 Return-Path: Received: (from root@localhost) by freefall.freebsd.org (8.8.4/8.8.4) id SAA05503 for bugs-outgoing; Sun, 19 Jan 1997 18:23:24 -0800 (PST) Received: from pat.idt.unit.no (0@pat.idt.unit.no [129.241.103.5]) by freefall.freebsd.org (8.8.4/8.8.4) with ESMTP id SAA05498 for ; Sun, 19 Jan 1997 18:23:20 -0800 (PST) Received: from idt.unit.no (tegge@ikke.idt.unit.no [129.241.111.65]) by pat.idt.unit.no (8.8.4/8.8.4) with ESMTP id DAA17675; Mon, 20 Jan 1997 03:22:52 +0100 (MET) Message-Id: <199701200222.DAA17675@pat.idt.unit.no> To: lucifer@maths.uq.oz.au Cc: freebsd-bugs@freefall.freebsd.org Subject: Re: bin/2446: Problem in interactive restore. In-Reply-To: Your message of "Sat, 11 Jan 1997 19:30:06 -0800 (PST)" References: <199701120330.TAA28001@freefall.freebsd.org> X-Mailer: Mew version 1.06 on Emacs 19.33.1 Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Date: Mon, 20 Jan 1997 03:22:51 +0100 From: Tor Egge Sender: owner-bugs@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk > The following reply was made to PR bin/2446; it has been noted by GNATS. > > From: David Conran > To: joerg_wunsch@uriah.heep.sax.de > Cc: lucifer@xyzzy.net.au, FreeBSD-gnats-submit@freebsd.org > Subject: Re: bin/2446: Problem in interactive restore. > Date: Sun, 12 Jan 1997 13:24:06 +1000 (EST) > > J Wunsch writes ... > > > > As David Conran wrote: > > > > > orac:/tmp$ restore ivf /dev/nrst1 > > > Verify tape and initialize maps > > > Tape block size is 32 > > > Dump date: Mon Jan 6 00:39:10 1997 > > > Dumped from: the epoch > > > Level 0 dump of /usr on orac.xyzzy.net.au:/dev/sd0e > > > Label: none > > > Extract directories from tape > > > Initialize symbol table. > > > restore > cd include > > > canonname: not enough bufferspace > > > > Can you perhaps track this with gdb? Interactive restore works fine > > for me (and worked all the time), so i probably have a hard time to > > reproduce this. > > > > (Hint: send followups to your PR to freebsd-gnats-submit@freebsd.org, > > using the same subject.) > > Well .. I just re-suped and recompiled restore .. and did it off a very > recent (ie. 3.0-current) dump > > I am no gdb expert .. so .. here is my stuff. > (if there is something else to do .. let me know.) > Thanks. I recently experienced the same problem with 3.0-current. Here is a patch that worked for me. This patch also adds some more byteswapping when restoring a backup made with a bigendian system. This is needed to avoid treating level 1 dumps as level 16777216 dumps. - Tor Egge ------- Index: interactive.c =================================================================== RCS file: /usr/cvs/src/sbin/restore/interactive.c,v retrieving revision 1.2 diff -c -r1.2 interactive.c *** interactive.c 1997/01/01 14:08:45 1.2 --- interactive.c 1997/01/20 01:43:36 *************** *** 82,88 **** static char *copynext __P((char *, char *)); static int fcmp __P((const void *, const void *)); static void formatf __P((struct afile *, int)); ! static void getcmd __P((char *, char *, char *, struct arglist *)); struct dirent *glob_readdir __P((RST_DIR *dirp)); static int glob_stat __P((const char *, struct stat *)); static void mkentry __P((struct direct *, struct afile *)); --- 82,88 ---- static char *copynext __P((char *, char *)); static int fcmp __P((const void *, const void *)); static void formatf __P((struct afile *, int)); ! static void getcmd __P((char *, char *, char *, size_t, struct arglist *)); struct dirent *glob_readdir __P((RST_DIR *dirp)); static int glob_stat __P((const char *, struct stat *)); static void mkentry __P((struct direct *, struct afile *)); *************** *** 121,127 **** volno = 0; } runshell = 1; ! getcmd(curdir, cmd, name, &arglist); switch (cmd[0]) { /* * Add elements to the extraction list. --- 121,127 ---- volno = 0; } runshell = 1; ! getcmd(curdir, cmd, name, sizeof(name), &arglist); switch (cmd[0]) { /* * Add elements to the extraction list. *************** *** 300,307 **** * eliminate any embedded ".." components. */ static void ! getcmd(curdir, cmd, name, ap) char *curdir, *cmd, *name; struct arglist *ap; { register char *cp; --- 300,308 ---- * eliminate any embedded ".." components. */ static void ! getcmd(curdir, cmd, name, namelen, ap) char *curdir, *cmd, *name; + size_t namelen; struct arglist *ap; { register char *cp; *************** *** 357,363 **** * If it is an absolute pathname, canonicalize it and return it. */ if (rawname[0] == '/') { ! canon(rawname, name, sizeof(name)); } else { /* * For relative pathnames, prepend the current directory to --- 358,364 ---- * If it is an absolute pathname, canonicalize it and return it. */ if (rawname[0] == '/') { ! canon(rawname, name, namelen); } else { /* * For relative pathnames, prepend the current directory to *************** *** 366,372 **** (void) strcpy(output, curdir); (void) strcat(output, "/"); (void) strcat(output, rawname); ! canon(output, name, sizeof(name)); } if (glob(name, GLOB_ALTDIRFUNC, NULL, &ap->glob) < 0) fprintf(stderr, "%s: out of memory\n", ap->cmd); --- 367,373 ---- (void) strcpy(output, curdir); (void) strcat(output, "/"); (void) strcat(output, rawname); ! canon(output, name, namelen); } if (glob(name, GLOB_ALTDIRFUNC, NULL, &ap->glob) < 0) fprintf(stderr, "%s: out of memory\n", ap->cmd); Index: tape.c =================================================================== RCS file: /usr/cvs/src/sbin/restore/tape.c,v retrieving revision 1.6 diff -c -r1.6 tape.c *** tape.c 1997/01/01 14:08:47 1.6 --- tape.c 1997/01/20 01:44:37 *************** *** 1022,1029 **** } if (checksum((int *)buf) == FAIL) return (FAIL); ! if (Bcvt) swabst((u_char *)"8l4s31l", (u_char *)buf); goto good; } readtape((char *)(&u_ospcl.s_ospcl)); --- 1022,1032 ---- } if (checksum((int *)buf) == FAIL) return (FAIL); ! if (Bcvt) { swabst((u_char *)"8l4s31l", (u_char *)buf); + swabst((u_char *)"l",(u_char *) &buf->c_level); + swabst((u_char *)"2l",(u_char *) &buf->c_flags); + } goto good; } readtape((char *)(&u_ospcl.s_ospcl)); ------