bug fix, and made more robust

This commit is contained in:
ceriel 1987-05-21 13:43:56 +00:00
parent 6ac092bf38
commit 02ae5e4d7c

View file

@ -37,7 +37,7 @@ struct ranlib tab[TABSZ];
long tnum = 0; long tnum = 0;
char tstrtab[STRTABSZ]; char tstrtab[STRTABSZ];
long tssiz = 0; long tssiz = 0;
char *malloc(), *strcpy(); char *malloc(), *strcpy(), *strncpy();
long tell(); long tell();
long time(); long time();
#endif AAL #endif AAL
@ -444,22 +444,25 @@ extract(member)
register MEMBER *member; register MEMBER *member;
{ {
int fd = 1; int fd = 1;
char buf[sizeof(member->ar_name) + 1];
if (pr_fl == FALSE && (fd = creat(member->ar_name, 0644)) < 0) { strncpy(buf, member->ar_name, sizeof(member->ar_name));
error(FALSE, "cannot create %s\n", member->ar_name); buf[sizeof(member->ar_name)] = 0;
return; if (pr_fl == FALSE && (fd = creat(buf, 0644)) < 0) {
error(FALSE, "cannot create %s\n", buf);
fd = -1;
} }
if (verbose) { if (verbose) {
if (pr_fl == FALSE) show("x - %s\n", member->ar_name); if (pr_fl == FALSE) show("x - %s\n", buf);
else show("\n<%s>\n\n", member->ar_name); else show("\n<%s>\n\n", buf);
} }
copy_member(member, ar_fd, fd, 1); copy_member(member, ar_fd, fd, 1);
if (fd != 1) if (fd >= 0 && fd != 1)
close(fd); close(fd);
if (pr_fl == FALSE) chmod(member->ar_name, member->ar_mode); if (pr_fl == FALSE) chmod(buf, member->ar_mode);
} }
copy_member(member, from, to, extracting) copy_member(member, from, to, extracting)
@ -481,15 +484,20 @@ int from, to;
#endif #endif
do { do {
rest = mem_size > (long) IO_SIZE ? IO_SIZE : (int) mem_size; rest = mem_size > (long) IO_SIZE ? IO_SIZE : (int) mem_size;
if (read(from, io_buffer, rest) != rest) if (read(from, io_buffer, rest) != rest) {
error(TRUE, "read error on %s\n", member->ar_name); char buf[sizeof(member->ar_name) + 1];
mwrite(to, io_buffer, rest);
strncpy(buf, member->ar_name, sizeof(member->ar_name));
buf[sizeof(member->ar_name)] = 0;
error(TRUE, "read error on %s\n", buf);
}
if (to >= 0) mwrite(to, io_buffer, rest);
mem_size -= (long) rest; mem_size -= (long) rest;
} while (mem_size != 0L); } while (mem_size != 0L);
if (is_odd) { if (is_odd) {
lseek(from, 1L, 1); lseek(from, 1L, 1);
if (! extracting) if (to >= 0 && ! extracting)
lseek(to, 1L, 1); lseek(to, 1L, 1);
} }
} }