Subject: memcpy segfaults
To: None <current-users@netbsd.org>
From: Mike Cheponis <mac@Wireless.Com>
List: current-users
Date: 02/03/2000 22:51:08
I'm trying a simple program on 1.4P to mmap() some files and do a copy.
The code is below. gdb says:
Program received signal SIGSEGV, Segmentation fault.
0x480cba66 in memcpy ()
It's invoked like this: copyfile copyfile.c foo.c
(thus, trying to copy itself)
This program also seg faults on RH linux gcc 2.7.2.3
It works fine on bsd/os 4.01 with gcc 2.7.2.1
I'm probably doing something stupid.
Thanks as usual for help! -Mike
/*
* copyfile.c from unix system programming
*/
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
main(int argc, char **argv){
int input, output;
size_t filesize;
void *source, *target;
char endchar = '\0';
/* Check that the correct # of parameters have been passed */
if(argc != 3){
fprintf(stderr,"usage: copyfile source target\n");
exit(1);
}
/* Open both files */
if( (input = open(argv[1], O_RDONLY)) == -1){
fprintf(stderr, "Error opening input file %s\n", argv[1]);
exit(1);
}
if( (output = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0666)) == -1){
fprintf(stderr, "Error opening output file %s\n", argv[2]);
exit(2);
}/* Note that the input file is automatically closed when exiting */
/*Create 2nd file as same size as first file */
filesize = lseek(input, 0, SEEK_END);
lseek(output, filesize-1, SEEK_SET);
write(output, &endchar, 1);
/* memory map both input and output files */
if( (source = mmap(0, filesize, PROT_READ, MAP_SHARED, input, 0)) ==
(void *)-1){
fprintf(stderr,"Error mapping input file %s\n", argv[1]);
exit(1);
}
if( (target = mmap(0, filesize, PROT_WRITE, MAP_SHARED, output, 0)) ==
(void *)-1){
fprintf(stderr,"Error mapping output file %s\n", argv[2]);
exit(2);
}
/* copy */
memcpy(target, source, filesize);
/* Unmap files */
munmap(source, filesize);
munmap(target, filesize);
exit(0);/* both files will be closed upon exit automatically by OS */
}